diff --git a/examples/thread_test.c b/examples/thread_test.c index 8ee63e0a9f6adb2cf590b1dbaf369bc885b3a4b5..15cebb9bb5510fc97b55c4c4892341fd78a0ab5e 100644 --- a/examples/thread_test.c +++ b/examples/thread_test.c @@ -13,7 +13,7 @@ void runner(int type, void* data) { - printf("%i\n", qsched_get_tid(&s)); + printf("%i\n", qsched_get_tid()); } diff --git a/src/fqsched.F90 b/src/fqsched.F90 index 22822d33e912ab4def6258534288276bd9904267..6a705d537103d0392e78d7768a6c7393ed8074aa 100644 --- a/src/fqsched.F90 +++ b/src/fqsched.F90 @@ -25,10 +25,9 @@ Module quicksched Interface - Integer(Kind=C_INT) Function qsched_get_tid(s) BIND(C) + Integer(Kind=C_INT) Function qsched_get_tid() BIND(C) Use, Intrinsic :: ISO_C_BINDING Implicit None - Type(C_PTR), VALUE :: s End Function Type(C_PTR) Function f_qsched_create() BIND(C) diff --git a/src/qsched.c b/src/qsched.c index 5fb406afcb3949bd6f39887c26a95cb52915c985..30c9111bcbc235c6b540ad2e888fdf6a9e2bf28d 100644 --- a/src/qsched.c +++ b/src/qsched.c @@ -50,6 +50,9 @@ char *qsched_timer_names[ qsched_timer_count ] = { "queue" , "qlock" , "lock" , "gettask" , "done" , "prepare" }; +#if defined( HAVE_PTHREAD ) +pthread_key_t qsched_pointer; +#endif /** * @brief Change the owner of a resource. @@ -412,6 +415,7 @@ void *qsched_pthread_run ( void *in ) { struct task *t; #if defined ( HAVE_PTHREAD ) pthread_setspecific(s->thread_id_key, &r->tid); + pthread_setspecific(qsched_pointer, r->s); #endif /* Main loop. */ while ( 1 ) { @@ -529,8 +533,12 @@ void qsched_run ( struct qsched *s , int nr_threads , qsched_funtype fun ) { } -int qsched_get_tid(struct qsched *s) { - if( !HAVE_OPENMP || s->flags & (qsched_flag_yield | qsched_flag_pthread ) ) +int qsched_get_tid() { + struct qsched *s = NULL; + #if defined( HAVE_PTHREAD ) + s = (struct qsched *)pthread_getspecific(qsched_pointer); + #endif + if( s != NULL ) return *(int*)pthread_getspecific(s->thread_id_key); else return omp_get_thread_num(); @@ -1557,6 +1565,7 @@ void qsched_free ( struct qsched *s ) { s->runners_count = 0; } pthread_key_delete(s->thread_id_key); + pthread_key_delete(qsched_pointer); #endif /* Clear the flags. */ @@ -1646,6 +1655,7 @@ void qsched_init ( struct qsched *s , int nr_queues , int flags ) { error( "Failed to lock barrier mutex." ); } pthread_key_create(&s->thread_id_key, NULL); + pthread_key_create(&qsched_pointer, NULL); #endif /* Clear the timers. */ diff --git a/src/qsched.h b/src/qsched.h index b92c67d81d5378204345c8b3b224241965de2c63..47bf8e700dbd87e8b82a0453fa19c80a2092e0ab 100644 --- a/src/qsched.h +++ b/src/qsched.h @@ -212,7 +212,7 @@ void qsched_reset ( struct qsched *s ); void qsched_addtask_dynamic ( struct qsched *s , int type , unsigned int flags , void *data , int data_size , int cost , qsched_res_t *locks , int nr_locks , qsched_res_t *uses , int nr_uses ); void qsched_ensure ( struct qsched *s , int nr_tasks , int nr_res , int nr_deps , int nr_locks , int nr_uses , int size_data ); void qsched_res_own ( struct qsched *s , qsched_res_t res , int owner ); -int qsched_get_tid(struct qsched *s); +int qsched_get_tid(); struct qsched * f_qsched_create(); void f_qsched_destroy( struct qsched *s);