version 1.140, 2015/10/11 00:26:23 |
version 1.141, 2015/10/22 10:46:24 |
|
|
struct clients clients; |
struct clients clients; |
|
|
int server_fd; |
int server_fd; |
int server_shutdown; |
int server_exit; |
struct event server_ev_accept; |
struct event server_ev_accept; |
|
|
struct session *marked_session; |
struct session *marked_session; |
|
|
|
|
int server_create_socket(void); |
int server_create_socket(void); |
void server_loop(void); |
void server_loop(void); |
int server_should_shutdown(void); |
int server_should_exit(void); |
void server_send_shutdown(void); |
void server_send_exit(void); |
void server_accept_callback(int, short, void *); |
void server_accept_callback(int, short, void *); |
void server_signal_callback(int, short, void *); |
void server_signal_callback(int, short, void *); |
void server_child_signal(void); |
void server_child_signal(void); |
|
|
void |
void |
server_loop(void) |
server_loop(void) |
{ |
{ |
while (!server_should_shutdown()) { |
while (!server_should_exit()) { |
log_debug("event dispatch enter"); |
log_debug("event dispatch enter"); |
event_loop(EVLOOP_ONCE); |
event_loop(EVLOOP_ONCE); |
log_debug("event dispatch exit"); |
log_debug("event dispatch exit"); |
|
|
|
|
/* Check if the server should exit (no more clients or sessions). */ |
/* Check if the server should exit (no more clients or sessions). */ |
int |
int |
server_should_shutdown(void) |
server_should_exit(void) |
{ |
{ |
struct client *c; |
struct client *c; |
|
|
|
|
return (1); |
return (1); |
} |
} |
|
|
/* Shutdown the server by killing all clients and windows. */ |
/* Exit the server by killing all clients and windows. */ |
void |
void |
server_send_shutdown(void) |
server_send_exit(void) |
{ |
{ |
struct client *c, *c1; |
struct client *c, *c1; |
struct session *s, *s1; |
struct session *s, *s1; |
|
|
if (c->flags & (CLIENT_BAD|CLIENT_SUSPENDED)) |
if (c->flags & (CLIENT_BAD|CLIENT_SUSPENDED)) |
server_client_lost(c); |
server_client_lost(c); |
else |
else |
server_write_client(c, MSG_SHUTDOWN, NULL, 0); |
server_write_client(c, MSG_EXIT, NULL, 0); |
c->session = NULL; |
c->session = NULL; |
} |
} |
|
|
|
|
} |
} |
fatal("accept failed"); |
fatal("accept failed"); |
} |
} |
if (server_shutdown) { |
if (server_exit) { |
close(newfd); |
close(newfd); |
return; |
return; |
} |
} |
|
|
|
|
switch (sig) { |
switch (sig) { |
case SIGTERM: |
case SIGTERM: |
server_shutdown = 1; |
server_exit = 1; |
server_send_shutdown(); |
server_send_exit(); |
break; |
break; |
case SIGCHLD: |
case SIGCHLD: |
server_child_signal(); |
server_child_signal(); |