diff options
| author | Franklin Wei <git@fwei.tk> | 2016-01-17 20:15:31 -0500 |
|---|---|---|
| committer | Franklin Wei <git@fwei.tk> | 2016-01-17 20:15:31 -0500 |
| commit | 7c98d81dafd9b8bc8745d897603a424aee328c1c (patch) | |
| tree | 01986b70644af5a80f963fcfc8d99b5239d6718d /src/server_reqs.c | |
| parent | 9a98c157ebdc6e400f076485a4d78e9026ea1a16 (diff) | |
| download | netcosm-7c98d81dafd9b8bc8745d897603a424aee328c1c.zip netcosm-7c98d81dafd9b8bc8745d897603a424aee328c1c.tar.gz netcosm-7c98d81dafd9b8bc8745d897603a424aee328c1c.tar.bz2 netcosm-7c98d81dafd9b8bc8745d897603a424aee328c1c.tar.xz | |
rewrite message-passing, no signals needed!
Diffstat (limited to 'src/server_reqs.c')
| -rw-r--r-- | src/server_reqs.c | 94 |
1 files changed, 20 insertions, 74 deletions
diff --git a/src/server_reqs.c b/src/server_reqs.c index 01e8e16..a17f333 100644 --- a/src/server_reqs.c +++ b/src/server_reqs.c @@ -27,6 +27,7 @@ static volatile sig_atomic_t num_acks_wanted, num_acks_recvd, inc_acks = 0; static void send_packet(struct child_data *child, unsigned char cmd, void *data, size_t datalen) { + assert(datalen < MSG_MAX); unsigned char pkt[MSG_MAX]; pkt[0] = cmd; if(datalen) @@ -40,10 +41,6 @@ static void req_pass_msg(unsigned char *data, size_t datalen, (void) sender; send_packet(child, REQ_BCASTMSG, data, datalen); - - union sigval nothing = { 0 }; - sigqueue(child->pid, SIGRTMIN, nothing); - ++num_acks_wanted; } static void req_send_clientinfo(unsigned char *data, size_t datalen, @@ -81,14 +78,9 @@ static void req_change_state(unsigned char *data, size_t datalen, { (void) data; (void) datalen; (void) child; (void) sender; if(datalen == sizeof(sender->state)) - { sender->state = *((int*)data); - debugf("State changed to %d\n", sender->state); - } else - { debugf("State data is of the wrong size %*s\n", datalen, data); - } } static void req_change_user(unsigned char *data, size_t datalen, @@ -115,11 +107,7 @@ static void req_kick_client(unsigned char *data, size_t datalen, { pid_t kicked_pid = *((pid_t*)data); if(kicked_pid == child->pid) - { send_packet(child, REQ_BCASTMSG, data + sizeof(pid_t), datalen - sizeof(pid_t)); - union sigval nothing = { 0 }; - sigqueue(child->pid, SIGRTMIN, nothing); - } } } @@ -172,16 +160,14 @@ static void req_move_room(unsigned char *data, size_t datalen, struct child_data /* TODO: checking */ sig_debugf("Moving in direction %d\n", dir); room_id new = current->adjacent[dir]; - bool status; + int status = 0; if(new != ROOM_NONE) { child_set_room(sender, new); - status = true; - } - else - { - status = false; + status = 1; } + sig_debugf("server status: %d\n", status); + send_packet(sender, REQ_MOVE, &status, sizeof(status)); } @@ -251,19 +237,19 @@ static const struct child_request { unsigned char cmd_to_send; } requests[] = { { REQ_NOP, false, CHILD_NONE, NULL, NULL, REQ_NOP }, - { REQ_BCASTMSG, true, CHILD_ALL, req_pass_msg, NULL, REQ_BCASTMSG }, - { REQ_LISTCLIENTS, false, CHILD_ALL, req_send_clientinfo, req_send_geninfo, REQ_BCASTMSG }, + { REQ_BCASTMSG, true, CHILD_ALL, req_pass_msg, NULL, REQ_NOP }, + { REQ_LISTCLIENTS, false, CHILD_ALL, req_send_clientinfo, req_send_geninfo, REQ_NOP }, { REQ_CHANGESTATE, true, CHILD_SENDER, req_change_state, NULL, REQ_NOP }, { REQ_CHANGEUSER, true, CHILD_SENDER, req_change_user, NULL, REQ_NOP }, { REQ_KICK, true, CHILD_ALL, req_kick_client, NULL, REQ_NOP }, { REQ_WAIT, false, CHILD_NONE, NULL, req_wait, REQ_NOP }, - { REQ_GETROOMDESC, false, CHILD_NONE, NULL, req_send_desc, REQ_BCASTMSG }, - { REQ_GETROOMNAME, false, CHILD_NONE, NULL, req_send_roomname, REQ_BCASTMSG }, + { REQ_GETROOMDESC, false, CHILD_NONE, NULL, req_send_desc, REQ_NOP }, + { REQ_GETROOMNAME, false, CHILD_NONE, NULL, req_send_roomname, REQ_NOP }, { REQ_SETROOM, true, CHILD_NONE, NULL, req_set_room, REQ_NOP }, - { REQ_MOVE, true, CHILD_NONE, NULL, req_move_room, REQ_MOVE }, - { REQ_GETUSERDATA, true, CHILD_NONE, NULL, req_send_user, REQ_GETUSERDATA }, - { REQ_DELUSERDATA, true, CHILD_NONE, NULL, req_del_user, REQ_DELUSERDATA }, - { REQ_ADDUSERDATA, true, CHILD_NONE, NULL, req_add_user, REQ_ADDUSERDATA }, + { REQ_MOVE, true, CHILD_NONE, NULL, req_move_room, REQ_NOP }, + { REQ_GETUSERDATA, true, CHILD_NONE, NULL, req_send_user, REQ_NOP }, + { REQ_DELUSERDATA, true, CHILD_NONE, NULL, req_del_user, REQ_NOP }, + { REQ_ADDUSERDATA, true, CHILD_NONE, NULL, req_add_user, REQ_NOP }, //{ REQ_ROOMMSG, true, CHILD_ALL, req_send_room_msg, NULL, REQ_BCASTMSG }, }; @@ -308,6 +294,9 @@ bool handle_child_req(int in_fd) ssize_t packet_len = read(in_fd, packet, MSG_MAX); + if(packet_len <= 0) + goto fail; + pid_t sender_pid; memcpy(&sender_pid, packet, sizeof(pid_t)); sig_debugf("Got request from PID %d\n", sender_pid); @@ -327,16 +316,6 @@ bool handle_child_req(int in_fd) struct child_request *req = hash_lookup(request_map, &cmd); - sigset_t old, block; - - sigemptyset(&block); - sigaddset(&block, SIGRTMIN+1); - sigprocmask(SIG_BLOCK, &block, &old); - - num_acks_wanted = 1; - num_acks_recvd = 0; - inc_acks = 1; - if(!req) { sig_debugf("Unknown request.\n"); @@ -382,47 +361,14 @@ bool handle_child_req(int in_fd) finish: - //if(req) - //{ - // send_packet(sender, req->cmd_to_send, NULL, 0); - //} - - if(req && req->finalize) - req->finalize(data, datalen, sender); - - union sigval junk = { 0 }; - if(sender) - sigqueue(sender->pid, SIGRTMIN, junk); - else - sig_debugf("Unknown PID sent request.\n"); - - /* 5 ms */ -#define ACK_TIMEOUT 5000 - - struct timespec timeout; - timeout.tv_sec = 0; - timeout.tv_nsec = ACK_TIMEOUT; - - while(num_acks_recvd < MIN(num_clients,num_acks_wanted)) + if(req) { - if(sigtimedwait(&old, NULL, &timeout) < 0 && errno == EAGAIN) - break; + send_packet(sender, req->cmd_to_send, NULL, 0); } - inc_acks = 0; - - sigprocmask(SIG_SETMASK, &old, NULL); + if(req && req->finalize) + req->finalize(data, datalen, sender); fail: return true; } - -void master_ack_handler(int s, siginfo_t *info, void *v) -{ - (void) s; - (void) v; - if(inc_acks && hash_lookup(child_map, &info->si_pid)) - { - ++num_acks_recvd; - } -} |