summaryrefslogtreecommitdiffstats
path: root/c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2002-03-01 17:45:33 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2002-03-01 17:45:33 +0000
commit49155d9325425744ca9fdff8781c1681a63a7a83 (patch)
tree15bbd467970406cd739ba29f8296ef251be925ef /c
parent2002-03-01 Joel Sherrill <joel@OARcorp.com> (diff)
downloadrtems-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 'c')
-rw-r--r--c/src/exec/libcsupport/src/gxx_wrappers.c19
-rw-r--r--c/src/lib/ChangeLog6
-rw-r--r--c/src/lib/libc/gxx_wrappers.c19
3 files changed, 24 insertions, 20 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;
}