Updated some file-scope function names to avoid inter-module clashes for the benefit of ctags.
1 | /* |
2 | * The contents of this file are subject to the AOLserver Public License |
3 | * Version 1.1 (the "License"); you may not use this file except in |
4 | * compliance with the License. You may obtain a copy of the License at |
5 | * http://aolserver.com/. |
6 | * |
7 | * Software distributed under the License is distributed on an "AS IS" |
8 | * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See |
9 | * the License for the specific language governing rights and limitations |
10 | * under the License. |
11 | * |
12 | * The Original Code is AOLserver Code and related documentation |
13 | * distributed by AOL. |
14 | * |
15 | * The Initial Developer of the Original Code is America Online, |
16 | * Inc. Portions created by AOL are Copyright (C) 1999 America Online, |
17 | * Inc. All Rights Reserved. |
18 | * |
19 | * Alternatively, the contents of this file may be used under the terms |
20 | * of the GNU General Public License (the "GPL"), in which case the |
21 | * provisions of GPL are applicable instead of those above. If you wish |
22 | * to allow use of your version of this file only under the terms of the |
23 | * GPL and not to allow others to use your version of this file under the |
24 | * License, indicate your decision by deleting the provisions above and |
25 | * replace them with the notice and other provisions required by the GPL. |
26 | * If you do not delete the provisions above, a recipient may use your |
27 | * version of this file under either the License or the GPL. |
28 | */ |
29 | |
30 | |
31 | /* |
32 | * tclsched.c -- |
33 | * |
34 | * Implement scheduled procs in Tcl. |
35 | */ |
36 | |
37 | static const char *RCSID = "@(#) $Header: /cvsroot-fuse/aolserver/aolserver/nsd/tclsched.c,v 1.7 2005/07/18 23:32:12 jgdavidson Exp $, compiled: " __DATE__ " " __TIME__; |
38 | |
39 | #include "nsd.h" |
40 | |
41 | typedef void *(AtProc)(Ns_Callback *, void *); |
42 | |
43 | typedef struct TclCallback { |
44 | char *server; |
45 | char *script; |
46 | } TclCallback; |
47 | |
48 | /* |
49 | * Local functions defined in this file |
50 | */ |
51 | |
52 | static TclCallback *<a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NewCallback">NewCallback</a>(Tcl_Interp *interp, char *proc, char *arg); |
53 | static Ns_Callback <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_EvalCallback">EvalCallback</a>; |
54 | static Ns_Callback <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_FreeCallback">FreeCallback</a>; |
55 | static Ns_SchedProc <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_FreeSched">FreeSched</a>; |
56 | static int <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_ReturnValidId">ReturnValidId</a>(Tcl_Interp *interp, int id, TclCallback *cbPtr); |
57 | static int <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_AtCmd">AtCmd</a>(AtProc *procPtr, Tcl_Interp *interp, int argc, char **argv); |
58 | |
59 | |
60 | /* |
61 | *---------------------------------------------------------------------- |
62 | * |
63 | * NsTclAt -- |
64 | * |
65 | * Implements ns_atsignal, ns_atshutdown, and ns_atexit commands. |
66 | * |
67 | * Results: |
68 | * Tcl result. |
69 | * |
70 | * Side effects: |
71 | * See docs. |
72 | * |
73 | *---------------------------------------------------------------------- |
74 | */ |
75 | |
76 | static int |
77 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_AtCmd">AtCmd</a>(AtProc *procPtr, Tcl_Interp *interp, int argc, char **argv) |
78 | { |
79 | TclCallback *cbPtr; |
80 | |
81 | if (argc != 2 && argc != 3) { |
82 | Tcl_AppendResult(interp, "wrong # args: should be \"", |
83 | argv[0], " script | procname ?arg?\"", NULL); |
84 | return TCL_ERROR; |
85 | } |
86 | cbPtr = <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NewCallback">NewCallback</a>(interp, argv[1], argv[2]); |
87 | if (procPtr == <a href="/cvs/aolserver/aolserver/nsd/callbacks.c#A_Ns_RegisterAtSignal">Ns_RegisterAtSignal</a>) { |
88 | (*procPtr) (<a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclSignalProc">NsTclSignalProc</a>, cbPtr); |
89 | } else { |
90 | (*procPtr) (<a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclCallback">NsTclCallback</a>, cbPtr); |
91 | } |
92 | return TCL_OK; |
93 | } |
94 | |
95 | int |
96 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclAtSignalCmd">NsTclAtSignalCmd</a>(ClientData arg, Tcl_Interp *interp, int argc, char **argv) |
97 | { |
98 | return <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_AtCmd">AtCmd</a>(<a href="/cvs/aolserver/aolserver/nsd/callbacks.c#A_Ns_RegisterAtSignal">Ns_RegisterAtSignal</a>, interp, argc, argv); |
99 | } |
100 | |
101 | int |
102 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclAtShutdownCmd">NsTclAtShutdownCmd</a>(ClientData arg, Tcl_Interp *interp, int argc, char **argv) |
103 | { |
104 | return <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_AtCmd">AtCmd</a>(<a href="/cvs/aolserver/aolserver/nsd/callbacks.c#A_Ns_RegisterShutdown">Ns_RegisterShutdown</a>, interp, argc, argv); |
105 | } |
106 | |
107 | int |
108 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclAtExitCmd">NsTclAtExitCmd</a>(ClientData arg, Tcl_Interp *interp, int argc, char **argv) |
109 | { |
110 | return <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_AtCmd">AtCmd</a>(<a href="/cvs/aolserver/aolserver/nsd/callbacks.c#A_Ns_RegisterAtExit">Ns_RegisterAtExit</a>, interp, argc, argv); |
111 | } |
112 | |
113 | |
114 | /* |
115 | *---------------------------------------------------------------------- |
116 | * |
117 | * NsAfterCmd -- |
118 | * |
119 | * Implements ns_after. |
120 | * |
121 | * Results: |
122 | * Tcl result. |
123 | * |
124 | * Side effects: |
125 | * See docs. |
126 | * |
127 | *---------------------------------------------------------------------- |
128 | */ |
129 | |
130 | int |
131 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclAfterCmd">NsTclAfterCmd</a>(ClientData arg, Tcl_Interp *interp, int argc, char **argv) |
132 | { |
133 | int id, seconds; |
134 | TclCallback *cbPtr; |
135 | |
136 | if (argc != 3) { |
137 | Tcl_AppendResult(interp, "wrong # args: should be \"", |
138 | argv[0], " seconds script\"", NULL); |
139 | return TCL_ERROR; |
140 | } |
141 | if (Tcl_GetInt(interp, argv[1], &seconds) != TCL_OK) { |
142 | return TCL_ERROR; |
143 | } |
144 | cbPtr = <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NewCallback">NewCallback</a>(interp, argv[2], NULL); |
145 | id = <a href="/cvs/aolserver/aolserver/nsd/sched.c#A_Ns_After">Ns_After</a>(seconds, (Ns_Callback *) <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclSchedProc">NsTclSchedProc</a>, cbPtr, <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_FreeCallback">FreeCallback</a>); |
146 | return <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_ReturnValidId">ReturnValidId</a>(interp, id, cbPtr); |
147 | } |
148 | |
149 | |
150 | /* |
151 | *---------------------------------------------------------------------- |
152 | * |
153 | * <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_SchedCmd">SchedCmd</a> -- |
154 | * |
155 | * Implements ns_unschedule_proc, ns_cancel, ns_pause, and |
156 | * ns_resume commands. |
157 | * |
158 | * Results: |
159 | * Tcl result. |
160 | * |
161 | * Side effects: |
162 | * See docs. |
163 | * |
164 | *---------------------------------------------------------------------- |
165 | */ |
166 | |
167 | static int |
168 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_SchedCmd">SchedCmd</a>(Tcl_Interp *interp, int argc, char **argv, int cmd) |
169 | { |
170 | int id, ok; |
171 | char buf[10]; |
172 | |
173 | if (argc != 2) { |
174 | Tcl_AppendResult(interp, "wrong # args: should be \"", |
175 | argv[0], " id\"", NULL); |
176 | return TCL_ERROR; |
177 | } |
178 | if (Tcl_GetInt(interp, argv[1], &id) != TCL_OK) { |
179 | return TCL_ERROR; |
180 | } |
181 | switch (cmd) { |
182 | case 'u': |
183 | case 'c': |
184 | ok = <a href="/cvs/aolserver/aolserver/nsd/sched.c#A_Ns_Cancel">Ns_Cancel</a>(id); |
185 | break; |
186 | case 'p': |
187 | ok = <a href="/cvs/aolserver/aolserver/nsd/sched.c#A_Ns_Pause">Ns_Pause</a>(id); |
188 | break; |
189 | case 'r': |
190 | ok = <a href="/cvs/aolserver/aolserver/nsd/sched.c#A_Ns_Resume">Ns_Resume</a>(id); |
191 | break; |
192 | default: |
193 | ok = -1; |
194 | } |
195 | if (cmd != 'u') { |
196 | sprintf(buf, "%d", ok); |
197 | Tcl_SetResult(interp, buf, TCL_VOLATILE); |
198 | } |
199 | return TCL_OK; |
200 | } |
201 | |
202 | int |
203 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclCancelCmd">NsTclCancelCmd</a>(ClientData arg, Tcl_Interp *interp, int argc, char **argv) |
204 | { |
205 | return <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_SchedCmd">SchedCmd</a>(interp, argc, argv, 'c'); |
206 | } |
207 | |
208 | int |
209 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclPauseCmd">NsTclPauseCmd</a>(ClientData arg, Tcl_Interp *interp, int argc, char **argv) |
210 | { |
211 | return <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_SchedCmd">SchedCmd</a>(interp, argc, argv, 'p'); |
212 | } |
213 | |
214 | int |
215 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclResumeCmd">NsTclResumeCmd</a>(ClientData arg, Tcl_Interp *interp, int argc, char **argv) |
216 | { |
217 | return <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_SchedCmd">SchedCmd</a>(interp, argc, argv, 'r'); |
218 | } |
219 | |
220 | int |
221 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclUnscheduleCmd">NsTclUnscheduleCmd</a>(ClientData arg, Tcl_Interp *interp, int argc, char **argv) |
222 | { |
223 | return <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_SchedCmd">SchedCmd</a>(interp, argc, argv, 'u'); |
224 | } |
225 | |
226 | |
227 | /* |
228 | *---------------------------------------------------------------------- |
229 | * |
230 | * <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclSchedDailyCmd">NsTclSchedDailyCmd</a> -- |
231 | * |
232 | * Implements ns_schedule_daily. |
233 | * |
234 | * Results: |
235 | * Tcl result. |
236 | * |
237 | * Side effects: |
238 | * See docs. |
239 | * |
240 | *---------------------------------------------------------------------- |
241 | */ |
242 | |
243 | int |
244 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclSchedDailyCmd">NsTclSchedDailyCmd</a>(ClientData arg, Tcl_Interp *interp, int argc, char **argv) |
245 | { |
246 | TclCallback *cbPtr; |
247 | int flags; |
248 | int first; |
249 | int id; |
250 | int hour, minute; |
251 | |
252 | /* 12 cases (arg count & number after cmd and -options are handled): |
253 | * 0 1 2 3 4 5 6 |
254 | * * cmd hour minute script (4 args)/3 |
255 | * * cmd hour minute procname (4 args)/3 |
256 | * * cmd hour minute procname arg (5 args)/4 |
257 | * * cmd -once hour minute script (5 args)/3 |
258 | * * cmd -once hour minute procname (5 args)/3 |
259 | * * cmd -once hour minute procname arg (6 args)/4 |
260 | * * cmd -thread hour minute script (5 args)/3 |
261 | * * cmd -thread hour minute procname (5 args)/3 |
262 | * * cmd -thread hour minute procname arg (6 args)/4 |
263 | * * cmd -once -thread hour minute script (6 args)/3 |
264 | * * cmd -once -thread hour minute procname (6 args)/3 |
265 | * * cmd -once -thread hour minute procname arg (7 args)/4 |
266 | */ |
267 | |
268 | first = 1; |
269 | flags = 0; |
270 | |
271 | while (argc-- && argv[first] != NULL) { |
272 | if (strcmp(argv[first], "-thread") == 0) { |
273 | flags |= NS_SCHED_THREAD; |
274 | } else if (strcmp(argv[first], "-once") == 0) { |
275 | flags |= NS_SCHED_ONCE; |
276 | } else { |
277 | break; |
278 | } |
279 | first++; |
280 | } |
281 | |
282 | if (argc < 3 || argc > 4) { |
283 | Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
284 | " ?-once? ?-thread? hour minute " |
285 | "{ script | procname ?arg? }\"", (char *) NULL); |
286 | return TCL_ERROR; |
287 | } |
288 | |
289 | |
290 | /* |
291 | * First is now the first argument that is not a switch. |
292 | */ |
293 | |
294 | if (Tcl_GetInt(interp, argv[first++], &hour) != TCL_OK) { |
295 | return TCL_ERROR; |
296 | } |
297 | if (hour < 0 || hour > 23) { |
298 | Tcl_AppendResult(interp, "invalid hour \"", argv[first - 1], |
299 | "\": should be >= 0 and <= 23", NULL); |
300 | return TCL_ERROR; |
301 | } |
302 | |
303 | if (Tcl_GetInt(interp, argv[first++], &minute) != TCL_OK) { |
304 | return TCL_ERROR; |
305 | } |
306 | if (minute < 0 || minute > 59) { |
307 | Tcl_AppendResult(interp, "invalid minute \"", argv[first - 1], |
308 | "\": should be >= 0 and <= 59", NULL); |
309 | return TCL_ERROR; |
310 | } |
311 | |
312 | /* |
313 | * Bear in mind that argc has been changed when counting switches, |
314 | * so assume that there are no switches when reading the 4 here. |
315 | */ |
316 | |
317 | cbPtr = <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NewCallback">NewCallback</a>(interp, argv[first], argv[first+1]); |
318 | id = <a href="/cvs/aolserver/aolserver/nsd/sched.c#A_Ns_ScheduleDaily">Ns_ScheduleDaily</a>(<a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclSchedProc">NsTclSchedProc</a>, cbPtr, flags, |
319 | hour, minute, <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_FreeSched">FreeSched</a>); |
320 | return <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_ReturnValidId">ReturnValidId</a>(interp, id, cbPtr); |
321 | } |
322 | |
323 | |
324 | /* |
325 | *---------------------------------------------------------------------- |
326 | * |
327 | * <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclSchedWeeklyCmd">NsTclSchedWeeklyCmd</a> -- |
328 | * |
329 | * Implements ns_sched_weekly. |
330 | * |
331 | * Results: |
332 | * Tcl result. |
333 | * |
334 | * Side effects: |
335 | * See docs. |
336 | * |
337 | *---------------------------------------------------------------------- |
338 | */ |
339 | |
340 | int |
341 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclSchedWeeklyCmd">NsTclSchedWeeklyCmd</a>(ClientData arg, Tcl_Interp *interp, int argc, |
342 | char **argv) |
343 | { |
344 | TclCallback *cbPtr; |
345 | int flags; |
346 | int first; |
347 | int id; |
348 | int day, hour, minute; |
349 | |
350 | /* 12 cases (arg count & number after cmd and -options are handled): |
351 | * 0 1 2 3 4 5 6 7 |
352 | * * cmd day hour minute script (5 args)/4 |
353 | * * cmd day hour minute proc (5 args)/4 |
354 | * * cmd day hour minute proc arg (6 args)/5 |
355 | * * cmd -once day hour minute script (6 args)/4 |
356 | * * cmd -once day hour minute proc (6 args)/4 |
357 | * * cmd -once day hour minute proc arg (7 args)/5 |
358 | * * cmd -thread day hour minute script (6 args)/4 |
359 | * * cmd -thread day hour minute proc (6 args)/4 |
360 | * * cmd -thread day hour minute proc arg (7 args)/5 |
361 | * * cmd -once -thread day hour minute script (7 args)/4 |
362 | * * cmd -once -thread day hour minute proc (7 args)/4 |
363 | * * cmd -once -thread day hour minute proc arg (8 args)/5 |
364 | */ |
365 | |
366 | first = 1; |
367 | flags = 0; |
368 | |
369 | while (argc-- && argv[first] != NULL) { |
370 | if (strcmp(argv[first], "-thread") == 0) { |
371 | flags |= NS_SCHED_THREAD; |
372 | } else if (strcmp(argv[first], "-once") == 0) { |
373 | flags |= NS_SCHED_ONCE; |
374 | } else { |
375 | break; |
376 | } |
377 | first++; |
378 | } |
379 | |
380 | if (argc < 4 || argc > 5) { |
381 | Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
382 | " ?-once? ?-thread? day hour minute " |
383 | "{ script | procname ?arg? }\"", (char *) NULL); |
384 | return TCL_ERROR; |
385 | } |
386 | |
387 | |
388 | /* |
389 | * First is now the first argument that is not a switch. |
390 | */ |
391 | |
392 | if (Tcl_GetInt(interp, argv[first++], &day) != TCL_OK) { |
393 | return TCL_ERROR; |
394 | } |
395 | if (day < 0 || day > 6) { |
396 | Tcl_AppendResult(interp, "invalid day \"", argv[first - 1], |
397 | "\": should be >= 0 and <= 6", NULL); |
398 | return TCL_ERROR; |
399 | } |
400 | |
401 | if (Tcl_GetInt(interp, argv[first++], &hour) != TCL_OK) { |
402 | return TCL_ERROR; |
403 | } |
404 | if (hour < 0 || hour > 23) { |
405 | Tcl_AppendResult(interp, "invalid hour \"", argv[first - 1], |
406 | "\": should be >= 0 and <= 23", NULL); |
407 | return TCL_ERROR; |
408 | } |
409 | |
410 | if (Tcl_GetInt(interp, argv[first++], &minute) != TCL_OK) { |
411 | return TCL_ERROR; |
412 | } |
413 | if (minute < 0 || minute > 59) { |
414 | Tcl_AppendResult(interp, "invalid minute \"", argv[first - 1], |
415 | "\": should be >= 0 and <= 59", NULL); |
416 | return TCL_ERROR; |
417 | } |
418 | cbPtr = <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NewCallback">NewCallback</a>(interp, argv[first], argv[first+1]); |
419 | id = <a href="/cvs/aolserver/aolserver/nsd/sched.c#A_Ns_ScheduleWeekly">Ns_ScheduleWeekly</a>(<a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclSchedProc">NsTclSchedProc</a>, cbPtr, flags, |
420 | day, hour, minute, <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_FreeSched">FreeSched</a>); |
421 | return <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_ReturnValidId">ReturnValidId</a>(interp, id, cbPtr); |
422 | } |
423 | |
424 | |
425 | /* |
426 | *---------------------------------------------------------------------- |
427 | * |
428 | * <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclSchedCmd">NsTclSchedCmd</a> -- |
429 | * |
430 | * Implements ns_schedule_proc. |
431 | * |
432 | * Results: |
433 | * Tcl result. |
434 | * |
435 | * Side effects: |
436 | * See docs. |
437 | * |
438 | *---------------------------------------------------------------------- |
439 | */ |
440 | |
441 | int |
442 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclSchedCmd">NsTclSchedCmd</a>(ClientData arg, Tcl_Interp *interp, int argc, char **argv) |
443 | { |
444 | TclCallback *cbPtr; |
445 | int interval; |
446 | int flags; |
447 | int first; |
448 | int id; |
449 | |
450 | /* 12 cases (arg count & number after cmd and -options are handled): |
451 | * 0 1 2 3 4 |
452 | * * cmd interval script (3 args)/2 |
453 | * * cmd interval procname (3 args)/2 |
454 | * * cmd interval procname arg (4 args)/3 |
455 | * * cmd -once interval script (4 args)/2 |
456 | * * cmd -once interval procname (4 args)/2 |
457 | * * cmd -once interval procname arg (5 args)/3 |
458 | * * cmd -thread interval script (4 args)/2 |
459 | * * cmd -thread interval procname (4 args)/2 |
460 | * * cmd -thread interval procname arg (5 args)/3 |
461 | * * cmd -once -thread interval script (5 args)/2 |
462 | * * cmd -once -thread interval procname (5 args)/2 |
463 | * * cmd -once -thread interval procname arg (6 args)/3 |
464 | */ |
465 | |
466 | first = 1; |
467 | flags = 0; |
468 | |
469 | while (argc-- && argv[first] != NULL) { |
470 | if (strcmp(argv[first], "-thread") == 0) { |
471 | flags |= NS_SCHED_THREAD; |
472 | } else if (strcmp(argv[first], "-once") == 0) { |
473 | flags |= NS_SCHED_ONCE; |
474 | } else { |
475 | break; |
476 | } |
477 | first++; |
478 | } |
479 | |
480 | if (argc < 2 || argc > 3) { |
481 | Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
482 | " ?-once? ?-thread? interval { script | procname ?arg? }\"", |
483 | (char *) NULL); |
484 | return TCL_ERROR; |
485 | } |
486 | |
487 | /* |
488 | * First is now the first argument that is not a switch. |
489 | */ |
490 | |
491 | if (Tcl_GetInt(interp, argv[first++], &interval) != TCL_OK) { |
492 | return TCL_ERROR; |
493 | } |
494 | cbPtr = <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NewCallback">NewCallback</a>(interp, argv[first], argv[first+1]); |
495 | id = <a href="/cvs/aolserver/aolserver/nsd/sched.c#A_Ns_ScheduleProcEx">Ns_ScheduleProcEx</a>(<a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclSchedProc">NsTclSchedProc</a>, cbPtr, flags, interval, <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_FreeSched">FreeSched</a>); |
496 | return <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_ReturnValidId">ReturnValidId</a>(interp, id, cbPtr); |
497 | } |
498 | |
499 | |
500 | /* |
501 | *---------------------------------------------------------------------- |
502 | * |
503 | * <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_ReturnValidId">ReturnValidId</a> -- |
504 | * |
505 | * Update the interp result with the given schedule id if valid. |
506 | * Otherwise, free the script and leave an error in the interp. |
507 | * |
508 | * Results: |
509 | * TCL_OK or TCL_ERROR. |
510 | * |
511 | * Side effects: |
512 | * None. |
513 | * |
514 | *---------------------------------------------------------------------- |
515 | */ |
516 | |
517 | static int |
518 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_ReturnValidId">ReturnValidId</a>(Tcl_Interp *interp, int id, TclCallback *cbPtr) |
519 | { |
520 | char buf[10]; |
521 | |
522 | if (id == NS_ERROR) { |
523 | Tcl_SetResult(interp, "could not schedule procedure", TCL_STATIC); |
524 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_FreeCallback">FreeCallback</a>(cbPtr); |
525 | return TCL_ERROR; |
526 | } |
527 | sprintf(buf, "%d", id); |
528 | Tcl_SetResult(interp, buf, TCL_VOLATILE); |
529 | return TCL_OK; |
530 | } |
531 | |
532 | |
533 | /* |
534 | *---------------------------------------------------------------------- |
535 | * |
536 | * <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_EvalCallback">EvalCallback</a> -- |
537 | * |
538 | * This is a callback function that runs scheduled tcl |
539 | * procedures registered with ns_schedule_*. |
540 | * |
541 | * Results: |
542 | * None. |
543 | * |
544 | * Side effects: |
545 | * Will run a Tcl proc/script. |
546 | * |
547 | *---------------------------------------------------------------------- |
548 | */ |
549 | |
550 | static void |
551 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_EvalCallback">EvalCallback</a>(void *arg) |
552 | { |
553 | TclCallback *cbPtr = arg; |
554 | |
555 | (void) <a href="/cvs/aolserver/aolserver/nsd/tclinit.c#A_Ns_TclEval">Ns_TclEval</a>(NULL, cbPtr->server, cbPtr->script); |
556 | } |
557 | |
558 | |
559 | /* |
560 | *---------------------------------------------------------------------- |
561 | * |
562 | * <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NewCallback">NewCallback</a> -- |
563 | * |
564 | * Create a new script callback. |
565 | * |
566 | * Results: |
567 | * Pointer to Callback. |
568 | * |
569 | * Side effects: |
570 | * None. |
571 | * |
572 | *---------------------------------------------------------------------- |
573 | */ |
574 | |
575 | static TclCallback * |
576 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NewCallback">NewCallback</a>(Tcl_Interp *interp, char *proc, char *arg) |
577 | { |
578 | TclCallback *cbPtr; |
579 | char *argv[2]; |
580 | |
581 | argv[0] = proc; |
582 | argv[1] = arg; |
583 | cbPtr = ns_malloc(sizeof(TclCallback)); |
584 | cbPtr->server = <a href="/cvs/aolserver/aolserver/nsd/tclinit.c#A_Ns_TclInterpServer">Ns_TclInterpServer</a>(interp); |
585 | cbPtr->script = Tcl_Concat(arg ? 2 : 1, argv); |
586 | return cbPtr; |
587 | } |
588 | |
589 | |
590 | /* |
591 | *---------------------------------------------------------------------- |
592 | * |
593 | * <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_FreeCallback">FreeCallback</a> -- |
594 | * |
595 | * Free a Callback created with <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NewCallback">NewCallback</a>. |
596 | * |
597 | * Results: |
598 | * None. |
599 | * |
600 | * Side effects: |
601 | * None. |
602 | * |
603 | *---------------------------------------------------------------------- |
604 | */ |
605 | |
606 | static void |
607 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_FreeCallback">FreeCallback</a>(void *arg) |
608 | { |
609 | TclCallback *cbPtr = arg; |
610 | |
611 | ckfree(cbPtr->script); |
612 | ns_free(cbPtr); |
613 | } |
614 | |
615 | static void |
616 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_FreeSched">FreeSched</a>(void *arg, int id) |
617 | { |
618 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_FreeCallback">FreeCallback</a>(arg); |
619 | } |
620 | |
621 | |
622 | /* |
623 | *---------------------------------------------------------------------- |
624 | * |
625 | * <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclSchedProc">NsTclSchedProc</a>, <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclSignalProc">NsTclSignalProc</a>, <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclCallback">NsTclCallback</a> -- |
626 | * |
627 | * External wrapper for various Tcl callbacks. |
628 | * |
629 | * Results: |
630 | * None. |
631 | * |
632 | * Side effects: |
633 | * None. |
634 | * |
635 | *---------------------------------------------------------------------- |
636 | */ |
637 | |
638 | void |
639 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclSchedProc">NsTclSchedProc</a>(void *arg, int id) |
640 | { |
641 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_EvalCallback">EvalCallback</a>(arg); |
642 | } |
643 | |
644 | void |
645 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclSignalProc">NsTclSignalProc</a>(void *arg) |
646 | { |
647 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_EvalCallback">EvalCallback</a>(arg); |
648 | } |
649 | |
650 | void |
651 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclCallback">NsTclCallback</a>(void *arg) |
652 | { |
653 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_EvalCallback">EvalCallback</a>(arg); |
654 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_FreeCallback">FreeCallback</a>(arg); |
655 | } |
656 | |
657 | |
658 | /* |
659 | *---------------------------------------------------------------------- |
660 | * |
661 | * <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclArgProc">NsTclArgProc</a> -- |
662 | * |
663 | * Proc info routine to copy Tcl callback script. |
664 | * |
665 | * Results: |
666 | * None. |
667 | * |
668 | * Side effects: |
669 | * Will copy script to given dstring. |
670 | * |
671 | *---------------------------------------------------------------------- |
672 | */ |
673 | |
674 | void |
675 | <a href="/cvs/aolserver/aolserver/nsd/tclsched.c#A_NsTclArgProc">NsTclArgProc</a>(Tcl_DString *dsPtr, void *arg) |
676 | { |
677 | TclCallback *cbPtr = arg; |
678 | |
679 | Tcl_DStringAppendElement(dsPtr, cbPtr->script); |
680 | } |
Copyright © 2010 Geeknet, Inc. All rights reserved. Terms of Use