Have lwkt_reltoken() return the generation number to facilitate checks
authorMatthew Dillon <dillon@dragonflybsd.org>
Wed, 15 Oct 2003 23:27:06 +0000 (23:27 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Wed, 15 Oct 2003 23:27:06 +0000 (23:27 +0000)
for stolen tokens.  Cleanup, optimize, and better document lwkt_gentoken().

sys/kern/lwkt_thread.c
sys/sys/thread.h

index 14f68f1..ceb6cac 100644 (file)
@@ -28,7 +28,7 @@
  *     to use a critical section to avoid problems.  Foreign thread 
  *     scheduling is queued via (async) IPIs.
  *
- * $DragonFly: src/sys/kern/lwkt_thread.c,v 1.35 2003/10/02 22:29:15 dillon Exp $
+ * $DragonFly: src/sys/kern/lwkt_thread.c,v 1.36 2003/10/15 23:27:06 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -1075,37 +1075,41 @@ lwkt_trytoken(lwkt_token_t tok)
  * the other cpu hands it back to us before we check).
  *
  * We might have lost the token, so check that.
+ *
+ * Return the token's generation number.  The number is useful to callers
+ * who may want to know if the token was stolen during potential blockages.
  */
-void
+int
 lwkt_reltoken(lwkt_token_t tok)
 {
+    int gen;
+
     if (tok->t_cpu == mycpu->gd_cpuid) {
        tok->t_cpu = tok->t_reqcpu;
     }
+    gen = tok->t_gen;
     crit_exit();
+    return(gen);
 }
 
 /*
- * Reacquire a token that might have been lost and compare and update the
- * generation number.  0 is returned if the generation has not changed
- * (nobody else obtained the token while we were blocked, on this cpu or
- * any other cpu).
+ * Reacquire a token that might have been lost.  0 is returned if the 
+ * generation has not changed (nobody stole the token from us), -1 is 
+ * returned otherwise.  The token is reacquired regardless but the
+ * generation number is not bumped further if we already own the token.
  *
- * This function returns with the token re-held whether the generation
- * number changed or not.
+ * For efficiency we inline the best-case situation for lwkt_regettoken()
+ * (i.e .we still own the token).
  */
 int
 lwkt_gentoken(lwkt_token_t tok, int *gen)
 {
-    if (lwkt_regettoken(tok) == *gen) {
+    if (tok->t_cpu == mycpu->gd_cpuid && tok->t_gen == *gen)
        return(0);
-    } else {
-       *gen = tok->t_gen;
-       return(-1);
-    }
+    *gen = lwkt_regettoken(tok);
+    return(-1);
 }
 
-
 /*
  * Re-acquire a token that might have been lost.  Returns the generation 
  * number of the token.
index 03e50a7..9fb1003 100644 (file)
@@ -4,7 +4,7 @@
  *     Implements the architecture independant portion of the LWKT 
  *     subsystem.
  * 
- * $DragonFly: src/sys/sys/thread.h,v 1.33 2003/10/02 22:27:00 dillon Exp $
+ * $DragonFly: src/sys/sys/thread.h,v 1.34 2003/10/15 23:27:05 dillon Exp $
  */
 
 #ifndef _SYS_THREAD_H_
@@ -247,7 +247,7 @@ extern void lwkt_signal(lwkt_wait_t w, int count);
 extern int lwkt_trytoken(lwkt_token_t tok);
 extern int lwkt_gettoken(lwkt_token_t tok);
 extern int lwkt_gentoken(lwkt_token_t tok, int *gen);
-extern void lwkt_reltoken(lwkt_token_t tok);
+extern int lwkt_reltoken(lwkt_token_t tok);
 extern void lwkt_inittoken(lwkt_token_t tok);
 extern int  lwkt_regettoken(lwkt_token_t tok);
 extern void lwkt_rwlock_init(lwkt_rwlock_t lock);