DEVEL15-kill-ubik-pthread-env-20080718
[openafs.git] / src / ubik / recovery.c
index b0b8e9c..9b76e0d 100644 (file)
@@ -72,7 +72,10 @@ int
 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;
 }
 
@@ -83,8 +86,11 @@ urecovery_ResetState(void)
 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
@@ -363,7 +369,11 @@ InitializeDB(register struct ubik_dbase *adbase)
            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;
 }
@@ -412,8 +422,8 @@ urecovery_Initialize(register struct ubik_dbase *adbase)
  * 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;
@@ -443,7 +453,11 @@ urecovery_Interact(void)
        /* 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);
 
@@ -648,6 +662,8 @@ urecovery_Interact(void)
 #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 */
@@ -678,7 +694,11 @@ urecovery_Interact(void)
                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)
@@ -702,7 +722,11 @@ urecovery_Interact(void)
            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);
        }
 
@@ -731,7 +755,11 @@ urecovery_Interact(void)
                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);
@@ -806,6 +834,7 @@ urecovery_Interact(void)
                urecovery_state |= UBIK_RECSENTDB;
        }
     }
+    return NULL;
 }
 
 /*