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