]> git.sur5r.net Git - openldap/blob - libraries/liblthread/stack.c
Add basic NT thread support.
[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 #include "ldap_log.h"
15
16 #include <lwp/lwp.h>
17 #include <lwp/stackdep.h>
18
19 #define MAX_STACK       51200
20 #define MAX_THREADS     20
21
22 struct stackinfo {
23         int             stk_inuse;
24         stkalign_t      *stk_stack;
25 };
26
27 static struct stackinfo *stacks;
28
29 stkalign_t *
30 get_stack( int *stacknop )
31 {
32         int     i;
33
34         if ( stacks == NULL ) {
35                 stacks = (struct stackinfo *) ch_calloc( 1, MAX_THREADS *
36                     sizeof(struct stackinfo) );
37         }
38
39         for ( i = 0; i < MAX_THREADS; i++ ) {
40                 if ( stacks[i].stk_inuse == 0 ) {
41                         break;
42                 }
43         }
44
45         if ( i == MAX_THREADS ) {
46                 Debug( LDAP_DEBUG_ANY,
47                     "no more stacks (max %d) - increase MAX_THREADS for more",
48                     MAX_THREADS, 0, 0 );
49                 return( NULL );
50         }
51
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) );
56         }
57
58         *stacknop = i;
59         stacks[i].stk_inuse = 1;
60         return( stacks[i].stk_stack + MAX_STACK / sizeof(stkalign_t) );
61 }
62
63 void
64 free_stack(
65     int stackno
66 )
67 {
68         if ( stackno < 0 || stackno > MAX_THREADS ) {
69                 Debug( LDAP_DEBUG_ANY, "free_stack of bogus stack %d",
70                     stackno, 0, 0 );
71         }
72
73         stacks[stackno].stk_inuse = 0;
74 }
75
76 #endif