[26198] in CVS-changelog-for-Kerberos-V5

home help back first fref pref prev next nref lref last post

svn rev #25538: trunk/src/ccapi/server/win/

daemon@ATHENA.MIT.EDU (tlyu@mit.edu)
Mon Dec 12 15:44:16 2011

Date: Mon, 12 Dec 2011 15:44:14 -0500
From: tlyu@mit.edu
Message-Id: <201112122044.pBCKiEtb004238@drugstore.mit.edu>
To: cvs-krb5@mit.edu
Reply-To: krbdev@mit.edu
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: cvs-krb5-bounces@mit.edu

http://src.mit.edu/fisheye/changelog/krb5/?cs=25538
Commit By: tlyu
Log Message:
ticket: 7050
subject: windows ccapiserver: replace Sleep with event wait

Signed-off-by: Kevin Wasserman <kevin.wasserman@painless-security.com>


Changed Files:
U   trunk/src/ccapi/server/win/WorkItem.cpp
U   trunk/src/ccapi/server/win/WorkQueue.cpp
U   trunk/src/ccapi/server/win/WorkQueue.h
U   trunk/src/ccapi/server/win/ccs_os_server.cpp
U   trunk/src/ccapi/server/win/workitem.h
Modified: trunk/src/ccapi/server/win/WorkItem.cpp
===================================================================
--- trunk/src/ccapi/server/win/WorkItem.cpp	2011-12-12 18:33:35 UTC (rev 25537)
+++ trunk/src/ccapi/server/win/WorkItem.cpp	2011-12-12 20:44:14 UTC (rev 25538)
@@ -103,10 +103,26 @@
     return buf;
     }
 
+int WorkList::initialize() {
+    hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
+    return 0;
+    }
+
+int WorkList::cleanup() {
+    CloseHandle(hEvent);
+    hEvent = INVALID_HANDLE_VALUE;
+    return 0;
+    }
+
+void WorkList::wait() {
+    WaitForSingleObject(hEvent, INFINITE);
+    }
+
 int WorkList::add(WorkItem* item) {
     EnterCriticalSection(&cs);
         wl.push_front(item);
     LeaveCriticalSection(&cs);
+    SetEvent(hEvent);
     return 1;
     }
 

Modified: trunk/src/ccapi/server/win/WorkQueue.cpp
===================================================================
--- trunk/src/ccapi/server/win/WorkQueue.cpp	2011-12-12 18:33:35 UTC (rev 25537)
+++ trunk/src/ccapi/server/win/WorkQueue.cpp	2011-12-12 20:44:14 UTC (rev 25538)
@@ -24,6 +24,7 @@
  * or implied warranty.
  */
 
+#include "WorkQueue.h"
 extern "C" {
     #include "cci_debugging.h"
     }
@@ -32,9 +33,21 @@
 
 WorkList    worklist;
 
+EXTERN_C    int worklist_initialize() {
+        return worklist.initialize();
+        }
+
+EXTERN_C    int worklist_cleanup() {
+        return worklist.cleanup();
+        }
+
+EXTERN_C    void worklist_wait() {
+        worklist.wait();
+        }
+
 /* C interfaces: */
-EXTERN_C    bool worklist_isEmpty() {
-        return worklist.isEmpty();
+EXTERN_C    BOOL worklist_isEmpty() {
+        return worklist.isEmpty() ? TRUE : FALSE;
         }
 
 EXTERN_C    int worklist_add(   const long          rpcmsg,

Modified: trunk/src/ccapi/server/win/WorkQueue.h
===================================================================
--- trunk/src/ccapi/server/win/WorkQueue.h	2011-12-12 18:33:35 UTC (rev 25537)
+++ trunk/src/ccapi/server/win/WorkQueue.h	2011-12-12 20:44:14 UTC (rev 25538)
@@ -29,9 +29,16 @@
 #include "windows.h"
 #include "ccs_pipe.h"
 
+EXTERN_C    int worklist_initialize();
+
+EXTERN_C    int worklist_cleanup();
+
+/* Wait for work to be added to the list (via worklist_add) from another thread */
+EXTERN_C    void worklist_wait();
+
 EXTERN_C    BOOL worklist_isEmpty();
 
-EXTERN_C    void worklist_add(  const long          rpcmsg,
+EXTERN_C    int worklist_add(  const long          rpcmsg,
                                 const ccs_pipe_t    pipe,
                                 const k5_ipc_stream stream,
                                 const time_t        serverStartTime);

Modified: trunk/src/ccapi/server/win/ccs_os_server.cpp
===================================================================
--- trunk/src/ccapi/server/win/ccs_os_server.cpp	2011-12-12 18:33:35 UTC (rev 25537)
+++ trunk/src/ccapi/server/win/ccs_os_server.cpp	2011-12-12 20:44:14 UTC (rev 25538)
@@ -156,6 +156,10 @@
 //        status = startup_server(opts);
 //        }
 
+    if (!err) {
+        err = worklist_initialize();
+        }
+
     if (err) {
         Init::Cleanup();
         fprintf(    stderr, "An error occured while %s the server (%u)\n",
@@ -174,6 +178,8 @@
 
     cci_debug_printf("%s for user <%s> shutting down.", argv[0], argv[1]);
 
+    worklist_cleanup();
+
     return cci_check_error (err);
     }
 
@@ -190,7 +196,6 @@
 cc_int32 ccs_os_server_listen_loop (int argc, const char *argv[]) {
     cc_int32        err = 0;
     uintptr_t       threadStatus;
-    unsigned int    loopCounter  = 0;
 
     ParseOpts::Opts opts         = { 0 };
     ParseOpts       PO;
@@ -221,15 +226,13 @@
        queue.  */
     rpcargs.sessID  = (unsigned char*)sessID;
     rpcargs.opts    = &opts;
+    /// TODO: check for NULL handle, error, etc.  probably move to initialize func...
     threadStatus    = _beginthread(receiveLoop, 0, (void*)&rpcargs);
 
     /* We handle the queue entries here.  Work loop: */
     while (TRUE) {
-        loopCounter++;
-        if (worklist_isEmpty() & 1) {
-            SleepEx(1000, TRUE);
-            }
-        else if (TRUE) {      // Take next WorkItem from the queue:
+        worklist_wait();
+        while (!worklist_isEmpty()) {
             k5_ipc_stream    buf             = NULL;
             long            rpcmsg          = CCMSG_INVALID;
             time_t          serverStartTime = 0xDEADDEAD;
@@ -303,7 +306,6 @@
             else {cci_debug_printf("Huh?  Queue not empty but no item to remove.");}
             }
         }
-
     return cci_check_error (err);
     }
 

Modified: trunk/src/ccapi/server/win/workitem.h
===================================================================
--- trunk/src/ccapi/server/win/workitem.h	2011-12-12 18:33:35 UTC (rev 25537)
+++ trunk/src/ccapi/server/win/workitem.h	2011-12-12 20:44:14 UTC (rev 25538)
@@ -36,9 +36,13 @@
 private:
     std::list <WorkItem*>   wl;
     CRITICAL_SECTION        cs;
+    HANDLE                  hEvent;
 public:
     WorkList();
     ~WorkList();
+    int initialize();
+    int cleanup();
+    void wait();
     int add(WorkItem*);
     int remove(WorkItem**);
     bool isEmpty() {return wl.empty();}

_______________________________________________
cvs-krb5 mailing list
cvs-krb5@mit.edu
https://mailman.mit.edu/mailman/listinfo/cvs-krb5

home help back first fref pref prev next nref lref last post