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