From 0f692ff998f7b7e0808b8c9c1496430a8aed4beb Mon Sep 17 00:00:00 2001 From: Thulinma Date: Fri, 7 Oct 2011 03:08:07 +0200 Subject: [PATCH] Fixed some issues with buffers, fixed child reaping for all connectors --- Buffer/main.cpp | 51 ++++++++++++++++++++++--------------------- util/server_setup.cpp | 11 ++++++---- 2 files changed, 33 insertions(+), 29 deletions(-) diff --git a/Buffer/main.cpp b/Buffer/main.cpp index bcc0f68f..677fce5d 100644 --- a/Buffer/main.cpp +++ b/Buffer/main.cpp @@ -169,14 +169,15 @@ namespace Buffer{ bool gotData = false; while((!feof(stdin) || ip_waiting) && !FLV::Parse_Error){ + usleep(1000); //sleep for 1 ms, to prevent 100% CPU time //invalidate the current buffer ringbuf[current_buffer]->number = -1; if ( - (!ip_waiting && - (std_input.canRead()) && ringbuf[current_buffer]->FLV.FileLoader(stdin) - ) || (ip_waiting && (ip_input.connected()) && - ringbuf[current_buffer]->FLV.SockLoader(ip_input) - ) + (!ip_waiting && + (std_input.canRead()) && ringbuf[current_buffer]->FLV.FileLoader(stdin) + ) || (ip_waiting && (ip_input.connected()) && + ringbuf[current_buffer]->FLV.SockLoader(ip_input) + ) ){ loopcount++; packtype = ringbuf[current_buffer]->FLV.data[0]; @@ -256,32 +257,32 @@ namespace Buffer{ } } - //send all connections what they need, if and when they need it + //go through all users if (users.size() > 0){ for (usersIt = users.begin(); usersIt != users.end(); usersIt++){ + //remove disconnected users if (!(*usersIt).S.connected()){ users.erase(usersIt); break; }else{ - if (!gotData && ip_waiting){ - if ((*usersIt).S.canRead()){ - std::string tmp = ""; - char charbuf; - while (((*usersIt).S.iread(&charbuf, 1) == 1) && charbuf != '\n' ){ - tmp += charbuf; - } - if (tmp != ""){ - std::cout << "Push attempt from IP " << tmp << std::endl; - if (tmp == waiting_ip){ - if (!ip_input.connected()){ - std::cout << "Push accepted!" << std::endl; - ip_input = (*usersIt).S; - users.erase(usersIt); break; - }else{ - std::cout << "Push denied - push already in progress!" << std::endl; - } + if ((*usersIt).S.canRead()){ + std::string tmp = ""; + char charbuf; + while (((*usersIt).S.iread(&charbuf, 1) == 1) && charbuf != '\n' ){ + tmp += charbuf; + } + if (tmp != ""){ + std::cout << "Push attempt from IP " << tmp << std::endl; + if (tmp == waiting_ip){ + if (!ip_input.connected()){ + std::cout << "Push accepted!" << std::endl; + ip_input = (*usersIt).S; + users.erase(usersIt); + break; }else{ - std::cout << "Push denied!" << std::endl; + (*usersIt).Disconnect("Push denied - push already in progress!"); } + }else{ + (*usersIt).Disconnect("Push denied - invalid IP address!"); } } } @@ -311,5 +312,5 @@ namespace Buffer{ /// Entry point for Buffer, simply calls Buffer::Start(). int main(int argc, char ** argv){ - Buffer::Start(argc, argv); + return Buffer::Start(argc, argv); }//main diff --git a/util/server_setup.cpp b/util/server_setup.cpp index 20d8c4f5..c28d2040 100644 --- a/util/server_setup.cpp +++ b/util/server_setup.cpp @@ -35,13 +35,17 @@ Socket::Server server_socket(-1); ///< Placeholder for the server socket /// Disconnecting the server_socket will terminate the main listening loop /// and cleanly shut down the process. void signal_handler (int signum){ - if (!server_socket.connected()) return; switch (signum){ case SIGINT: break; case SIGHUP: break; case SIGTERM: break; + case SIGCHLD: + wait(0); + return; + break; default: return; break; } + if (!server_socket.connected()) return; server_socket.close(); }//signal_handler @@ -64,7 +68,8 @@ int main(int argc, char ** argv){ sigaction(SIGHUP, &new_action, NULL); sigaction(SIGTERM, &new_action, NULL); sigaction(SIGPIPE, &new_action, NULL); - + sigaction(SIGCHLD, &new_action, NULL); + //default values int listen_port = DEFAULT_PORT; bool daemon_mode = true; @@ -174,9 +179,7 @@ int main(int argc, char ** argv){ } } - int status; while (server_socket.connected()){ - while (waitpid((pid_t)-1, &status, WNOHANG) > 0){}//clean up all child processes S = server_socket.accept(); if (S.connected()){//check if the new connection is valid pid_t myid = fork();