#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"
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);
* no return value
*/
+void
haveWritten(nbytes)
afs_int32 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);
}
* done flag.
*/
+void
doneWriting(error)
afs_int32 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);
}
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);
}