urecovery_ResetState(void)
{
urecovery_state = 0;
+#if !defined(AFS_PTHREAD_ENV)
+ /* No corresponding LWP_WaitProcess found anywhere for this -- klm */
LWP_NoYieldSignal(&urecovery_state);
+#endif
return 0;
}
int
urecovery_LostServer(void)
{
+#if !defined(AFS_PTHREAD_ENV)
+ /* No corresponding LWP_WaitProcess found anywhere for this -- klm */
LWP_NoYieldSignal(&urecovery_state);
return 0;
+#endif
}
/* return true iff we have a current database (called by both sync
adbase->version.counter = 0;
(*adbase->setlabel) (adbase, 0, &adbase->version);
}
+#ifdef AFS_PTHREAD_ENV
+ assert(pthread_cond_broadcast(&adbase->version_cond) == 0);
+#else
LWP_NoYieldSignal(&adbase->version);
+#endif
}
return 0;
}
* requests. However, the recovery module still has one more task:
* propagating the dbase out to everyone who is up in the network.
*/
-int
-urecovery_Interact(void)
+void *
+urecovery_Interact(void *dummy)
{
afs_int32 code, tcode;
struct ubik_server *bestServer = NULL;
/* Run through this loop every 4 seconds */
tv.tv_sec = 4;
tv.tv_usec = 0;
+#ifdef AFS_PTHREAD_ENV
+ select(0, 0, 0, 0, &tv);
+#else
IOMGR_Select(0, 0, 0, 0, &tv);
+#endif
ubik_dprint("recovery running in state %x\n", urecovery_state);
#endif
if (!code)
code = rename(pbuffer, tbuffer);
+ if (!code)
+ code = (*ubik_dbase->open) (ubik_dbase, 0);
if (!code)
#endif
/* after data is good, sync disk with correct label */
urecovery_state |= UBIK_RECHAVEDB;
}
udisk_Invalidate(ubik_dbase, 0); /* data has changed */
+#ifdef AFS_PTHREAD_ENV
+ assert(pthread_cond_broadcast(&ubik_dbase->version_cond) == 0);
+#else
LWP_NoYieldSignal(&ubik_dbase->version);
+#endif
DBRELE(ubik_dbase);
}
#if defined(UBIK_PAUSE)
code =
(*ubik_dbase->setlabel) (ubik_dbase, 0, &ubik_dbase->version);
udisk_Invalidate(ubik_dbase, 0); /* data may have changed */
+#ifdef AFS_PTHREAD_ENV
+ assert(pthread_cond_broadcast(&ubik_dbase->version_cond) == 0);
+#else
LWP_NoYieldSignal(&ubik_dbase->version);
+#endif
DBRELE(ubik_dbase);
}
while ((ubik_dbase->flags & DBWRITING) && (safety < 500)) {
DBRELE(ubik_dbase);
/* sleep for a little while */
+#ifdef AFS_PTHREAD_ENV
+ select(0, 0, 0, 0, &tv);
+#else
IOMGR_Select(0, 0, 0, 0, &tv);
+#endif
tv.tv_usec += 10000;
safety++;
DBHOLD(ubik_dbase);
urecovery_state |= UBIK_RECSENTDB;
}
}
+ return NULL;
}
/*