Commit | Line | Data |
---|---|---|
c906108c SS |
1 | /* |
2 | * (c) Copyright 1990-1996 OPEN SOFTWARE FOUNDATION, INC. | |
3 | * (c) Copyright 1990-1996 HEWLETT-PACKARD COMPANY | |
4 | * (c) Copyright 1990-1996 DIGITAL EQUIPMENT CORPORATION | |
5 | * (c) Copyright 1991, 1992 Siemens-Nixdorf Information Systems | |
6 | * To anyone who acknowledges that this file is provided "AS IS" without | |
7 | * any express or implied warranty: permission to use, copy, modify, and | |
8 | * distribute this file for any purpose is hereby granted without fee, | |
9 | * provided that the above copyright notices and this notice appears in | |
10 | * all source code copies, and that none of the names listed above be used | |
11 | * in advertising or publicity pertaining to distribution of the software | |
12 | * without specific, written prior permission. None of these organizations | |
13 | * makes any representations about the suitability of this software for | |
14 | * any purpose. | |
15 | */ | |
16 | /* | |
17 | * Header file for stack management (internal to cma_stack.c, but | |
18 | * separate for convenience, and unit testing). | |
19 | */ | |
20 | \f | |
21 | #ifndef CMA_STACK_INT | |
22 | #define CMA_STACK_INT | |
23 | ||
24 | /* | |
25 | * INCLUDE FILES | |
26 | */ | |
27 | ||
28 | #include <cma.h> | |
29 | #include <cma_queue.h> | |
30 | #include <cma_list.h> | |
31 | #include <cma_tcb_defs.h> | |
32 | ||
33 | /* | |
34 | * CONSTANTS AND MACROS | |
35 | */ | |
36 | ||
37 | #define cma___c_first_free_chunk 0 | |
38 | #define cma___c_min_count 2 /* Smallest number of chunks to leave */ | |
39 | #define cma___c_end (-1) /* End of free list (flag) */ | |
40 | #define cma__c_yellow_size 0 | |
41 | ||
42 | /* | |
43 | * Cluster types | |
44 | */ | |
45 | #define cma___c_cluster 0 /* Default cluster */ | |
46 | #define cma___c_bigstack 1 /* Looks like a cluster, but it's a stack */ | |
47 | ||
48 | ||
49 | #define cma___c_null_cluster (cma___t_cluster *)cma_c_null_ptr | |
50 | ||
51 | ||
52 | /* | |
53 | * TYPEDEFS | |
54 | */ | |
55 | ||
56 | #ifndef __STDC__ | |
57 | struct CMA__T_INT_STACK; | |
58 | #endif | |
59 | ||
60 | typedef cma_t_natural cma___t_index; /* Type for chunk index */ | |
61 | ||
62 | typedef struct CMA___T_CLU_DESC { | |
63 | cma__t_list list; /* Queue element for cluster list */ | |
64 | cma_t_integer type; /* Type of cluster */ | |
65 | cma_t_address stacks; | |
66 | cma_t_address limit; | |
67 | } cma___t_clu_desc; | |
68 | ||
69 | typedef union CMA___T_MAP_ENTRY { | |
70 | struct { | |
71 | cma__t_int_tcb *tcb; /* TCB associated with stack chunk */ | |
72 | struct CMA__T_INT_STACK *stack; /* Stack desc. ass. with stack chunk */ | |
73 | } mapped; | |
74 | struct { | |
75 | cma___t_index size; /* Number of chunks in block */ | |
76 | cma___t_index next; /* Next free block */ | |
77 | } free; | |
78 | } cma___t_map_entry; | |
79 | ||
80 | /* | |
81 | * NOTE: It is VERY IMPORTANT that both cma___t_cluster and cma___t_bigstack | |
82 | * begin with the cma___t_clu_desc structure, as there is some code in the | |
83 | * stack manager that relies on being able to treat both as equivalent! | |
84 | */ | |
85 | typedef struct CMA___T_CLUSTER { | |
86 | cma___t_clu_desc desc; /* Describe this cluster */ | |
87 | cma___t_map_entry map[cma__c_chunk_count]; /* thread map */ | |
88 | cma___t_index free; /* First free chunk index */ | |
89 | } cma___t_cluster; | |
90 | ||
91 | /* | |
92 | * NOTE: It is VERY IMPORTANT that both cma___t_cluster and cma___t_bigstack | |
93 | * begin with the cma___t_clu_desc structure, as there is some code in the | |
94 | * stack manager that relies on being able to treat both as equivalent! | |
95 | */ | |
96 | typedef struct CMA___T_BIGSTACK { | |
97 | cma___t_clu_desc desc; /* Describe this cluster */ | |
98 | cma__t_int_tcb *tcb; /* TCB associated with stack */ | |
99 | struct CMA__T_INT_STACK *stack; /* Stack desc. ass. with stack */ | |
100 | cma_t_natural size; /* Size of big stack */ | |
101 | cma_t_boolean in_use; /* Set if allocated */ | |
102 | } cma___t_bigstack; | |
103 | ||
104 | #if _CMA_PROTECT_MEMORY_ | |
105 | typedef struct CMA___T_INT_HOLE { | |
106 | cma__t_queue link; /* Link holes together */ | |
107 | cma_t_boolean protected; /* Set when pages are protected */ | |
108 | cma_t_address first; /* First protected byte */ | |
109 | cma_t_address last; /* Last protected byte */ | |
110 | } cma___t_int_hole; | |
111 | #endif | |
112 | ||
113 | typedef struct CMA__T_INT_STACK { | |
114 | cma__t_object header; /* Common header (sequence, type info */ | |
115 | cma__t_int_attr *attributes; /* Backpointer to attr obj */ | |
116 | cma___t_cluster *cluster; /* Stack's cluster */ | |
117 | cma_t_address stack_base; /* base address of stack */ | |
118 | cma_t_address yellow_zone; /* first address of yellow zone */ | |
119 | cma_t_address last_guard; /* last address of guard pages */ | |
120 | cma_t_natural first_chunk; /* First chunk allocated */ | |
121 | cma_t_natural chunk_count; /* Count of chunks allocated */ | |
122 | cma__t_int_tcb *tcb; /* TCB backpointer */ | |
123 | #if _CMA_PROTECT_MEMORY_ | |
124 | cma___t_int_hole hole; /* Description of hole */ | |
125 | #endif | |
126 | } cma__t_int_stack; | |
127 | ||
128 | /* | |
129 | * GLOBAL DATA | |
130 | */ | |
131 | ||
132 | /* | |
133 | * INTERNAL INTERFACES | |
134 | */ | |
135 | ||
136 | #endif |