Annotation of win32/apache13/src/include/scoreboard.h, revision 1.1.1.1
1.1 parser 1: /* ====================================================================
2: * Copyright (c) 1995-1999 The Apache Group. All rights reserved.
3: *
4: * Redistribution and use in source and binary forms, with or without
5: * modification, are permitted provided that the following conditions
6: * are met:
7: *
8: * 1. Redistributions of source code must retain the above copyright
9: * notice, this list of conditions and the following disclaimer.
10: *
11: * 2. Redistributions in binary form must reproduce the above copyright
12: * notice, this list of conditions and the following disclaimer in
13: * the documentation and/or other materials provided with the
14: * distribution.
15: *
16: * 3. All advertising materials mentioning features or use of this
17: * software must display the following acknowledgment:
18: * "This product includes software developed by the Apache Group
19: * for use in the Apache HTTP server project (http://www.apache.org/)."
20: *
21: * 4. The names "Apache Server" and "Apache Group" must not be used to
22: * endorse or promote products derived from this software without
23: * prior written permission. For written permission, please contact
24: * apache@apache.org.
25: *
26: * 5. Products derived from this software may not be called "Apache"
27: * nor may "Apache" appear in their names without prior written
28: * permission of the Apache Group.
29: *
30: * 6. Redistributions of any form whatsoever must retain the following
31: * acknowledgment:
32: * "This product includes software developed by the Apache Group
33: * for use in the Apache HTTP server project (http://www.apache.org/)."
34: *
35: * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
36: * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
38: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR
39: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
41: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
42: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
43: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
44: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
45: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
46: * OF THE POSSIBILITY OF SUCH DAMAGE.
47: * ====================================================================
48: *
49: * This software consists of voluntary contributions made by many
50: * individuals on behalf of the Apache Group and was originally based
51: * on public domain software written at the National Center for
52: * Supercomputing Applications, University of Illinois, Urbana-Champaign.
53: * For more information on the Apache Group and the Apache HTTP server
54: * project, please see <http://www.apache.org/>.
55: *
56: */
57:
58: #ifndef APACHE_SCOREBOARD_H
59: #define APACHE_SCOREBOARD_H
60:
61: #ifdef __cplusplus
62: extern "C" {
63: #endif
64:
65: #ifndef WIN32
66: #if defined(TPF) || defined(NETWARE)
67: #include <time.h>
68: #else
69: #include <sys/times.h>
70: #endif /* TPF */
71: #endif
72:
73:
74: /* Scoreboard info on a process is, for now, kept very brief ---
75: * just status value and pid (the latter so that the caretaker process
76: * can properly update the scoreboard when a process dies). We may want
77: * to eventually add a separate set of long_score structures which would
78: * give, for each process, the number of requests serviced, and info on
79: * the current, or most recent, request.
80: *
81: * Status values:
82: */
83:
84: #define SERVER_DEAD 0
85: #define SERVER_STARTING 1 /* Server Starting up */
86: #define SERVER_READY 2 /* Waiting for connection (or accept() lock) */
87: #define SERVER_BUSY_READ 3 /* Reading a client request */
88: #define SERVER_BUSY_WRITE 4 /* Processing a client request */
89: #define SERVER_BUSY_KEEPALIVE 5 /* Waiting for more requests via keepalive */
90: #define SERVER_BUSY_LOG 6 /* Logging the request */
91: #define SERVER_BUSY_DNS 7 /* Looking up a hostname */
92: #define SERVER_GRACEFUL 8 /* server is gracefully finishing request */
93: #define SERVER_NUM_STATUS 9 /* number of status settings */
94:
95: /* A "virtual time" is simply a counter that indicates that a child is
96: * making progress. The parent checks up on each child, and when they have
97: * made progress it resets the last_rtime element. But when the child hasn't
98: * made progress in a time that's roughly timeout_len seconds long, it is
99: * sent a SIGALRM.
100: *
101: * vtime is an optimization that is used only when the scoreboard is in
102: * shared memory (it's not easy/feasible to do it in a scoreboard file).
103: * The essential observation is that timeouts rarely occur, the vast majority
104: * of hits finish before any timeout happens. So it really sucks to have to
105: * ask the operating system to set up and destroy alarms many times during
106: * a request.
107: */
108: typedef unsigned vtime_t;
109:
110: /* Type used for generation indicies. Startup and every restart cause a
111: * new generation of children to be spawned. Children within the same
112: * generation share the same configuration information -- pointers to stuff
113: * created at config time in the parent are valid across children. For
114: * example, the vhostrec pointer in the scoreboard below is valid in all
115: * children of the same generation.
116: *
117: * The safe way to access the vhost pointer is like this:
118: *
119: * short_score *ss = pointer to whichver slot is interesting;
120: * parent_score *ps = pointer to whichver slot is interesting;
121: * server_rec *vh = ss->vhostrec;
122: *
123: * if (ps->generation != ap_my_generation) {
124: * vh = NULL;
125: * }
126: *
127: * then if vh is not NULL it's valid in this child.
128: *
129: * This avoids various race conditions around restarts.
130: */
131: typedef int ap_generation_t;
132:
133: /* stuff which the children generally write, and the parent mainly reads */
134: typedef struct {
135: #ifdef OPTIMIZE_TIMEOUTS
136: vtime_t cur_vtime; /* the child's current vtime */
137: unsigned short timeout_len; /* length of the timeout */
138: #endif
139: unsigned char status;
140: unsigned long access_count;
141: unsigned long bytes_served;
142: unsigned long my_access_count;
143: unsigned long my_bytes_served;
144: unsigned long conn_bytes;
145: unsigned short conn_count;
146: #if defined(NO_GETTIMEOFDAY)
147: clock_t start_time;
148: clock_t stop_time;
149: #else
150: struct timeval start_time;
151: struct timeval stop_time;
152: #endif
153: #ifndef NO_TIMES
154: struct tms times;
155: #endif
156: #ifndef OPTIMIZE_TIMEOUTS
157: time_t last_used;
158: #endif
159: char client[32]; /* Keep 'em small... */
160: char request[64]; /* We just want an idea... */
161: server_rec *vhostrec; /* What virtual host is being accessed? */
162: /* SEE ABOVE FOR SAFE USAGE! */
163: } short_score;
164:
165: typedef struct {
166: ap_generation_t running_generation; /* the generation of children which
167: * should still be serving requests. */
168: } global_score;
169:
170: /* stuff which the parent generally writes and the children rarely read */
171: typedef struct {
172: pid_t pid;
173: #ifdef OPTIMIZE_TIMEOUTS
174: time_t last_rtime; /* time(0) of the last change */
175: vtime_t last_vtime; /* the last vtime the parent has seen */
176: #endif
177: ap_generation_t generation; /* generation of this child */
178: } parent_score;
179:
180: typedef struct {
181: short_score servers[HARD_SERVER_LIMIT];
182: parent_score parent[HARD_SERVER_LIMIT];
183: global_score global;
184: } scoreboard;
185:
186: #define SCOREBOARD_SIZE sizeof(scoreboard)
187: #ifdef TPF
188: #define SCOREBOARD_NAME "SCOREBRD"
189: #define SCOREBOARD_FRAMES SCOREBOARD_SIZE/4095 + 1
190: #endif
191:
192: API_EXPORT(void) ap_sync_scoreboard_image(void);
193: API_EXPORT(int) ap_exists_scoreboard_image(void);
194:
195: API_VAR_EXPORT extern scoreboard *ap_scoreboard_image;
196:
197: API_VAR_EXPORT extern ap_generation_t volatile ap_my_generation;
198:
199: /* for time_process_request() in http_main.c */
200: #define START_PREQUEST 1
201: #define STOP_PREQUEST 2
202:
203: #ifdef __cplusplus
204: }
205: #endif
206:
207: #endif /* !APACHE_SCOREBOARD_H */
E-mail: