X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/5df6bcf398aca8c5cfe1e61f1794c88504145c3b..bc4721533e4041a19b42cb247064f9f42c3f9d5f:/projects/rscriptd/main.cpp diff --git a/projects/rscriptd/main.cpp b/projects/rscriptd/main.cpp index 8cf9384d..7e7f7f35 100644 --- a/projects/rscriptd/main.cpp +++ b/projects/rscriptd/main.cpp @@ -36,6 +36,8 @@ #include #include #include +#include +#include // strerror #include #include "stg/common.h" @@ -193,6 +195,18 @@ newsa.sa_flags = 0; sigaction(SIGCHLD, &newsa, &oldsa); } //----------------------------------------------------------------------------- +void KillExecuters() +{ +set::iterator pid; +pid = executersPid.begin(); +while (pid != executersPid.end()) + { + printfd(__FILE__, "KillExecuters pid=%d\n", *pid); + kill(*pid, SIGUSR1); + ++pid; + } +} +//----------------------------------------------------------------------------- int StartScriptExecuter(char * procName, int msgKey, int * msgID) { STG_LOGGER & WriteServLog = GetStgLogger(); @@ -237,17 +251,55 @@ switch (executerPid) //close(1); //close(2); //setsid(); - Executer(msgKey, *msgID, executerPid, procName); + Executer(*msgID, executerPid, procName); return 1; default: // Parent if (executersPid.empty()) - Executer(msgKey, *msgID, executerPid, NULL); + Executer(*msgID, executerPid, NULL); executersPid.insert(executerPid); } return 0; } //----------------------------------------------------------------------------- +void StopScriptExecuter(int msgID) +{ +STG_LOGGER & WriteServLog = GetStgLogger(); + +for (int i = 0; i < 5; ++i) + { + struct msqid_ds data; + if (msgctl(msgID, IPC_STAT, &data)) + { + int e = errno; + printfd(__FILE__, "StopScriptExecuter() - msgctl for IPC_STAT failed: '%s'\n", strerror(e)); + WriteServLog( "Failed to check queue emptiness: '%s'", strerror(e)); + break; + } + + WriteServLog("Messages in queue: %d", data.msg_qnum); + + if (data.msg_qnum == 0) + break; + + struct timespec ts = {1, 0}; + nanosleep(&ts, NULL); + } + +if (msgctl(msgID, IPC_RMID, NULL)) + { + int e = errno; + printfd(__FILE__, "StopScriptExecuter() - msgctl for IPC_STAT failed: '%s'\n", strerror(e)); + WriteServLog("Failed to remove queue: '%s'", strerror(e)); + } +else + { + WriteServLog("Queue removed successfully."); + } + +KillExecuters(); +} +//----------------------------------------------------------------------------- #ifdef NO_DAEMON int ForkAndWait(const string &) #else @@ -278,18 +330,6 @@ switch (stgChildPid) return 0; } //----------------------------------------------------------------------------- -void KillExecuters() -{ -set::iterator pid; -pid = executersPid.begin(); -while (pid != executersPid.end()) - { - printfd(__FILE__, "KillExecuters pid=%d\n", *pid); - kill(*pid, SIGUSR1); - ++pid; - } -} -//----------------------------------------------------------------------------- int main(int argc, char * argv[]) { @@ -397,13 +437,7 @@ listener->Stop(); WriteServLog("+++++++++++++++++++++++++++++++++++++++++++++"); -int res = msgctl(msgID, IPC_RMID, NULL); -if (res) - WriteServLog("Queue was not removed. id=%d", msgID); -else - WriteServLog("Queue removed successfully."); - -KillExecuters(); +StopScriptExecuter(msgID); WriteServLog("rscriptd stopped successfully."); WriteServLog("---------------------------------------------");