This is the mail archive of the
ecos-devel@sourceware.org
mailing list for the eCos project.
pthread_once non conformant
- From: Jerome Souquieres <jerome dot souquieres at gmail dot com>
- To: ecos-devel at ecos dot sourceware dot org
- Date: Sun, 1 Nov 2009 15:52:27 -0500
- Subject: pthread_once non conformant
Hi,
I think I've spotted a bug in pthread_once (in ecos v3.0). The current
implementation does not enforce the part of the specification that
says: "On return from pthread_once(), it is guaranteed that
init_routine() has completed".
Here is a proposal for a patch, I did not post it to ecos-patches
because I currently don't have a working eCos target to test this.
--- pthread.cxx 2009-01-29 18:47:52.000000000 +0100
+++ pthread-fixonce.cxx 2009-11-01 21:07:42.639875000 +0100
@@ -1328,22 +1328,23 @@ externC int pthread_once (pthread_once_t
PTHREAD_ENTRY();
PTHREAD_CHECK( once_control );
PTHREAD_CHECK( init_routine );
- pthread_once_t old;
-
- // Do a test and set on the once_control object.
pthread_mutex.lock();
- old = *once_control;
- *once_control = 1;
+ // If the once_control is zero, call the init_routine().
+ // the mutex must stay locked during init_routine because
+ // concurrent threads must be blocked until init_routine has
+ // done its business
+ if ( !*once_control )
+ {
+ init_routine();
+ *once_control = 1;
+ }
pthread_mutex.unlock();
-
- // If the once_control was zero, call the init_routine().
- if( !old ) init_routine();
PTHREAD_RETURN(0);
}