diff options
Diffstat (limited to 'include/isc/app.h')
-rw-r--r-- | include/isc/app.h | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/include/isc/app.h b/include/isc/app.h new file mode 100644 index 0000000..5aa3d23 --- /dev/null +++ b/include/isc/app.h @@ -0,0 +1,212 @@ +/* + * Copyright (C) 1999-2001 Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM + * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL + * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING + * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION + * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* $Id: app.h,v 1.1 2001/07/06 19:50:03 gson Exp $ */ + +#ifndef ISC_APP_H +#define ISC_APP_H 1 + +/***** + ***** Module Info + *****/ + +/* + * ISC Application Support + * + * Dealing with program termination can be difficult, especially in a + * multithreaded program. The routines in this module help coordinate + * the shutdown process. They are used as follows by the initial (main) + * thread of the application: + * + * isc_app_start(); Call very early in main(), before + * any other threads have been created. + * + * isc_app_run(); This will post any on-run events, + * and then block until application + * shutdown is requested. A shutdown + * request is made by calling + * isc_app_shutdown(), or by sending + * SIGINT or SIGTERM to the process. + * After isc_app_run() returns, the + * application should shutdown itself. + * + * isc_app_finish(); Call very late in main(). + * + * Applications that want to use SIGHUP/isc_app_reload() to trigger reloading + * should check the result of isc_app_run() and call the reload routine if + * the result is ISC_R_RELOAD. They should then call isc_app_run() again + * to resume waiting for reload or termination. + * + * Use of this module is not required. In particular, isc_app_start() is + * NOT an ISC library initialization routine. + * + * MP: + * Clients must ensure that isc_app_start(), isc_app_run(), and + * isc_app_finish() are called at most once. isc_app_shutdown() + * is safe to use by any thread (provided isc_app_start() has been + * called previously). + * + * Reliability: + * No anticipated impact. + * + * Resources: + * None. + * + * Security: + * No anticipated impact. + * + * Standards: + * None. + */ + +#include <isc/eventclass.h> +#include <isc/lang.h> +#include <isc/result.h> + +typedef isc_event_t isc_appevent_t; + +#define ISC_APPEVENT_FIRSTEVENT (ISC_EVENTCLASS_APP + 0) +#define ISC_APPEVENT_SHUTDOWN (ISC_EVENTCLASS_APP + 1) +#define ISC_APPEVENT_LASTEVENT (ISC_EVENTCLASS_APP + 65535) + +ISC_LANG_BEGINDECLS + +isc_result_t +isc_app_start(void); +/* + * Start an ISC library application. + * + * Notes: + * This call should be made before any other ISC library call, and as + * close to the beginning of the application as possible. + */ + +isc_result_t +isc_app_onrun(isc_mem_t *mctx, isc_task_t *task, isc_taskaction_t action, + void *arg); +/* + * Request delivery of an event when the application is run. + * + * Requires: + * isc_app_start() has been called. + * + * Returns: + * ISC_R_SUCCESS + * ISC_R_NOMEMORY + */ + +isc_result_t +isc_app_run(void); +/* + * Run an ISC library application. + * + * Notes: + * The caller (typically the initial thread of an application) will + * block until shutdown is requested. When the call returns, the + * caller should start shutting down the application. + * + * Requires: + * isc_app_start() has been called. + * + * Ensures: + * Any events requested via isc_app_onrun() will have been posted (in + * FIFO order) before isc_app_run() blocks. + * + * Returns: + * ISC_R_SUCCESS Shutdown has been requested. + * ISC_R_RELOAD Reload has been requested. + */ + +isc_result_t +isc_app_shutdown(void); +/* + * Request application shutdown. + * + * Notes: + * It is safe to call isc_app_shutdown() multiple times. Shutdown will + * only be triggered once. + * + * Requires: + * isc_app_run() has been called. + * + * Returns: + * ISC_R_SUCCESS + * ISC_R_UNEXPECTED + */ + +isc_result_t +isc_app_reload(void); +/* + * Request application reload. + * + * Requires: + * isc_app_run() has been called. + * + * Returns: + * ISC_R_SUCCESS + * ISC_R_UNEXPECTED + */ + +void +isc_app_finish(void); +/* + * Finish an ISC library application. + * + * Notes: + * This call should be made at or near the end of main(). + * + * Requires: + * isc_app_start() has been called. + * + * Ensures: + * Any resources allocated by isc_app_start() have been released. + */ + +void +isc_app_block(void); +/* + * Indicate that a blocking operation will be performed. + * + * Notes: + * If a blocking operation is in process, a call to isc_app_shutdown() + * or an external signal will abort the program, rather than allowing + * clean shutdown. This is primarily useful for reading user input. + * + * Requires: + * isc_app_start() has been called. + * No other blocking operations are in progress. + */ + +void +isc_app_unblock(void); +/* + * Indicate that a blocking operation is complete. + * + * Notes: + * When a blocking operation has completed, return the program to a + * state where a call to isc_app_shutdown() or an external signal will + * shutdown normally. + * + * Requires: + * isc_app_start() has been called. + * isc_app_block() has been called by the same thread. + */ + + +ISC_LANG_ENDDECLS + +#endif /* ISC_APP_H */ |