1 /* stack.c - stack handling routines */
5 #if defined( HAVE_LWP )
10 #include <ac/socket.h>
17 #include <lwp/stackdep.h>
19 #define MAX_STACK 51200
20 #define MAX_THREADS 20
24 stkalign_t *stk_stack;
27 static struct stackinfo *stacks;
30 get_stack( int *stacknop )
34 if ( stacks == NULL ) {
35 stacks = (struct stackinfo *) ch_calloc( 1, MAX_THREADS *
36 sizeof(struct stackinfo) );
39 for ( i = 0; i < MAX_THREADS; i++ ) {
40 if ( stacks[i].stk_inuse == 0 ) {
45 if ( i == MAX_THREADS ) {
46 Debug( LDAP_DEBUG_ANY,
47 "no more stacks (max %d) - increase MAX_THREADS for more",
52 if ( stacks[i].stk_stack == NULL ) {
53 stacks[i].stk_stack = (stkalign_t *) malloc(
54 (MAX_STACK / sizeof(stkalign_t) + 1 )
55 * sizeof(stkalign_t) );
59 stacks[i].stk_inuse = 1;
60 return( stacks[i].stk_stack + MAX_STACK / sizeof(stkalign_t) );
68 if ( stackno < 0 || stackno > MAX_THREADS ) {
69 Debug( LDAP_DEBUG_ANY, "free_stack of bogus stack %d",
73 stacks[stackno].stk_inuse = 0;