]> Zhao Yanbai Git Server - minix.git/commitdiff
libmthread: don't always verify library initialization
authorThomas Veerman <thomas@minix3.org>
Tue, 1 May 2012 09:44:49 +0000 (09:44 +0000)
committerThomas Veerman <thomas@minix3.org>
Tue, 1 May 2012 09:55:06 +0000 (09:55 +0000)
This can be turned back on when the library is compiled with
-DMTHREAD_STRICT (which enables more sanity checks). However,
always performing this check shows up in system profiling results.

lib/libmthread/allocate.c
lib/libmthread/attribute.c
lib/libmthread/condition.c
lib/libmthread/key.c
lib/libmthread/mutex.c
lib/libmthread/proto.h
lib/libmthread/scheduler.c

index d1ede902c4ed3d9463bfda711215ac820ad7cb9b..c82143d72fe20936fb2b8932b50f81f896b8482f 100644 (file)
@@ -33,7 +33,7 @@ mthread_thread_t l;
 mthread_thread_t r;
 {
 /* Compare two thread ids */
-  mthread_init();      /* Make sure mthreads is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure mthreads is initialized */
 
   return(l == r);
 }
@@ -51,7 +51,7 @@ void *arg;
 /* Register procedure proc for execution in a thread. */
   mthread_thread_t thread;
 
-  mthread_init();      /* Make sure mthreads is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure mthreads is initialized */
 
   if (proc == NULL)
        return(EINVAL);
@@ -85,7 +85,7 @@ mthread_thread_t detach;
  * this thread are automatically freed.
  */
   mthread_tcb_t *tcb;
-  mthread_init();      /* Make sure libmthread is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure libmthread is initialized */
 
   if (!isokthreadid(detach)) 
        return(ESRCH);
@@ -113,7 +113,7 @@ void *value;
 /* Make a thread stop running and store the result value. */
   mthread_tcb_t *tcb;
 
-  mthread_init();      /* Make sure libmthread is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure libmthread is initialized */
 
   tcb = mthread_find_tcb(current_thread);
 
@@ -229,27 +229,27 @@ void mthread_init(void)
  * threads.
  */
 
-  if (!initialized) {
-       no_threads = 0;
-       used_threads = 0;
-       need_reset = 0;
-       running_main_thread = 1;/* mthread_init can only be called from the
-                                * main thread. Calling it from a thread will
-                                * not enter this clause.
-                                */
-
-       if (mthread_getcontext(&(mainthread.m_context)) == -1)
-               mthread_panic("Couldn't save state for main thread");
-       current_thread = MAIN_THREAD;
-
-       mthread_init_valid_mutexes();
-       mthread_init_valid_conditions();
-       mthread_init_valid_attributes();
-       mthread_init_keys();
-       mthread_init_scheduler();
-
-       initialized = 1;
-  }
+  if (initialized) return;
+
+  no_threads = 0;
+  used_threads = 0;
+  need_reset = 0;
+  running_main_thread = 1;     /* mthread_init can only be called from the
+                                * main thread. Calling it from a thread will
+                                * not enter this clause.
+                                */
+
+  if (mthread_getcontext(&(mainthread.m_context)) == -1)
+       mthread_panic("Couldn't save state for main thread");
+  current_thread = MAIN_THREAD;
+
+  mthread_init_valid_mutexes();
+  mthread_init_valid_conditions();
+  mthread_init_valid_attributes();
+  mthread_init_keys();
+  mthread_init_scheduler();
+
+  initialized = 1;
 }
 
 
@@ -264,7 +264,7 @@ void **value;
 
   mthread_tcb_t *tcb;
 
-  mthread_init();      /* Make sure libmthread is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure libmthread is initialized */
 
   if (!isokthreadid(join))
        return(ESRCH);
@@ -320,7 +320,7 @@ void (*proc)(void);
 {
 /* Run procedure proc just once */
 
-  mthread_init();      /* Make sure libmthread is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure libmthread is initialized */
 
   if (once == NULL || proc == NULL) 
        return(EINVAL);
@@ -338,7 +338,7 @@ mthread_thread_t mthread_self(void)
 {
 /* Return the thread id of the thread calling this function. */
 
-  mthread_init();      /* Make sure libmthread is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure libmthread is initialized */
 
   return(current_thread);
 }
index 763df02f5e1a36df2c7d9c54572031f8cacd0ba0..0a96bbb2a9e6ed1fbf10fe674f062252b236bfd7 100644 (file)
@@ -46,7 +46,7 @@ mthread_attr_t *attr;
 {
 /* Invalidate attribute and deallocate resources. */
 
-  mthread_init();      /* Make sure mthreads is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure mthreads is initialized */
 
   if (attr == NULL)
        return(EINVAL);
@@ -72,7 +72,7 @@ mthread_attr_t *attr; /* Attribute */
 /* Initialize the attribute to a known state. */
   struct __mthread_attr *a;
 
-  mthread_init();      /* Make sure mthreads is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure mthreads is initialized */
 
   if (attr == NULL) 
        return(EAGAIN);
@@ -102,7 +102,7 @@ int *detachstate;
 /* Get detachstate of a thread attribute */
   struct __mthread_attr *a;
 
-  mthread_init();      /* Make sure mthreads is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure mthreads is initialized */
 
   if (attr == NULL) 
        return(EINVAL);
@@ -127,7 +127,7 @@ int detachstate;
 /* Set detachstate of a thread attribute */
   struct __mthread_attr *a;
 
-  mthread_init();      /* Make sure mthreads is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure mthreads is initialized */
 
   if (attr == NULL) 
        return(EINVAL);
@@ -156,7 +156,7 @@ size_t *stacksize;
 /* Get stack attribute */
   struct __mthread_attr *a;
 
-  mthread_init();      /* Make sure mthreads is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure mthreads is initialized */
 
   if (attr == NULL) 
        return(EINVAL);
@@ -182,7 +182,7 @@ size_t *stacksize;
 /* Get stack size attribute */
   struct __mthread_attr *a;
 
-  mthread_init();      /* Make sure mthreads is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure mthreads is initialized */
 
   if (attr == NULL)
        return(EINVAL);
@@ -208,7 +208,7 @@ size_t stacksize;
 /* Set stack attribute */
   struct __mthread_attr *a;
 
-  mthread_init();      /* Make sure mthreads is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure mthreads is initialized */
 
   if (attr == NULL) 
        return(EINVAL);
@@ -239,7 +239,7 @@ size_t stacksize;
 /* Set stack size attribute */
   struct __mthread_attr *a;
 
-  mthread_init();      /* Make sure mthreads is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure mthreads is initialized */
 
   if (attr == NULL)
        return(EINVAL);
@@ -283,7 +283,7 @@ mthread_attr_t *a;
 /* Check to see if attribute is on the list of valid attributes */
   struct __mthread_attr *loopitem;
 
-  mthread_init();      /* Make sure mthreads is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure mthreads is initialized */
 
   loopitem = va_front;
 
@@ -307,7 +307,7 @@ int mthread_attr_verify(void)
 /* Return true when no attributes are in use */
   struct __mthread_attr *loopitem;
 
-  mthread_init();      /* Make sure mthreads is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure mthreads is initialized */
 
   loopitem = va_front;
 
index 8ec60f44397fdff66f1f7e2cfd1a9f4b9e3f3d08..ec3bcc43dc350314a4a9fbfb8aaf313dc5345b45 100644 (file)
@@ -58,7 +58,7 @@ mthread_cond_t *cond;
   mthread_thread_t t;
   mthread_tcb_t *tcb;
 
-  mthread_init();      /* Make sure libmthread is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure libmthread is initialized */
 
   if (cond == NULL) 
        return(EINVAL);
@@ -89,7 +89,7 @@ mthread_cond_t *cond;
   mthread_thread_t t;
   mthread_tcb_t *tcb;
 
-  mthread_init();      /* Make sure libmthread is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure libmthread is initialized */
 
   if (cond == NULL)
        return(EINVAL);
@@ -126,7 +126,7 @@ mthread_condattr_t *cattr;
 /* Initialize condition variable to a known state. cattr is ignored */
   struct __mthread_cond *c;
 
-  mthread_init();      /* Make sure libmthread is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure libmthread is initialized */
 
   if (cond == NULL) 
        return(EINVAL);
@@ -181,7 +181,7 @@ mthread_cond_t *cond;
   mthread_thread_t t;
   mthread_tcb_t *tcb;
 
-  mthread_init();      /* Make sure libmthread is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure libmthread is initialized */
 
   if (cond == NULL)
        return(EINVAL);
@@ -214,7 +214,7 @@ mthread_cond_t *c;
 /* Check to see if cond is on the list of valid conditions */
   struct __mthread_cond *loopitem;
 
-  mthread_init();
+  MTHREAD_CHECK_INIT();
 
   loopitem = vc_front;
 
@@ -237,7 +237,7 @@ int mthread_cond_verify(void)
 {
 /* Return true in case no condition variables are in use. */
 
-  mthread_init();      /* Make sure libmthread is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure libmthread is initialized */
 
   return(vc_front == NULL);
 }
@@ -256,7 +256,7 @@ mthread_mutex_t *mutex;
   struct __mthread_cond *c;
   struct __mthread_mutex *m;
 
-  mthread_init();      /* Make sure libmthread is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure libmthread is initialized */
 
   if (cond == NULL || mutex == NULL)
        return(EINVAL);
index db80ea9d68b74cbe8603f02815adf2e41e6d15f7..f07b26f45fb9911f802164edeac937341b5e3339 100644 (file)
@@ -34,7 +34,7 @@ int mthread_key_create(mthread_key_t *key, void (*destructor)(void *))
  */
   mthread_key_t k;
 
-  mthread_init();      /* Make sure libmthread is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure libmthread is initialized */
   keys_used = 1;
 
   /* We do not yet allocate storage space for the values here, because we can
@@ -65,7 +65,7 @@ int mthread_key_delete(mthread_key_t key)
 /* Free up a key, as well as any associated storage space.
  */
 
-  mthread_init();      /* Make sure libmthread is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure libmthread is initialized */
 
   if (key < 0 || key >= MTHREAD_KEYS_MAX || !keys[key].used)
        return(EINVAL);
@@ -85,7 +85,7 @@ void *mthread_getspecific(mthread_key_t key)
 /* Get this thread's local value for the given key. The default is NULL.
  */
 
-  mthread_init();      /* Make sure libmthread is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure libmthread is initialized */
 
   if (key < 0 || key >= MTHREAD_KEYS_MAX || !keys[key].used)
        return(NULL);
@@ -109,7 +109,7 @@ int mthread_setspecific(mthread_key_t key, void *value)
  */
   void **p;
 
-  mthread_init();      /* Make sure libmthread is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure libmthread is initialized */
 
   if (key < 0 || key >= MTHREAD_KEYS_MAX || !keys[key].used)
        return(EINVAL);
index 23002acb41462918444e574a90a3944f0b0a8dc8..06009b88c1b7a2f5d9b19a11f35975056b8c8ec2 100644 (file)
@@ -12,7 +12,7 @@ static void mthread_mutex_remove(mthread_mutex_t *m);
 #endif
 
 /*===========================================================================*
- *                             mthread_init_valid_mutexes                           *
+ *                             mthread_init_valid_mutexes                   *
  *===========================================================================*/
 void mthread_init_valid_mutexes(void)
 {
@@ -56,7 +56,7 @@ mthread_mutex_t *mutex;
   mthread_thread_t t;
   mthread_tcb_t *tcb;
 
-  mthread_init();      /* Make sure mthreads is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure mthreads is initialized */
 
   if (mutex == NULL)
        return(EINVAL);
@@ -95,7 +95,7 @@ mthread_mutexattr_t *mattr;   /* Mutex attribute */
 
   struct __mthread_mutex *m;
 
-  mthread_init();      /* Make sure mthreads is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure mthreads is initialized */
 
   if (mutex == NULL)
        return(EAGAIN);
@@ -127,7 +127,7 @@ mthread_mutex_t *mutex;     /* Mutex that is to be locked */
 
   struct __mthread_mutex *m;
 
-  mthread_init();      /* Make sure mthreads is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure mthreads is initialized */
 
   if (mutex == NULL)
        return(EINVAL);
@@ -180,7 +180,7 @@ mthread_mutex_t *mutex;     /* Mutex that is to be locked */
 
   struct __mthread_mutex *m;
 
-  mthread_init();      /* Make sure mthreads is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure mthreads is initialized */
 
   if (mutex == NULL) 
        return(EINVAL);
@@ -210,7 +210,7 @@ mthread_mutex_t *mutex;     /* Mutex that is to be unlocked */
 
   struct __mthread_mutex *m;
 
-  mthread_init();      /* Make sure mthreads is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure mthreads is initialized */
 
   if (mutex == NULL) 
        return(EINVAL);
@@ -237,7 +237,7 @@ mthread_mutex_t *m;
 /* Check to see if mutex is on the list of valid mutexes */
   struct __mthread_mutex *loopitem;
 
-  mthread_init();      /* Make sure mthreads is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure mthreads is initialized */
 
   loopitem = vm_front;
 
@@ -262,7 +262,7 @@ int mthread_mutex_verify(void)
   int r = 1;
   struct __mthread_mutex *loopitem;
 
-  mthread_init();      /* Make sure mthreads is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure mthreads is initialized */
 
 #ifdef MTHREAD_STRICT
   loopitem = vm_front;
index e0d41e1df3f562afa0ecef9034780de5b8cd3c4f..c7154ac881d340df4c75782af3a7b34bcbf346ea 100644 (file)
@@ -38,8 +38,10 @@ void mthread_init_valid_mutexes(void);
 
 #ifdef MTHREAD_STRICT
 int mthread_mutex_valid(mthread_mutex_t *mutex);
+# define MTHREAD_CHECK_INIT()  mthread_init()
 #else
 # define mthread_mutex_valid(x) ((*x)->mm_magic == MTHREAD_INIT_MAGIC)
+# define MTHREAD_CHECK_INIT()
 #endif
 
 #ifdef MDEBUG
index 9aa6310c0357ae89298d9ff7c02496c30a5d4b2b..335f83669eff3daceb2e26b7004275a6eb161554 100644 (file)
@@ -38,7 +38,7 @@ void mthread_schedule(void)
   mthread_tcb_t *new_tcb, *old_tcb;
   ucontext_t *new_ctx, *old_ctx;
 
-  mthread_init();      /* Make sure libmthread is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure libmthread is initialized */
 
   old_thread = current_thread;
 
@@ -154,7 +154,7 @@ int mthread_yield(void)
   mthread_tcb_t *tcb;
   mthread_thread_t t;
 
-  mthread_init();      /* Make sure libmthread is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure libmthread is initialized */
 
   /* Detached threads cannot clean themselves up. This is a perfect moment to
    * do it */
@@ -192,7 +192,7 @@ void mthread_yield_all(void)
  * this function will lead to a deadlock.
  */
 
-  mthread_init();      /* Make sure libmthread is initialized */
+  MTHREAD_CHECK_INIT();        /* Make sure libmthread is initialized */
 
   if (yield_all) mthread_panic("Deadlock: two threads trying to yield_all");
   yield_all = 1;