diff --git a/c/src/exec/posix/ChangeLog b/c/src/exec/posix/ChangeLog index ff7f08e46e..82b7305b22 100644 --- a/c/src/exec/posix/ChangeLog +++ b/c/src/exec/posix/ChangeLog @@ -1,3 +1,9 @@ +2002-03-01 Eric Norum + + * src/pthreadonce.c: Task is not preemptable while running a + pthread_once init function. This is slightly less heavy handed + than disabling dispatching and seems better than consuming a mutex. + 2002-02-09 Ralf Corsepius * src/getegid.c: Add #include . diff --git a/c/src/exec/posix/src/pthreadonce.c b/c/src/exec/posix/src/pthreadonce.c index 6026dfe7c0..94cbb005da 100644 --- a/c/src/exec/posix/src/pthreadonce.c +++ b/c/src/exec/posix/src/pthreadonce.c @@ -18,6 +18,7 @@ #include #include +#include #include #include @@ -29,15 +30,16 @@ int pthread_once( if ( !once_control || !init_routine ) return EINVAL; - _Thread_Disable_dispatch(); - if ( !once_control->init_executed ) { - once_control->is_initialized = TRUE; - once_control->init_executed = TRUE; - (*init_routine)(); + rtems_mode saveMode; + rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode); + if ( !once_control->init_executed ) { + once_control->is_initialized = TRUE; + once_control->init_executed = TRUE; + (*init_routine)(); + } + rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode); } - - _Thread_Enable_dispatch(); return 0; } diff --git a/cpukit/posix/ChangeLog b/cpukit/posix/ChangeLog index ff7f08e46e..82b7305b22 100644 --- a/cpukit/posix/ChangeLog +++ b/cpukit/posix/ChangeLog @@ -1,3 +1,9 @@ +2002-03-01 Eric Norum + + * src/pthreadonce.c: Task is not preemptable while running a + pthread_once init function. This is slightly less heavy handed + than disabling dispatching and seems better than consuming a mutex. + 2002-02-09 Ralf Corsepius * src/getegid.c: Add #include . diff --git a/cpukit/posix/src/pthreadonce.c b/cpukit/posix/src/pthreadonce.c index 6026dfe7c0..94cbb005da 100644 --- a/cpukit/posix/src/pthreadonce.c +++ b/cpukit/posix/src/pthreadonce.c @@ -18,6 +18,7 @@ #include #include +#include #include #include @@ -29,15 +30,16 @@ int pthread_once( if ( !once_control || !init_routine ) return EINVAL; - _Thread_Disable_dispatch(); - if ( !once_control->init_executed ) { - once_control->is_initialized = TRUE; - once_control->init_executed = TRUE; - (*init_routine)(); + rtems_mode saveMode; + rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode); + if ( !once_control->init_executed ) { + once_control->is_initialized = TRUE; + once_control->init_executed = TRUE; + (*init_routine)(); + } + rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode); } - - _Thread_Enable_dispatch(); return 0; }