]> git.sur5r.net Git - openldap/blob - libraries/liblthread/stack.c
Update for Alpha3 from -devel as of OPENLDAP_DEVEL_981116.
[openldap] / libraries / liblthread / stack.c
1 /* stack.c - stack handling routines */
2
3 #include "portable.h"
4
5 #if defined( HAVE_LWP )
6
7 #include <stdio.h>
8
9 #include <ac/time.h>
10 #include <ac/socket.h>
11
12 #include "lber.h"
13 #include "ldap.h"
14
15 #include <lwp/lwp.h>
16 #include <lwp/stackdep.h>
17
18 #define MAX_STACK       51200
19 #define MAX_THREADS     20
20
21 struct stackinfo {
22         int             stk_inuse;
23         stkalign_t      *stk_stack;
24 };
25
26 static struct stackinfo *stacks;
27
28 stkalign_t *
29 get_stack( int *stacknop )
30 {
31         int     i;
32
33         if ( stacks == NULL ) {
34                 stacks = (struct stackinfo *) ch_calloc( 1, MAX_THREADS *
35                     sizeof(struct stackinfo) );
36         }
37
38         for ( i = 0; i < MAX_THREADS; i++ ) {
39                 if ( stacks[i].stk_inuse == 0 ) {
40                         break;
41                 }
42         }
43
44         if ( i == MAX_THREADS ) {
45                 Debug( LDAP_DEBUG_ANY,
46                     "no more stacks (max %d) - increase MAX_THREADS for more",
47                     MAX_THREADS, 0, 0 );
48                 return( NULL );
49         }
50
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) );
55         }
56
57         *stacknop = i;
58         stacks[i].stk_inuse = 1;
59         return( stacks[i].stk_stack + MAX_STACK / sizeof(stkalign_t) );
60 }
61
62 void
63 free_stack(
64     int stackno
65 )
66 {
67         if ( stackno < 0 || stackno > MAX_THREADS ) {
68                 Debug( LDAP_DEBUG_ANY, "free_stack of bogus stack %d",
69                     stackno, 0, 0 );
70         }
71
72         stacks[stackno].stk_inuse = 0;
73 }
74
75 #endif