Annotation of fam/fam/Scheduler.h, Revision 1.1.1.1
1.1 trev 1: // Copyright (C) 1999 Silicon Graphics, Inc. All Rights Reserved.
2: //
3: // This program is free software; you can redistribute it and/or modify it
4: // under the terms of version 2 of the GNU General Public License as
5: // published by the Free Software Foundation.
6: //
7: // This program is distributed in the hope that it would be useful, but
8: // WITHOUT ANY WARRANTY; without even the implied warranty of
9: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Further, any
10: // license provided herein, whether implied or otherwise, is limited to
11: // this program in accordance with the express provisions of the GNU
12: // General Public License. Patent licenses, if any, provided herein do not
13: // apply to combinations of this program with other product or programs, or
14: // any other product whatsoever. This program is distributed without any
15: // warranty that the program is delivered free of the rightful claim of any
16: // third person by way of infringement or the like. See the GNU General
17: // Public License for more details.
18: //
19: // You should have received a copy of the GNU General Public License along
20: // with this program; if not, write the Free Software Foundation, Inc., 59
21: // Temple Place - Suite 330, Boston MA 02111-1307, USA.
22:
23: #ifndef Scheduler_included
24: #define Scheduler_included
25:
26: #include <sys/time.h>
27: #include <string.h>
28:
29: #include "Boolean.h"
30:
31: // Scheduler is a class encapsulating a simple event and timer based
32: // task scheduler. Tasks are simply subroutines that are activated
33: // by calling them.
34: //
35: // A recurring task will be activated at fixed intervals of real
36: // time. It is unpredictable when the Scheduler will first activate
37: // a recurring task.
38: //
39: // A onetime task will be activated at a particular time.
40: //
41: // Events are those defined by select(2) -- file descriptors that are
42: // ready to be read, written or checked for exceptional conditions.
43: // A handler may be installed to be called for any event on any
44: // descriptor. Only one handler may be installed for each event.
45: // The installation and removal routines return the previously
46: // installed handler.
47: //
48: // Scheduler has fixed priorities -- write events precede exception
49: // events precede read events precede timed tasks.
50: //
51: // USE: There are no instances of Scheduler; all its interface
52: // routines are static, and are called, e.g., "Scheduler::loop();"
53: //
54: // RESTRICTIONS: Because we currently need only a single recurring
55: // task, multiple recurring tasks are not implemented.
56:
57: class Scheduler {
58:
59: public:
60:
61: typedef void (*IOHandler)(int fd, void *closure);
62: typedef void (*TimedProc)(void *closure);
63:
64: // One-time tasks.
65:
66: static void install_onetime_task(const timeval& when,
67: TimedProc, void *closure);
68: static void remove_onetime_task(TimedProc, void *closure);
69:
70: // Recurring tasks.
71:
72: static void install_recurring_task(const timeval& interval,
73: TimedProc, void *closure);
74: static void remove_recurring_task(TimedProc, void *closure);
75:
76: // I/O handlers.
77:
78: static IOHandler install_read_handler(int fd, IOHandler, void *closure);
79: static IOHandler remove_read_handler(int fd);
80:
81: static IOHandler install_write_handler(int fd, IOHandler, void *closure);
82: static IOHandler remove_write_handler(int fd);
83:
84: // Mainline code.
85:
86: static void select();
87: static void exit() { running = false; }
88: static void loop() { running = true;
89: while (running) select(); }
90:
91: private:
92:
93: // Per-filedescriptor info is the set of three handlers and their
94: // closures.
95:
96: struct FDInfo {
97: struct FDIOHandler {
98: IOHandler handler;
99: void *closure;
100: } read, write;
101: };
102:
103: // Per-I/O type info is the file descriptor set passed to select(),
104: // the number of bits set there, and the offset into the FDInfo
105: // for the corresponding I/O type.
106:
107: struct IOTypeInfo {
108: FDInfo::FDIOHandler FDInfo::*iotype;
109: unsigned int nbitsset; // number of bits set in fds
110: fd_set fds;
111: IOTypeInfo(FDInfo::FDIOHandler FDInfo::* a_iotype) :
112: iotype(a_iotype), nbitsset(0) { FD_ZERO(&fds); }
113: };
114:
115: struct onetime_task {
116: onetime_task *next;
117: timeval when;
118: Scheduler::TimedProc proc;
119: void *closure;
120: };
121:
122: // I/O event related variables
123:
124: static IOTypeInfo read, write;
125: static FDInfo *fdinfo;
126: static unsigned int nfds;
127: static unsigned int nfdinfo_alloc;
128:
129: // Timed task related variables
130:
131: static unsigned int ntasks;
132: static timeval next_task_time;
133: static TimedProc recurring_proc;
134: static void *recurring_closure;
135: static timeval recurring_interval;
136: static onetime_task *first_task;
137: static bool running;
138:
139: // I/O event related functions
140:
141: static FDInfo *fd_to_info(int fd);
142: static void trim_fdinfo();
143: static IOHandler install_io_handler(int fd,
144: IOHandler handler, void *closure,
145: IOTypeInfo *iotype);
146: static IOHandler remove_io_handler(int fd, IOTypeInfo *iotype);
147: static void handle_io(const fd_set *fds, FDInfo::FDIOHandler FDInfo::* iotype);
148:
149: // Timed task related functions
150:
151: static void do_tasks();
152: static timeval *calc_timeout();
153:
154: Scheduler(); // Never instantiate a Scheduler.
155:
156: };
157:
158: #endif /* !Scheduler_included */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>