DEVEL15-kill-ubik-pthread-env-20080718
[openafs.git] / src / budb / db_dump.c
index 587fde4..983b1d2 100644 (file)
@@ -28,14 +28,7 @@ RCSID
 #include <sys/types.h>
 #include <ubik.h>
 #include <lock.h>
-
-#ifdef HAVE_STRING_H
 #include <string.h>
-#else
-#ifdef HAVE_STRINGS_H
-#include <strings.h>
-#endif
-#endif
 
 #include "database.h"
 #include "budb.h"
@@ -80,13 +73,23 @@ canWrite(fid)
     while (dumpSyncPtr->ds_bytes > 0) {
        if (dumpSyncPtr->ds_readerStatus == DS_WAITING) {
            dumpSyncPtr->ds_readerStatus = 0;
+#ifdef AFS_PTHREAD_ENV
+           assert(pthread_cond_broadcast(&dumpSyncPtr->ds_readerStatus_cond) == 0);
+#else
            code = LWP_SignalProcess(&dumpSyncPtr->ds_readerStatus);
            if (code)
                LogError(code, "canWrite: Signal delivery failed\n");
+#endif
        }
        dumpSyncPtr->ds_writerStatus = DS_WAITING;
        ReleaseWriteLock(&dumpSyncPtr->ds_lock);
+#ifdef AFS_PTHREAD_ENV
+       assert(pthread_mutex_lock(&dumpSyncPtr->ds_writerStatus_mutex) == 0);
+       assert(pthread_cond_wait(&dumpSyncPtr->ds_writerStatus_cond, &dumpSyncPtr->ds_writerStatus_mutex) == 0);
+       assert(pthread_mutex_unlock(&dumpSyncPtr->ds_writerStatus_mutex) == 0);
+#else
        LWP_WaitProcess(&dumpSyncPtr->ds_writerStatus);
+#endif
        ObtainWriteLock(&dumpSyncPtr->ds_lock);
     }
     return (1);
@@ -100,6 +103,7 @@ canWrite(fid)
  *     no return value
  */
 
+void
 haveWritten(nbytes)
      afs_int32 nbytes;
 {
@@ -109,9 +113,13 @@ haveWritten(nbytes)
     dumpSyncPtr->ds_bytes += nbytes;
     if (dumpSyncPtr->ds_readerStatus == DS_WAITING) {
        dumpSyncPtr->ds_readerStatus = 0;
+#ifdef AFS_PTHREAD_ENV
+       assert(pthread_cond_broadcast(&dumpSyncPtr->ds_readerStatus_cond) == 0);
+#else
        code = LWP_SignalProcess(&dumpSyncPtr->ds_readerStatus);
        if (code)
            LogError(code, "haveWritten: Signal delivery failed\n");
+#endif
     }
     ReleaseWriteLock(&dumpSyncPtr->ds_lock);
 }
@@ -121,6 +129,7 @@ haveWritten(nbytes)
  *     done flag.
  */
 
+void
 doneWriting(error)
      afs_int32 error;
 {
@@ -132,7 +141,13 @@ doneWriting(error)
        LogDebug(4, "doneWriting: waiting for Reader\n");
        dumpSyncPtr->ds_writerStatus = DS_WAITING;
        ReleaseWriteLock(&dumpSyncPtr->ds_lock);
+#ifdef AFS_PTHREAD_ENV
+       assert(pthread_mutex_lock(&dumpSyncPtr->ds_writerStatus_mutex) == 0);
+       assert(pthread_cond_wait(&dumpSyncPtr->ds_writerStatus_cond, &dumpSyncPtr->ds_writerStatus_mutex) == 0);
+       assert(pthread_mutex_unlock(&dumpSyncPtr->ds_writerStatus_mutex) == 0);
+#else
        LWP_WaitProcess(&dumpSyncPtr->ds_writerStatus);
+#endif
        ObtainWriteLock(&dumpSyncPtr->ds_lock);
     }
 
@@ -144,9 +159,13 @@ doneWriting(error)
     else
        dumpSyncPtr->ds_writerStatus = DS_DONE;
     dumpSyncPtr->ds_readerStatus = 0;
+#ifdef AFS_PTHREAD_ENV
+    assert(pthread_cond_broadcast(&dumpSyncPtr->ds_readerStatus_cond) == 0);
+#else
     code = LWP_NoYieldSignal(&dumpSyncPtr->ds_readerStatus);
     if (code)
        LogError(code, "doneWriting: Signal delivery failed\n");
+#endif
     ReleaseWriteLock(&dumpSyncPtr->ds_lock);
 }