diff options
author | Tom Yu <tlyu@mit.edu> | 2011-12-12 20:44:30 +0000 |
---|---|---|
committer | Tom Yu <tlyu@mit.edu> | 2011-12-12 20:44:30 +0000 |
commit | 5afb7bcbb9a5bd76132be60b58c01f6a3e5e3f7c (patch) | |
tree | 0ad66ae1cd37a2cdec62d5cb9f722a81eed323b9 | |
parent | e8b38981246f1dc1372455ab29725295ea5ede41 (diff) | |
download | krb5-5afb7bcbb9a5bd76132be60b58c01f6a3e5e3f7c.tar.gz krb5-5afb7bcbb9a5bd76132be60b58c01f6a3e5e3f7c.tar.xz krb5-5afb7bcbb9a5bd76132be60b58c01f6a3e5e3f7c.zip |
Make ccapiserver exit if its receiveloop thread terminates for any reason
This happens, for example, when the rpc endpoint is already registered
by another ccapiserver process. There's no reason to leave a zombie
process running that can't receive messages.
ticket: 7050
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@25540 dc483132-0cff-0310-8789-dd5450dbe970
-rw-r--r-- | src/ccapi/common/win/win-utils.h | 3 | ||||
-rw-r--r-- | src/ccapi/server/win/ccs_os_server.cpp | 9 |
2 files changed, 10 insertions, 2 deletions
diff --git a/src/ccapi/common/win/win-utils.h b/src/ccapi/common/win/win-utils.h index 6469a61e8b..41cab24dcd 100644 --- a/src/ccapi/common/win/win-utils.h +++ b/src/ccapi/common/win/win-utils.h @@ -42,7 +42,8 @@ static enum ccapiMsgType { CCMSG_REQUEST_REPLY, CCMSG_DISCONNECT, CCMSG_LISTEN, - CCMSG_PING + CCMSG_PING, + CCMSG_QUIT }; char* clientEndpoint(const char* UUID); diff --git a/src/ccapi/server/win/ccs_os_server.cpp b/src/ccapi/server/win/ccs_os_server.cpp index 811090ba51..9a45e72c0c 100644 --- a/src/ccapi/server/win/ccs_os_server.cpp +++ b/src/ccapi/server/win/ccs_os_server.cpp @@ -199,6 +199,7 @@ cc_int32 ccs_os_server_listen_loop (int argc, const char *argv[]) { ParseOpts::Opts opts = { 0 }; ParseOpts PO; + BOOL bQuit = FALSE; opts.cMinCalls = 1; opts.cMaxCalls = 20; @@ -230,7 +231,7 @@ cc_int32 ccs_os_server_listen_loop (int argc, const char *argv[]) { threadStatus = _beginthread(receiveLoop, 0, (void*)&rpcargs); /* We handle the queue entries here. Work loop: */ - while (TRUE) { + while (!bQuit) { worklist_wait(); while (!worklist_isEmpty()) { k5_ipc_stream buf = NULL; @@ -243,6 +244,10 @@ cc_int32 ccs_os_server_listen_loop (int argc, const char *argv[]) { ccs_pipe_t pipe2 = NULL; if (worklist_remove(&rpcmsg, &pipe, &buf, &serverStartTime)) { + if (rpcmsg == CCMSG_QUIT) { + bQuit = TRUE; + break; + } uuid = ccs_win_pipe_getUuid(pipe); #if 0 cci_debug_printf("%s: processing WorkItem msg:%ld pipeUUID:<%s> pipeHandle:0x%X SST:%ld", @@ -462,6 +467,8 @@ void receiveLoop(void* rpcargs) { free_alloc_p(&endpoint); } + // tell main thread to shutdown since it won't receive any more messages + worklist_add(CCMSG_QUIT, NULL, NULL, 0); _endthread(); } // End receiveLoop |