Use self_pipe for close_signal

This commit is contained in:
Alex Young
2012-06-06 12:41:03 +01:00
parent 457987664a
commit 339e766339
4 changed files with 29 additions and 14 deletions

View File

@@ -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) {

View File

@@ -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);
}

View File

@@ -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(&params->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(&params->l_accept, NULL);
pthread_mutex_init(&params->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);

View File

@@ -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 {