X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap_r%2Fthr_lwp.c;h=3dabfe4fb725c197362bbdf54a721970a7f75f9d;hb=c79267b88aa70396f55c9368849ee70411c0ef79;hp=f9bc0b415f7dab16df43d3d9afdbeb0d9206ffd3;hpb=73b846c0112a78033b93f647b85f1bfaa5ee97f2;p=openldap diff --git a/libraries/libldap_r/thr_lwp.c b/libraries/libldap_r/thr_lwp.c index f9bc0b415f..3dabfe4fb7 100644 --- a/libraries/libldap_r/thr_lwp.c +++ b/libraries/libldap_r/thr_lwp.c @@ -1,22 +1,25 @@ -/* - * Copyright 1998,1999 The OpenLDAP Foundation, Redwood City, California, USA +/* thr_lwp.c - wrappers around SunOS LWP threads */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2009 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_lwp.c - wrappers around SunOS LWP threads */ - /* BUGS: * - slurpd calls the get_stack/free_stack functions. Should be fixed, so * they can become static. */ #include "portable.h" -#include "ldap_pvt_thread.h" #if defined( HAVE_LWP ) @@ -33,9 +36,11 @@ #include #include -#include "lber.h" -#include "ldap.h" -#include "ldap_log.h" +#include "ldap-int.h" + +#include "ldap_pvt_thread.h" /* Get the thread interface */ +#define LDAP_THREAD_IMPLEMENTATION +#include "ldap_thr_debug.h" /* May rename the symbols defined below */ #include #include @@ -47,7 +52,7 @@ * Initialize LWP by spinning of a schedular */ int -ldap_pvt_thread_initialize( void ) +ldap_int_thread_initialize( void ) { thread_t tid; stkalign_t *stack; @@ -62,9 +67,9 @@ ldap_pvt_thread_initialize( void ) } int -ldap_pvt_thread_destroy( void ) +ldap_int_thread_destroy( void ) { - /* need to destory lwp_scheduler thread and clean up private + /* need to destroy lwp_scheduler thread and clean up private variables */ return 0; } @@ -76,13 +81,19 @@ struct stackinfo { static struct stackinfo *stacks; -static stkalign_t * ldap_pvt_thread_get_stack( int *stacknop ) +static stkalign_t * ldap_int_thread_get_stack( int *stacknop ) { int i; if ( stacks == NULL ) { - stacks = (struct stackinfo *) ch_calloc( 1, MAX_THREADS * + stacks = (struct stackinfo *) LDAP_CALLOC( 1, MAX_THREADS * sizeof(struct stackinfo) ); + + if( stacks == NULL ) { + Debug( LDAP_DEBUG_ANY, "stacks allocation failed", + 0, 0, 0 ); + return NULL; + } } for ( i = 0; i < MAX_THREADS; i++ ) { @@ -99,9 +110,15 @@ static stkalign_t * ldap_pvt_thread_get_stack( int *stacknop ) } if ( stacks[i].stk_stack == NULL ) { - stacks[i].stk_stack = (stkalign_t *) malloc( + stacks[i].stk_stack = (stkalign_t *) LDAP_MALLOC( (MAX_STACK / sizeof(stkalign_t) + 1 ) * sizeof(stkalign_t) ); + + if( stacks[i].stk_stack == NULL ) { + Debug( LDAP_DEBUG_ANY, "stack allocation failed", + 0, 0, 0 ); + return( NULL ); + } } *stacknop = i; @@ -110,7 +127,7 @@ static stkalign_t * ldap_pvt_thread_get_stack( int *stacknop ) } static void -ldap_pvt_thread_free_stack( int stackno ) +ldap_int_thread_free_stack( int stackno ) { if ( stackno < 0 || stackno > MAX_THREADS ) { Debug( LDAP_DEBUG_ANY, "free_stack of bogus stack %d\n", @@ -120,12 +137,12 @@ ldap_pvt_thread_free_stack( int stackno ) stacks[stackno].stk_inuse = 0; } -static static void +static void lwp_create_stack( void *(*func)(), void *arg, int stackno ) { (*func)( arg ); - ldap_pvt_thread_free_stack( stackno ); + ldap_int_thread_free_stack( stackno ); } int @@ -137,7 +154,7 @@ ldap_pvt_thread_create( ldap_pvt_thread_t * thread, stkalign_t *stack; int stackno; - if ( (stack = ldap_pvt_thread_get_stack( &stackno )) == NULL ) { + if ( (stack = ldap_int_thread_get_stack( &stackno )) == NULL ) { return( -1 ); } return( lwp_create( thread, lwp_create_stack, MINPRIO, 0, @@ -180,7 +197,9 @@ ldap_pvt_thread_sleep( } } - nt = (tl_t *) malloc( sizeof( tl_t )); + nt = (tl_t *) LDAP_MALLOC( sizeof( tl_t )); + + if( nt == NULL ) return -1; nt->tl_next = sglob->tsl_list; nt->tl_wake = now + interval; @@ -294,7 +313,7 @@ ldap_pvt_thread_cond_signal( ldap_pvt_thread_cond_t *cond ) int ldap_pvt_thread_cond_wait( ldap_pvt_thread_cond_t *cond, - ldap_pvt_thread_mutex_t *mutex ) + ldap_pvt_thread_mutex_t *mutex ) { if ( ! cond->lcv_created ) { cv_create( &cond->lcv_cv, *mutex ); @@ -346,4 +365,14 @@ ldap_pvt_thread_cond_broadcast( ldap_pvt_thread_cond_t *cv ) return( cv->lcv_created ? cv_broadcast( cv->lcv_cv ) : 0 ); } +ldap_pvt_thread_t +ldap_pvt_thread_self( void ) +{ + thread_t mylwp; + + lwp_self( &mylwp ); + + return mylwp; +} + #endif /* HAVE_LWP */