X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap_r%2Fthr_pth.c;h=f06efe0d130730637c29e3a188e3b6209abecca6;hb=2473af7b546439fdc5fb552fdfbd724a1633f37d;hp=15fcac75a8c3889436123b6ee74248cf690fe952;hpb=ec426532b2cca95330566b1941795dac7e03bb57;p=openldap diff --git a/libraries/libldap_r/thr_pth.c b/libraries/libldap_r/thr_pth.c index 15fcac75a8..f06efe0d13 100644 --- a/libraries/libldap_r/thr_pth.c +++ b/libraries/libldap_r/thr_pth.c @@ -1,21 +1,29 @@ +/* thr_pth.c - wrappers around GNU Pth */ /* $OpenLDAP$ */ -/* - * Copyright 1998-2000 The OpenLDAP Foundation, Redwood City, California, USA +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2007 The OpenLDAP Foundation. * All rights reserved. * - * Redistribution and use in source and binary forms are permitted only - * as authorized by the OpenLDAP Public License. A copy of this - * license is available at http://www.OpenLDAP.org/license.html or - * in file LICENSE in the top-level directory of the distribution. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ -/* thr_thr.c - wrappers around solaris threads */ - #include "portable.h" #if defined( HAVE_GNU_PTH ) -#include "ldap_pvt_thread.h" +#include "ldap_pvt_thread.h" /* Get the thread interface */ +#define LDAP_THREAD_IMPLEMENTATION +#define LDAP_THREAD_RDWR_IMPLEMENTATION +#include "ldap_thr_debug.h" /* May rename the symbols defined below */ + +#include /******************* * * @@ -24,6 +32,7 @@ *******************/ static pth_attr_t detach_attr; +static pth_attr_t joined_attr; int ldap_int_thread_initialize( void ) @@ -32,6 +41,11 @@ ldap_int_thread_initialize( void ) return -1; } detach_attr = pth_attr_new(); + joined_attr = pth_attr_new(); +#ifdef LDAP_PVT_THREAD_SET_STACK_SIZE + pth_attr_set( joined_attr, PTH_ATTR_STACK_SIZE, LDAP_PVT_THREAD_STACK_SIZE ); + pth_attr_set( detach_attr, PTH_ATTR_STACK_SIZE, LDAP_PVT_THREAD_STACK_SIZE ); +#endif return pth_attr_set( detach_attr, PTH_ATTR_JOINABLE, FALSE ); } @@ -49,10 +63,10 @@ ldap_pvt_thread_create( ldap_pvt_thread_t * thread, void *(*start_routine)( void *), void *arg) { - *thread = pth_spawn( detach ? detach_attr : PTH_ATTR_DEFAULT, + *thread = pth_spawn( detach ? detach_attr : joined_attr, start_routine, arg ); - return *thread == NULL; + return *thread == NULL ? errno : 0; } void @@ -63,47 +77,44 @@ ldap_pvt_thread_exit( void *retval ) int ldap_pvt_thread_join( ldap_pvt_thread_t thread, void **thread_return ) { - pth_join( thread, thread_return ); - return 0; + return pth_join( thread, thread_return ) ? 0 : errno; } int ldap_pvt_thread_kill( ldap_pvt_thread_t thread, int signo ) { - pth_raise( thread, signo ); - return 0; + return pth_raise( thread, signo ) ? 0 : errno; } int ldap_pvt_thread_yield( void ) { - pth_yield(NULL); - return 0; + return pth_yield(NULL) ? 0 : errno; } int ldap_pvt_thread_cond_init( ldap_pvt_thread_cond_t *cond ) { - return( pth_cond_init( cond ) ); + return( pth_cond_init( cond ) ? 0 : errno ); } int ldap_pvt_thread_cond_signal( ldap_pvt_thread_cond_t *cond ) { - return( pth_cond_notify( cond, 0 ) ); + return( pth_cond_notify( cond, 0 ) ? 0 : errno ); } int ldap_pvt_thread_cond_broadcast( ldap_pvt_thread_cond_t *cond ) { - return( pth_cond_notify( cond, 1 ) ); + return( pth_cond_notify( cond, 1 ) ? 0 : errno ); } int ldap_pvt_thread_cond_wait( ldap_pvt_thread_cond_t *cond, ldap_pvt_thread_mutex_t *mutex ) { - return( pth_cond_await( cond, mutex, NULL ) ); + return( pth_cond_await( cond, mutex, NULL ) ? 0 : errno ); } int @@ -115,7 +126,7 @@ ldap_pvt_thread_cond_destroy( ldap_pvt_thread_cond_t *cv ) int ldap_pvt_thread_mutex_init( ldap_pvt_thread_mutex_t *mutex ) { - return( pth_mutex_init( mutex ) ); + return( pth_mutex_init( mutex ) ? 0 : errno ); } int @@ -127,26 +138,57 @@ ldap_pvt_thread_mutex_destroy( ldap_pvt_thread_mutex_t *mutex ) int ldap_pvt_thread_mutex_lock( ldap_pvt_thread_mutex_t *mutex ) { - return( pth_mutex_acquire( mutex, 0, NULL ) ); + return( pth_mutex_acquire( mutex, 0, NULL ) ? 0 : errno ); } int ldap_pvt_thread_mutex_unlock( ldap_pvt_thread_mutex_t *mutex ) { - return( pth_mutex_release( mutex ) ); + return( pth_mutex_release( mutex ) ? 0 : errno ); } int ldap_pvt_thread_mutex_trylock( ldap_pvt_thread_mutex_t *mutex ) { - return( pth_mutex_acquire( mutex, 1, NULL ) ); + return( pth_mutex_acquire( mutex, 1, NULL ) ? 0 : errno ); +} + +ldap_pvt_thread_t +ldap_pvt_thread_self( void ) +{ + return pth_self(); +} + +int +ldap_pvt_thread_key_create( ldap_pvt_thread_key_t *key ) +{ + return pth_key_create( key, NULL ); +} + +int +ldap_pvt_thread_key_destroy( ldap_pvt_thread_key_t key ) +{ + return pth_key_delete( key ); +} + +int +ldap_pvt_thread_key_setdata( ldap_pvt_thread_key_t key, void *data ) +{ + return pth_key_setdata( key, data ); +} + +int +ldap_pvt_thread_key_getdata( ldap_pvt_thread_key_t key, void **data ) +{ + *data = pth_key_getdata( key ); + return 0; } #ifdef LDAP_THREAD_HAVE_RDWR int ldap_pvt_thread_rdwr_init( ldap_pvt_thread_rdwr_t *rw ) { - return pth_rwlock_init( rw ); + return pth_rwlock_init( rw ) ? 0 : errno; } int @@ -157,32 +199,32 @@ ldap_pvt_thread_rdwr_destroy( ldap_pvt_thread_rdwr_t *rw ) int ldap_pvt_thread_rdwr_rlock( ldap_pvt_thread_rdwr_t *rw ) { - return pth_rwlock_acquire( rw, PTH_RWLOCK_RD, 0, NULL ); + return pth_rwlock_acquire( rw, PTH_RWLOCK_RD, 0, NULL ) ? 0 : errno; } int ldap_pvt_thread_rdwr_rtrylock( ldap_pvt_thread_rdwr_t *rw ) { - return pth_rwlock_acquire( rw, PTH_RWLOCK_RD, 1, NULL ); + return pth_rwlock_acquire( rw, PTH_RWLOCK_RD, 1, NULL ) ? 0 : errno; } int ldap_pvt_thread_rdwr_runlock( ldap_pvt_thread_rdwr_t *rw ) { - return pth_rwlock_release( rw ); + return pth_rwlock_release( rw ) ? 0 : errno; } int ldap_pvt_thread_rdwr_wlock( ldap_pvt_thread_rdwr_t *rw ) { - return pth_rwlock_acquire( rw, PTH_RWLOCK_RW, 0, NULL ); + return pth_rwlock_acquire( rw, PTH_RWLOCK_RW, 0, NULL ) ? 0 : errno; } int ldap_pvt_thread_rdwr_wtrylock( ldap_pvt_thread_rdwr_t *rw ) { - return pth_rwlock_acquire( rw, PTH_RWLOCK_RW, 1, NULL ); + return pth_rwlock_acquire( rw, PTH_RWLOCK_RW, 1, NULL ) ? 0 : errno; } int ldap_pvt_thread_rdwr_wunlock( ldap_pvt_thread_rdwr_t *rw ) { - return pth_rwlock_release( rw ); + return pth_rwlock_release( rw ) ? 0 : errno; } #endif /* LDAP_THREAD_HAVE_RDWR */