From ecfb9eac2f77be1ef9c147b0507406379d63ac82 Mon Sep 17 00:00:00 2001 From: "W. Eric Norum" Date: Fri, 3 Mar 2000 01:45:23 +0000 Subject: [PATCH] Clean up in preparation for release of threadInit. --- src/libCom/osi/os/RTEMS/osdThread.c | 67 ++++++++++------------------- 1 file changed, 23 insertions(+), 44 deletions(-) diff --git a/src/libCom/osi/os/RTEMS/osdThread.c b/src/libCom/osi/os/RTEMS/osdThread.c index ba19bfded..00a8e5fb3 100644 --- a/src/libCom/osi/os/RTEMS/osdThread.c +++ b/src/libCom/osi/os/RTEMS/osdThread.c @@ -38,7 +38,7 @@ struct taskVar { void **threadVariables; int threadVariablesAdded; }; -static rtems_id taskVarMutex; +static semMutexId taskVarMutex; static struct taskVar *taskVarHead; #define RTEMS_NOTEPAD_TASKVAR 11 @@ -77,46 +77,13 @@ threadGetStackSize (threadStackSizeClass size) static void taskVarLock (void) { - rtems_status_code sc; - - if (!taskVarMutex) { - rtems_mode mode; - rtems_task_mode (RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &mode); - if (!taskVarMutex) { - sc = rtems_semaphore_create (rtems_build_name ('T', 'V', 'M', 'X'), - 1, - RTEMS_FIFO | - RTEMS_BINARY_SEMAPHORE | - RTEMS_NO_INHERIT_PRIORITY | - RTEMS_NO_PRIORITY_CEILING | - RTEMS_LOCAL, - 0, - &taskVarMutex); - if (sc != RTEMS_SUCCESSFUL) { - rtems_task_mode (mode, RTEMS_PREEMPT_MASK, &mode); - syslog (LOG_ERR, "Can't create task variable mutex: %s", rtems_status_text (sc)); - cantProceed ("Can't create task variable mutex"); - } - } - rtems_task_mode (mode, RTEMS_PREEMPT_MASK, &mode); - } - sc = rtems_semaphore_obtain (taskVarMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); - if (sc != RTEMS_SUCCESSFUL) { - syslog (LOG_ERR, "Can't obtain task variable mutex: %s", rtems_status_text (sc)); - cantProceed ("Can't obtain task variable mutex"); - } + semMutexTake (taskVarMutex); } static void taskVarUnlock (void) { - rtems_status_code sc; - - sc = rtems_semaphore_release (taskVarMutex); - if (sc != RTEMS_SUCCESSFUL) { - syslog (LOG_ERR, "Can't release task variable mutex: %s", rtems_status_text (sc)); - cantProceed ("Can't release task variable mutex"); - } + semMutexGive (taskVarMutex); } /* @@ -128,13 +95,6 @@ threadWrapper (rtems_task_argument arg) { struct taskVar *v = (struct taskVar *)arg; - taskVarLock (); - v->forw = taskVarHead; - v->back = NULL; - if (v->forw) - v->forw->back = v; - taskVarHead = v; - taskVarUnlock (); (*v->funptr)(v->parm); taskVarLock (); if (v->back) @@ -149,6 +109,15 @@ threadWrapper (rtems_task_argument arg) rtems_task_delete (RTEMS_SELF); } +/* + * OS-dependent initialization + */ +static void +threadInitRTEMS (void *unused) +{ + taskVarMutex = semMutexMustCreate (); +} + /* * Create and start a new thread */ @@ -162,7 +131,9 @@ threadCreate (const char *name, rtems_status_code sc; rtems_unsigned32 note; char c[4]; + static threadOnceId initId; + threadOnce (&initId, threadInitRTEMS, NULL); if (stackSize < RTEMS_MINIMUM_STACK_SIZE) { errlogPrintf ("threadCreate %s illegal stackSize %d\n",name,stackSize); return 0; @@ -189,6 +160,13 @@ threadCreate (const char *name, v->threadVariablesAdded = 0; note = (rtems_unsigned32)v; rtems_task_set_note (RTEMS_SELF, RTEMS_NOTEPAD_TASKVAR, note); + taskVarLock (); + v->forw = taskVarHead; + v->back = NULL; + if (v->forw) + v->forw->back = v; + taskVarHead = v; + taskVarUnlock (); rtems_task_start (tid, threadWrapper, (rtems_task_argument)v); return (threadId)tid; } @@ -486,7 +464,8 @@ void threadShow (void) { struct taskVar *v; - printf (" NAME ID PRI STATE WAIT\n"); + printf (" NAME ID PRI STATE WAIT \n"); + printf ("+-----------+--------+---+-----------+--------+\n"); taskVarLock (); for (v = taskVarHead ; v != NULL ; v = v->forw) { printf ("%12.12s %8.8x", v->name, v->id);