1 /* stack.c - stack handling routines */
5 #if defined( HAVE_LWP )
10 #include <ac/socket.h>
16 #include <lwp/stackdep.h>
18 #define MAX_STACK 51200
19 #define MAX_THREADS 20
23 stkalign_t *stk_stack;
26 static struct stackinfo *stacks;
29 get_stack( int *stacknop )
33 if ( stacks == NULL ) {
34 stacks = (struct stackinfo *) ch_calloc( 1, MAX_THREADS *
35 sizeof(struct stackinfo) );
38 for ( i = 0; i < MAX_THREADS; i++ ) {
39 if ( stacks[i].stk_inuse == 0 ) {
44 if ( i == MAX_THREADS ) {
45 Debug( LDAP_DEBUG_ANY,
46 "no more stacks (max %d) - increase MAX_THREADS for more",
51 if ( stacks[i].stk_stack == NULL ) {
52 stacks[i].stk_stack = (stkalign_t *) malloc(
53 (MAX_STACK / sizeof(stkalign_t) + 1 )
54 * sizeof(stkalign_t) );
58 stacks[i].stk_inuse = 1;
59 return( stacks[i].stk_stack + MAX_STACK / sizeof(stkalign_t) );
67 if ( stackno < 0 || stackno > MAX_THREADS ) {
68 Debug( LDAP_DEBUG_ANY, "free_stack of bogus stack %d",
72 stacks[stackno].stk_inuse = 0;