/usr/include/isc/app.h is in libbind-dev 1:9.11.3+dfsg-1ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 | /*
* Copyright (C) 1999-2001, 2004-2007, 2009, 2013-2016 Internet Systems Consortium, Inc. ("ISC")
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
/* $Id: app.h,v 1.11 2009/09/02 23:48:03 tbox Exp $ */
#ifndef ISC_APP_H
#define ISC_APP_H 1
/*****
***** Module Info
*****/
/*! \file isc/app.h
* \brief 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:
*
*\li isc_app_start(); Call very early in main(), before
* any other threads have been created.
*
*\li 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.
*
*\li 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.
*
* This module also supports per-thread 'application contexts'. With this
* mode, a thread-based application will have a separate context, in which
* it uses other ISC library services such as tasks or timers. Signals are
* not caught in this mode, so that the application can handle the signals
* in its preferred way.
*
* \li 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).
*
* The same note applies to isc_app_ctxXXX() functions, but in this case
* it's a per-thread restriction. For example, a thread with an
* application context must ensure that isc_app_ctxstart() with the
* context is called at most once.
*
* \li Reliability:
* No anticipated impact.
*
* \li Resources:
* None.
*
* \li Security:
* No anticipated impact.
*
* \li Standards:
* None.
*/
#include <isc/eventclass.h>
#include <isc/lang.h>
#include <isc/magic.h>
#include <isc/result.h>
/***
*** Types
***/
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)
/*%
* app module methods. Only app driver implementations use this structure.
* Other clients should use the top-level interfaces (i.e., isc_app_xxx
* functions). magic must be ISCAPI_APPMETHODS_MAGIC.
*/
typedef struct isc_appmethods {
void (*ctxdestroy)(isc_appctx_t **ctxp);
isc_result_t (*ctxstart)(isc_appctx_t *ctx);
isc_result_t (*ctxrun)(isc_appctx_t *ctx);
isc_result_t (*ctxsuspend)(isc_appctx_t *ctx);
isc_result_t (*ctxshutdown)(isc_appctx_t *ctx);
void (*ctxfinish)(isc_appctx_t *ctx);
void (*settaskmgr)(isc_appctx_t *ctx,
isc_taskmgr_t *timermgr);
void (*setsocketmgr)(isc_appctx_t *ctx,
isc_socketmgr_t *timermgr);
void (*settimermgr)(isc_appctx_t *ctx,
isc_timermgr_t *timermgr);
isc_result_t (*ctxonrun)(isc_appctx_t *ctx, isc_mem_t *mctx,
isc_task_t *task, isc_taskaction_t action,
void *arg);
} isc_appmethods_t;
/*%
* This structure is actually just the common prefix of an application context
* implementation's version of an isc_appctx_t.
* \brief
* Direct use of this structure by clients is forbidden. app implementations
* may change the structure. 'magic' must be ISCAPI_APPCTX_MAGIC for any
* of the isc_app_ routines to work. app implementations must maintain
* all app context invariants.
*/
struct isc_appctx {
unsigned int impmagic;
unsigned int magic;
isc_appmethods_t *methods;
};
#define ISCAPI_APPCTX_MAGIC ISC_MAGIC('A','a','p','c')
#define ISCAPI_APPCTX_VALID(c) ((c) != NULL && \
(c)->magic == ISCAPI_APPCTX_MAGIC)
ISC_LANG_BEGINDECLS
isc_result_t
isc_app_ctxstart(isc_appctx_t *ctx);
isc_result_t
isc_app_start(void);
/*!<
* \brief 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.
*
* Requires:
*\li 'ctx' is a valid application context (for app_ctxstart()).
*/
isc_result_t
isc_app_ctxonrun(isc_appctx_t *ctx, isc_mem_t *mctx, isc_task_t *task,
isc_taskaction_t action, void *arg);
isc_result_t
isc_app_onrun(isc_mem_t *mctx, isc_task_t *task, isc_taskaction_t action,
void *arg);
/*!<
* \brief Request delivery of an event when the application is run.
*
* Requires:
*\li isc_app_start() has been called.
*\li 'ctx' is a valid application context (for app_ctxonrun()).
*
* Returns:
* ISC_R_SUCCESS
* ISC_R_NOMEMORY
*/
isc_result_t
isc_app_ctxrun(isc_appctx_t *ctx);
isc_result_t
isc_app_run(void);
/*!<
* \brief Run an ISC library application.
*
* Notes:
*\li 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:
*\li isc_app_[ctx]start() has been called.
*
* Ensures:
*\li Any events requested via isc_app_onrun() will have been posted (in
* FIFO order) before isc_app_run() blocks.
*\li 'ctx' is a valid application context (for app_ctxrun()).
*
* Returns:
*\li ISC_R_SUCCESS Shutdown has been requested.
*\li ISC_R_RELOAD Reload has been requested.
*/
isc_boolean_t
isc_app_isrunning(void);
/*!<
* \brief Return if the ISC library application is running.
*
* Returns:
*\li ISC_TRUE App is running.
*\li ISC_FALSE App is not running.
*/
isc_result_t
isc_app_ctxshutdown(isc_appctx_t *ctx);
isc_result_t
isc_app_shutdown(void);
/*!<
* \brief Request application shutdown.
*
* Notes:
*\li It is safe to call isc_app_shutdown() multiple times. Shutdown will
* only be triggered once.
*
* Requires:
*\li isc_app_[ctx]run() has been called.
*\li 'ctx' is a valid application context (for app_ctxshutdown()).
*
* Returns:
*\li ISC_R_SUCCESS
*\li ISC_R_UNEXPECTED
*/
isc_result_t
isc_app_ctxsuspend(isc_appctx_t *ctx);
/*!<
* \brief This has the same behavior as isc_app_ctxsuspend().
*/
isc_result_t
isc_app_reload(void);
/*!<
* \brief Request application reload.
*
* Requires:
*\li isc_app_run() has been called.
*
* Returns:
*\li ISC_R_SUCCESS
*\li ISC_R_UNEXPECTED
*/
void
isc_app_ctxfinish(isc_appctx_t *ctx);
void
isc_app_finish(void);
/*!<
* \brief Finish an ISC library application.
*
* Notes:
*\li This call should be made at or near the end of main().
*
* Requires:
*\li isc_app_start() has been called.
*\li 'ctx' is a valid application context (for app_ctxfinish()).
*
* Ensures:
*\li Any resources allocated by isc_app_start() have been released.
*/
void
isc_app_block(void);
/*!<
* \brief Indicate that a blocking operation will be performed.
*
* Notes:
*\li 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:
* \li isc_app_start() has been called.
* \li No other blocking operations are in progress.
*/
void
isc_app_unblock(void);
/*!<
* \brief Indicate that a blocking operation is complete.
*
* Notes:
* \li 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:
* \li isc_app_start() has been called.
* \li isc_app_block() has been called by the same thread.
*/
isc_result_t
isc_appctx_create(isc_mem_t *mctx, isc_appctx_t **ctxp);
/*!<
* \brief Create an application context.
*
* Requires:
*\li 'mctx' is a valid memory context.
*\li 'ctxp' != NULL && *ctxp == NULL.
*/
void
isc_appctx_destroy(isc_appctx_t **ctxp);
/*!<
* \brief Destroy an application context.
*
* Requires:
*\li '*ctxp' is a valid application context.
*
* Ensures:
*\li *ctxp == NULL.
*/
void
isc_appctx_settaskmgr(isc_appctx_t *ctx, isc_taskmgr_t *taskmgr);
/*!<
* \brief Associate a task manager with an application context.
*
* This must be done before running tasks within the application context.
*
* Requires:
*\li 'ctx' is a valid application context.
*\li 'taskmgr' is a valid task manager.
*/
void
isc_appctx_setsocketmgr(isc_appctx_t *ctx, isc_socketmgr_t *socketmgr);
/*!<
* \brief Associate a socket manager with an application context.
*
* This must be done before handling socket events within the application
* context.
*
* Requires:
*\li 'ctx' is a valid application context.
*\li 'socketmgr' is a valid socket manager.
*/
void
isc_appctx_settimermgr(isc_appctx_t *ctx, isc_timermgr_t *timermgr);
/*!<
* \brief Associate a socket timer with an application context.
*
* This must be done before handling timer events within the application
* context.
*
* Requires:
*\li 'ctx' is a valid application context.
*\li 'timermgr' is a valid timer manager.
*/
/*%<
* See isc_appctx_create() above.
*/
typedef isc_result_t
(*isc_appctxcreatefunc_t)(isc_mem_t *mctx, isc_appctx_t **ctxp);
isc_result_t
isc_app_register(isc_appctxcreatefunc_t createfunc);
/*%<
* Register a new application implementation and add it to the list of
* supported implementations. This function must be called when a different
* event library is used than the one contained in the ISC library.
*/
isc_result_t
isc__app_register(void);
/*%<
* A short cut function that specifies the application module in the ISC
* library for isc_app_register(). An application that uses the ISC library
* usually do not have to care about this function: it would call
* isc_lib_register(), which internally calls this function.
*/
ISC_LANG_ENDDECLS
#endif /* ISC_APP_H */
|