Use self_pipe for close_signal
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
#include "ioutil.h"
|
||||
#include "bitset.h"
|
||||
#include "nbdtypes.h"
|
||||
#include "self_pipe.h"
|
||||
|
||||
|
||||
#include <sys/mman.h>
|
||||
@@ -119,11 +120,11 @@ int client_read_request( struct client * client , struct nbd_request *out_reques
|
||||
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(client->socket, &fds);
|
||||
FD_SET(client->serve->close_signal[0], &fds);
|
||||
self_pipe_fd_set( client->serve->close_signal, &fds );
|
||||
CLIENT_ERROR_ON_FAILURE(select(FD_SETSIZE, &fds, NULL, NULL, NULL),
|
||||
"select() failed");
|
||||
|
||||
if (FD_ISSET(client->serve->close_signal[0], &fds))
|
||||
if ( self_pipe_fd_isset( client->serve->close_signal, &fds ) )
|
||||
return 0;
|
||||
|
||||
if (readloop(client->socket, &request_raw, sizeof(request_raw)) == -1) {
|
||||
|
@@ -31,6 +31,7 @@
|
||||
#include "parse.h"
|
||||
#include "readwrite.h"
|
||||
#include "bitset.h"
|
||||
#include "self_pipe.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -141,7 +142,7 @@ void* mirror_runner(void* serve_params_uncast)
|
||||
break;
|
||||
case ACTION_EXIT:
|
||||
debug("exit!");
|
||||
write(serve->close_signal[1], serve, 1); /* any byte will do */
|
||||
serve_signal_close( serve );
|
||||
/* fall through */
|
||||
case ACTION_NOTHING:
|
||||
debug("nothing!");
|
||||
@@ -261,14 +262,14 @@ int control_mirror(struct control_params* client, int linesc, char** lines)
|
||||
/** Command parser to alter access control list from socket input */
|
||||
int control_acl(struct control_params* client, int linesc, char** lines)
|
||||
{
|
||||
int parsed;
|
||||
int parsedc;
|
||||
struct ip_and_mask (*acl)[], (*old_acl)[];
|
||||
|
||||
parsed = parse_acl(&acl, linesc, lines);
|
||||
if (parsed != linesc) {
|
||||
parsedc = parse_acl(&acl, linesc, lines);
|
||||
if (parsedc != linesc) {
|
||||
write(client->socket, "1: bad spec: ", 13);
|
||||
write(client->socket, lines[parsed],
|
||||
strlen(lines[parsed]));
|
||||
write(client->socket, lines[parsedc],
|
||||
strlen(lines[parsedc]));
|
||||
write(client->socket, "\n", 1);
|
||||
free(acl);
|
||||
}
|
||||
|
22
src/serve.c
22
src/serve.c
@@ -5,6 +5,7 @@
|
||||
#include "util.h"
|
||||
#include "bitset.h"
|
||||
#include "control.h"
|
||||
#include "self_pipe.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
@@ -250,14 +251,14 @@ void serve_accept_loop(struct server* params)
|
||||
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(params->server_fd, &fds);
|
||||
FD_SET(params->close_signal[0], &fds);
|
||||
self_pipe_fd_set( params->close_signal, &fds );
|
||||
if (params->control_socket_name)
|
||||
FD_SET(params->control_fd, &fds);
|
||||
|
||||
SERVER_ERROR_ON_FAILURE(select(FD_SETSIZE, &fds,
|
||||
NULL, NULL, NULL), "select() failed");
|
||||
|
||||
if (FD_ISSET(params->close_signal[0], &fds))
|
||||
if ( self_pipe_fd_isset( params->close_signal, &fds) )
|
||||
return;
|
||||
|
||||
activity_fd = FD_ISSET(params->server_fd, &fds) ? params->server_fd:
|
||||
@@ -298,6 +299,14 @@ void serve_init_allocation_map(struct server* params)
|
||||
close(fd);
|
||||
}
|
||||
|
||||
|
||||
/* Tell the server to close all the things. */
|
||||
void serve_signal_close( struct server * serve )
|
||||
{
|
||||
self_pipe_signal( serve->close_signal );
|
||||
}
|
||||
|
||||
|
||||
/** Closes sockets, frees memory and waits for all client threads to finish */
|
||||
void serve_cleanup(struct server* params)
|
||||
{
|
||||
@@ -314,8 +323,9 @@ void serve_cleanup(struct server* params)
|
||||
pthread_mutex_destroy(¶ms->l_io);
|
||||
if (params->proxy_fd);
|
||||
close(params->proxy_fd);
|
||||
close(params->close_signal[0]);
|
||||
close(params->close_signal[1]);
|
||||
|
||||
self_pipe_destroy( params->close_signal );
|
||||
|
||||
free(params->block_allocation_map);
|
||||
|
||||
if (params->mirror)
|
||||
@@ -336,7 +346,9 @@ void do_serve(struct server* params)
|
||||
{
|
||||
pthread_mutex_init(¶ms->l_accept, NULL);
|
||||
pthread_mutex_init(¶ms->l_io, NULL);
|
||||
SERVER_ERROR_ON_FAILURE(pipe(params->close_signal) , "pipe failed");
|
||||
|
||||
params->close_signal = self_pipe_create();
|
||||
if ( NULL == params->close_signal) { SERVER_ERROR( "pipe failed" ); }
|
||||
|
||||
serve_open_server_socket(params);
|
||||
serve_open_control_socket(params);
|
||||
|
@@ -70,7 +70,7 @@ struct server {
|
||||
int proxy_fd;
|
||||
|
||||
/** to interrupt accept loop and clients, write() to close_signal[1] */
|
||||
int close_signal[2];
|
||||
struct self_pipe * close_signal;
|
||||
|
||||
struct mirror_status* mirror;
|
||||
int server_fd;
|
||||
@@ -84,6 +84,7 @@ struct server {
|
||||
|
||||
int server_detect_closed(struct server* serve);
|
||||
void server_dirty(struct server *serve, off64_t from, int len);
|
||||
void serve_signal_close( struct server *serve );
|
||||
|
||||
|
||||
struct mode_readwrite_params {
|
||||
|
Reference in New Issue
Block a user