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__
295 struct CMA__T_INT_MUTEX;		/* Avoid circular dependency */
296 #endif
297 
298 typedef 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 
304 typedef 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 
323 extern cma__t_int_attr	cma__g_def_attr;
324 
325 /*
326  * INTERNAL INTERFACES
327  */
328 
329 extern void cma__destroy_attributes  (cma__t_int_attr *);
330 
331 extern void cma__free_attributes  (cma__t_int_attr	*);
332 
333 extern void cma__free_cache  (cma__t_int_attr *,cma_t_natural );
334 
335 extern cma__t_int_attr *cma__get_attributes  (cma__t_int_attr	*);
336 
337 extern void cma__init_attr  (void);
338 
339 extern void cma__reinit_attr  (cma_t_integer);
340 
341 #endif
342