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 attributes object
18 */
19
20#ifndef CMA_ATTR
21#define CMA_ATTR
22
23/*
24 *  INCLUDE FILES
25 */
26
27#include <cma_defs.h>
28#include <cma_queue.h>
29#ifdef __hpux
30# include <sys/param.h>
31#endif
32#if _CMA_UNIX_TYPE == _CMA__SVR4
33#include <sys/unistd.h>
34#endif
35/*
36 * CONSTANTS AND MACROS
37 */
38
39
40/*
41 *  FUNCTIONAL DESCRIPTION:
42 *
43 *	cma__int_attr_get_priority -  Performs the work of cma_attr_get_priority
44 *
45 *  FORMAL PARAMETERS:
46 *
47 *	cma_t_attr	    *_att_	- Attribute object to get from
48 *	cma_t_priority	    *_setting_	- Current setting
49 *
50 *  IMPLICIT INPUTS:
51 *
52 *	none
53 *
54 *  IMPLICIT OUTPUTS:
55 *
56 *	priority
57 *
58 *  FUNCTION VALUE:
59 *
60 *	none
61 *
62 *  SIDE EFFECTS:
63 *
64 *	none
65 */
66#define cma__int_attr_get_priority(_att_,_setting_) { \
67    cma__t_int_attr     *_int_att_; \
68    (_int_att_) = cma__validate_default_attr (_att_); \
69    cma__int_lock ((_int_att_)->mutex); \
70    (*(_setting_)) = (_int_att_)->priority; \
71    cma__int_unlock ((_int_att_)->mutex); \
72    }
73
74
75/*
76 *  FUNCTIONAL DESCRIPTION:
77 *
78 *	cma__int_attr_get_sched - Performs work of cma_attr_get_sched
79 *
80 *  FORMAL PARAMETERS:
81 *
82 *	cma_t_attr	    *_att_	_ Attributes object used
83 *	cma_t_sched_policy  *_setting_	- Current setting
84 *
85 *  IMPLICIT INPUTS:
86 *
87 *	none
88 *
89 *  IMPLICIT OUTPUTS:
90 *
91 *	scheduling policy
92 *
93 *  FUNCTION VALUE:
94 *
95 *	none
96 *
97 *  SIDE EFFECTS:
98 *
99 *	none
100 */
101#define cma__int_attr_get_sched(_att_,_setting_) { \
102    cma__t_int_attr     *_int_att_; \
103    (_int_att_) = cma__validate_default_attr (_att_); \
104    cma__int_lock ((_int_att_)->mutex); \
105    (*(_setting_)) = (_int_att_)->policy; \
106    cma__int_unlock ((_int_att_)->mutex); \
107    }
108
109
110/*
111 *  FUNCTIONAL DESCRIPTION:
112 *
113 *	cma__int_attr_get_inherit_sched - Performs work of
114 *	cma_attr_get_inherit_sched
115 *
116 *  FORMAL PARAMETERS:
117 *
118 *	cma_t_attr	    *_att_	- Attributes object to use
119 *	cma_t_sched_inherit *_setting_	- Current setting
120 *
121 *  IMPLICIT INPUTS:
122 *
123 *	none
124 *
125 *  IMPLICIT OUTPUTS:
126 *
127 *	Inheritable scheduling policy
128 *
129 *  FUNCTION VALUE:
130 *
131 *	none
132 *
133 *  SIDE EFFECTS:
134 *
135 *	none
136 */
137#define cma__int_attr_get_inherit_sched(_att_,_setting_) { \
138    cma__t_int_attr	*_int_att_; \
139    (_int_att_) = cma__validate_default_attr (_att_); \
140    cma__int_lock ((_int_att_)->mutex); \
141    (*(_setting_)) \
142        = ((_int_att_)->inherit_sched ? cma_c_sched_inherit : cma_c_sched_use_default); \
143    cma__int_unlock ((_int_att_)->mutex); \
144    }
145
146/*
147 *  FUNCTIONAL DESCRIPTION:
148 *
149 *	cma__int_attr_set_stacksize - Performs work for cma_attr_set_stacksize
150 *
151 *  FORMAL PARAMETERS:
152 *
153 *      cma_t_attr          *_att_      - Attributes object to use
154 *	cma_t_natural	    _setting_	- Setting
155 *
156 *  IMPLICIT INPUTS:
157 *
158 *	none
159 *
160 *  IMPLICIT OUTPUTS:
161 *
162 *	none
163 *
164 *  FUNCTION VALUE:
165 *
166 *	none
167 *
168 *  SIDE EFFECTS:
169 *
170 *	Change attribute objects stack size setting
171 */
172#define cma__int_attr_set_stacksize(_att_,_setting_) { \
173    cma__t_int_attr     *_int_att_; \
174    if ((_setting_) <= 0) \
175        cma__error (cma_s_badparam); \
176    _int_att_ = cma__validate_attr (_att_); \
177    cma__int_lock ((_int_att_)->mutex); \
178    _int_att_->stack_size = cma__roundup_chunksize(_setting_); \
179    cma__free_cache (_int_att_, cma__c_obj_tcb); \
180    _int_att_->cache[cma__c_obj_tcb].revision++; \
181    _int_att_->cache[cma__c_obj_stack].revision++; \
182    cma__int_unlock (_int_att_->mutex); \
183    }
184
185/*
186 *  FUNCTIONAL DESCRIPTION:
187 *
188 *	cma__int_attr_get_stacksize - Performs work of cma_attr_get_stacksize
189 *
190 *  FORMAL PARAMETERS:
191 *
192 *      cma_t_attr          *_att_      - Attributes object to use
193 *	cma_t_natural	    *_setting_	- Current setting
194 *
195 *  IMPLICIT INPUTS:
196 *
197 *	none
198 *
199 *  IMPLICIT OUTPUTS:
200 *
201 *	Attribute objects stack size setting
202 *
203 *  FUNCTION VALUE:
204 *
205 *	none
206 *
207 *  SIDE EFFECTS:
208 *
209 *	none
210 */
211#define cma__int_attr_get_stacksize(_att_,_setting_) { \
212    cma__t_int_attr     *_int_att_; \
213    (_int_att_) = cma__validate_default_attr (_att_); \
214    cma__int_lock ((_int_att_)->mutex); \
215    (*(_setting_)) = (_int_att_)->stack_size; \
216    cma__int_unlock ((_int_att_)->mutex); \
217    }
218
219
220/*
221 *  FUNCTIONAL DESCRIPTION:
222 *
223 *	cma__int_attr_set_guardsize - Performs work for cma_attr_set_guardsize
224 *
225 *  FORMAL PARAMETERS:
226 *
227 *      cma_t_attr          *_att_      - Attributes object to use
228 *	cma_t_natural	    _setting_	- Setting
229 *
230 *  IMPLICIT INPUTS:
231 *
232 *	none
233 *
234 *  IMPLICIT OUTPUTS:
235 *
236 *	none
237 *
238 *  FUNCTION VALUE:
239 *
240 *	none
241 *
242 *  SIDE EFFECTS:
243 *
244 *	Change attribute objects guard size setting
245 */
246#define cma__int_attr_set_guardsize(_att_,_setting_) { \
247    cma__t_int_attr     *_int_att_; \
248    _int_att_ = cma__validate_attr (_att_); \
249    cma__int_lock ((_int_att_)->mutex); \
250    _int_att_->guard_size = cma__roundup_chunksize(_setting_); \
251    cma__free_cache (_int_att_, cma__c_obj_tcb); \
252    _int_att_->cache[cma__c_obj_tcb].revision++; \
253    _int_att_->cache[cma__c_obj_stack].revision++; \
254    cma__int_unlock (_int_att_->mutex); \
255    }
256
257/*
258 *  FUNCTIONAL DESCRIPTION:
259 *
260 *	cma__int_attr_get_guardsize - Performs work of cma_attr_get_guardsize
261 *
262 *  FORMAL PARAMETERS:
263 *
264 *      cma_t_attr          *_att_      - Attributes object to use
265 *	cma_t_natural	    *_setting_	- Current setting
266 *
267 *  IMPLICIT INPUTS:
268 *
269 *	none
270 *
271 *  IMPLICIT OUTPUTS:
272 *
273 *	Attribute objects guard size setting
274 *
275 *  FUNCTION VALUE:
276 *
277 *	none
278 *
279 *  SIDE EFFECTS:
280 *
281 *	none
282 */
283#define cma__int_attr_get_guardsize(_att_,_setting_) { \
284    cma__t_int_attr     *_int_att_; \
285    (_int_att_) = cma__validate_default_attr (_att_); \
286    cma__int_lock ((_int_att_)->mutex); \
287    (*(_setting_)) = (_int_att_)->guard_size; \
288    cma__int_unlock ((_int_att_)->mutex); \
289    }
290
291/*
292 * TYPEDEFS
293 */
294#ifndef __STDC__
295struct CMA__T_INT_MUTEX;		/* Avoid circular dependency */
296#endif
297
298typedef struct CMA__T_CACHE {
299    cma_t_natural		revision;	/* Revisions */
300    cma_t_natural		count;
301    cma__t_queue		queue;	/* Cache headers */
302    } cma__t_cache;
303
304typedef struct CMA__T_INT_ATTR {
305    cma__t_object		header;		/* Common header */
306    struct CMA__T_INT_ATTR	*attributes;	/* Point to controlling attr */
307    struct CMA__T_INT_MUTEX	*mutex;		/* Serialize access to object */
308    cma_t_priority		priority;	/* Priority of new thread */
309    cma_t_sched_policy		policy;		/* Sched policy of thread */
310    cma_t_boolean		inherit_sched;	/* Is scheduling inherited? */
311    cma_t_natural		stack_size;	/* Size of stack (bytes) */
312    cma_t_natural		guard_size;	/* Size of guard (bytes) */
313    cma_t_mutex_kind		mutex_kind;	/* Mutex kind */
314    cma__t_cache		cache[cma__c_obj_num];	/* Cache information */
315    cma_t_boolean		delete_pending;	/* attr. obj. is deleted */
316    cma_t_natural		refcnt;	/* Number of objects using attr. obj */
317    } cma__t_int_attr;
318
319/*
320 *  GLOBAL DATA
321 */
322
323extern cma__t_int_attr	cma__g_def_attr;
324
325/*
326 * INTERNAL INTERFACES
327 */
328
329extern void cma__destroy_attributes  (cma__t_int_attr *);
330
331extern void cma__free_attributes  (cma__t_int_attr	*);
332
333extern void cma__free_cache  (cma__t_int_attr *,cma_t_natural );
334
335extern cma__t_int_attr *cma__get_attributes  (cma__t_int_attr	*);
336
337extern void cma__init_attr  (void);
338
339extern void cma__reinit_attr  (cma_t_integer);
340
341#endif
342