|
|
1.1 root 1: /*
2: * Mach Operating System
3: * Copyright (c) 1991,1990,1989 Carnegie Mellon University
4: * All Rights Reserved.
5: *
6: * Permission to use, copy, modify and distribute this software and its
7: * documentation is hereby granted, provided that both the copyright
8: * notice and this permission notice appear in all copies of the
9: * software, derivative works or modified versions, and any portions
10: * thereof, and that both notices appear in supporting documentation.
11: *
12: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
13: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
14: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
15: *
16: * Carnegie Mellon requests users of this software to return to
17: *
18: * Software Distribution Coordinator or [email protected]
19: * School of Computer Science
20: * Carnegie Mellon University
21: * Pittsburgh PA 15213-3890
22: *
23: * any improvements or extensions that they make and grant Carnegie Mellon
24: * the rights to redistribute these changes.
25: */
26:
27: /*
28: * Copyright 1991 by Open Software Foundation,
29: * Grenoble, FRANCE
30: *
31: * All Rights Reserved
32: *
33: * Permission to use, copy, modify, and distribute this software and
34: * its documentation for any purpose and without fee is hereby granted,
35: * provided that the above copyright notice appears in all copies and
36: * that both the copyright notice and this permission notice appear in
37: * supporting documentation, and that the name of OSF or Open Software
38: * Foundation not be used in advertising or publicity pertaining to
39: * distribution of the software without specific, written prior
40: * permission.
41: *
42: * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
43: * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
44: * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
45: * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
46: * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
47: * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
48: * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
49: */
50:
51:
52: #ifndef _MACH_PROFIL_H_
53: #define _MACH_PROFIL_H_
54:
55: #include <mach/boolean.h>
56: #include <ipc/ipc_object.h>
57: #include <vm/vm_kern.h>
58:
59:
60: #define NB_PROF_BUFFER 2 /* number of buffers servicing a
61: * profiled thread */
62: #define SIZE_PROF_BUFFER 100 /* size of a profil buffer (in int)
63: * This values is also defined in
64: * the server (ugly), be careful ! */
65:
66:
67: struct prof_data {
68: ipc_object_t prof_port; /* where to send a full buffer */
69:
70: struct buffer {
71: int *p_zone; /* points to the actual storage area */
72: int p_index;/* next slot to be filled */
73: boolean_t p_full; /* is the current buffer full ? */
74: } prof_area[NB_PROF_BUFFER];
75:
76: int prof_index; /* index of the buffer structure
77: * currently in use */
78:
79: };
80: typedef struct prof_data *prof_data_t;
81: #define NULLPBUF ((prof_data_t) 0)
82: typedef struct buffer *buffer_t;
83:
84: /* Macros */
85:
86: #define set_pbuf_nb(pbuf, nb) \
87: (((nb) >= 0 && (nb) < NB_PROF_BUFFER) \
88: ? (pbuf)->prof_index = (nb), 1 \
89: : 0)
90:
91:
92: #define get_pbuf_nb(pbuf) \
93: (pbuf)->prof_index
94:
95:
96: extern vm_map_t kernel_map;
97:
98: #define dealloc_pbuf_area(pbuf) \
99: { \
100: register int i; \
101: \
102: for(i=0; i < NB_PROF_BUFFER ; i++) \
103: kmem_free(kernel_map, \
104: (vm_offset_t) (pbuf)->prof_area[i].p_zone, \
105: SIZE_PROF_BUFFER*sizeof(int)); \
106: kmem_free(kernel_map, \
107: (vm_offset_t)(pbuf), \
108: sizeof(struct prof_data)); \
109: }
110:
111:
112: #define alloc_pbuf_area(pbuf, vmpbuf) \
113: (vmpbuf) = (vm_offset_t) 0; \
114: if (kmem_alloc(kernel_map, &(vmpbuf) , sizeof(struct prof_data)) == \
115: KERN_SUCCESS) { \
116: register int i; \
117: register boolean_t end; \
118: \
119: (pbuf) = (prof_data_t) (vmpbuf); \
120: for(i=0, end=FALSE; i < NB_PROF_BUFFER && end == FALSE; i++) { \
121: (vmpbuf) = (vm_offset_t) 0; \
122: if (kmem_alloc(kernel_map,&(vmpbuf),SIZE_PROF_BUFFER*sizeof(int)) == KERN_SUCCESS) { \
123: (pbuf)->prof_area[i].p_zone = (int *) (vmpbuf); \
124: (pbuf)->prof_area[i].p_full = FALSE; \
125: } \
126: else { \
127: (pbuf) = NULLPBUF; \
128: end = TRUE; \
129: } \
130: } \
131: } \
132: else \
133: (pbuf) = NULLPBUF;
134:
135:
136:
137: /* MACRO set_pbuf_value
138: **
139: ** enters the value 'val' in the buffer 'pbuf' and returns the following
140: ** indications: 0: means that a fatal error occured: the buffer was full
141: ** (it hasn't been sent yet)
142: ** 1: means that a value has been inserted successfully
143: ** 2: means that we'v just entered the last value causing
144: ** the current buffer to be full.(must switch to
145: ** another buffer and signal the sender to send it)
146: */
147:
148: #define set_pbuf_value(pbuf, val) \
149: { \
150: register buffer_t a = &((pbuf)->prof_area[(pbuf)->prof_index]); \
151: register int i = a->p_index++; \
152: register boolean_t f = a->p_full; \
153: \
154: if (f == TRUE ) \
155: *(val) = 0; \
156: else { \
157: a->p_zone[i] = *(val); \
158: if (i == SIZE_PROF_BUFFER-1) { \
159: a->p_full = TRUE; \
160: *(val) = 2; \
161: } \
162: else \
163: *(val) = 1; \
164: } \
165: }
166:
167:
168: #define reset_pbuf_area(pbuf) \
169: { \
170: register int *i = &((pbuf)->prof_index); \
171: \
172: *i = (*i == NB_PROF_BUFFER-1) ? 0 : ++(*i); \
173: (pbuf)->prof_area[*i].p_index = 0; \
174: }
175:
176:
177: /**************************************************************/
178: /* Structure, elements used for queuing operations on buffers */
179: /**************************************************************/
180:
181: #define thread_t int *
182: /*
183: ** This must be done in order to avoid a circular inclusion
184: ** with file kern/thread.h .
185: ** When using this data structure, one must cast the actual
186: ** type, this is (int *) or (thread_t)
187: */
188:
189: struct buf_to_send {
190: queue_chain_t list;
191: thread_t thread;
192: int number; /* the number of the buffer to be sent */
193: char wakeme; /* do wakeup when buffer has been sent */
194: } ;
195:
196: #undef thread_t
197:
198:
199:
200: typedef struct buf_to_send *buf_to_send_t;
201:
202: #define NULLBTS ((buf_to_send_t) 0)
203:
204: /*
205: ** Global variable: the head of the queue of buffers to send
206: ** It is a queue with locks (uses macros from queue.h) and it
207: ** is shared by hardclock() and the sender_thread()
208: */
209:
210: mpqueue_head_t prof_queue;
211:
212: #endif /* _MACH_PROF_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.