diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2002-03-01 17:45:33 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2002-03-01 17:45:33 +0000 |
commit | 49155d9325425744ca9fdff8781c1681a63a7a83 (patch) | |
tree | 15bbd467970406cd739ba29f8296ef251be925ef | |
parent | 2002-03-01 Joel Sherrill <joel@OARcorp.com> (diff) | |
download | rtems-49155d9325425744ca9fdff8781c1681a63a7a83.tar.bz2 |
2002-03-01 Eric Norum <eric.norum@usask.ca>
* libc/gxx_wrappers.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.
Diffstat (limited to '')
-rw-r--r-- | c/src/exec/libcsupport/src/gxx_wrappers.c | 19 | ||||
-rw-r--r-- | c/src/lib/ChangeLog | 6 | ||||
-rw-r--r-- | c/src/lib/libc/gxx_wrappers.c | 19 | ||||
-rw-r--r-- | cpukit/libcsupport/src/gxx_wrappers.c | 19 |
4 files changed, 33 insertions, 30 deletions
diff --git a/c/src/exec/libcsupport/src/gxx_wrappers.c b/c/src/exec/libcsupport/src/gxx_wrappers.c index bf3d41cde1..48f91aff19 100644 --- a/c/src/exec/libcsupport/src/gxx_wrappers.c +++ b/c/src/exec/libcsupport/src/gxx_wrappers.c @@ -63,17 +63,16 @@ int rtems_gxx_once(__gthread_once_t *once, void (*func) ()) #ifdef DEBUG_GXX_WRAPPERS printk( "gxx_wrappers: once=%x, func=%x\n", *once, func ); #endif - if( *once == 0 ) + if( *(volatile __gthread_once_t *)once == 0 ) { - /* - * NOTE: could not use the call to disable "preemption", it causes - * one exception. Somebody might want to investiage it further - * sometime later. - */ - _Thread_Disable_dispatch(); - *once = 1; - (*func)(); - _Thread_Enable_dispatch(); + rtems_mode saveMode; + rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode); + if( *(volatile __gthread_once_t *)once == 0 ) + { + *(volatile __gthread_once_t *)once = 1; + (*func)(); + } + rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode); } return 0; } diff --git a/c/src/lib/ChangeLog b/c/src/lib/ChangeLog index 06da663a58..0be8ed83b3 100644 --- a/c/src/lib/ChangeLog +++ b/c/src/lib/ChangeLog @@ -1,3 +1,9 @@ +2002-03-01 Eric Norum <eric.norum@usask.ca> + + * libc/gxx_wrappers.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. + 2001-01-31 Mike Siers <mikes@poliac.com> * Nice Update of PPPD support which eliminates the diff --git a/c/src/lib/libc/gxx_wrappers.c b/c/src/lib/libc/gxx_wrappers.c index bf3d41cde1..48f91aff19 100644 --- a/c/src/lib/libc/gxx_wrappers.c +++ b/c/src/lib/libc/gxx_wrappers.c @@ -63,17 +63,16 @@ int rtems_gxx_once(__gthread_once_t *once, void (*func) ()) #ifdef DEBUG_GXX_WRAPPERS printk( "gxx_wrappers: once=%x, func=%x\n", *once, func ); #endif - if( *once == 0 ) + if( *(volatile __gthread_once_t *)once == 0 ) { - /* - * NOTE: could not use the call to disable "preemption", it causes - * one exception. Somebody might want to investiage it further - * sometime later. - */ - _Thread_Disable_dispatch(); - *once = 1; - (*func)(); - _Thread_Enable_dispatch(); + rtems_mode saveMode; + rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode); + if( *(volatile __gthread_once_t *)once == 0 ) + { + *(volatile __gthread_once_t *)once = 1; + (*func)(); + } + rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode); } return 0; } diff --git a/cpukit/libcsupport/src/gxx_wrappers.c b/cpukit/libcsupport/src/gxx_wrappers.c index bf3d41cde1..48f91aff19 100644 --- a/cpukit/libcsupport/src/gxx_wrappers.c +++ b/cpukit/libcsupport/src/gxx_wrappers.c @@ -63,17 +63,16 @@ int rtems_gxx_once(__gthread_once_t *once, void (*func) ()) #ifdef DEBUG_GXX_WRAPPERS printk( "gxx_wrappers: once=%x, func=%x\n", *once, func ); #endif - if( *once == 0 ) + if( *(volatile __gthread_once_t *)once == 0 ) { - /* - * NOTE: could not use the call to disable "preemption", it causes - * one exception. Somebody might want to investiage it further - * sometime later. - */ - _Thread_Disable_dispatch(); - *once = 1; - (*func)(); - _Thread_Enable_dispatch(); + rtems_mode saveMode; + rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode); + if( *(volatile __gthread_once_t *)once == 0 ) + { + *(volatile __gthread_once_t *)once = 1; + (*func)(); + } + rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode); } return 0; } |