app_api.c

Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 2009, 2013-2015  Internet Systems Consortium, Inc. ("ISC")
00003  *
00004  * Permission to use, copy, modify, and/or distribute this software for any
00005  * purpose with or without fee is hereby granted, provided that the above
00006  * copyright notice and this permission notice appear in all copies.
00007  *
00008  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
00009  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
00010  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
00011  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
00012  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
00013  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
00014  * PERFORMANCE OF THIS SOFTWARE.
00015  */
00016 
00017 /* $Id: app_api.c,v 1.5 2009/09/02 23:48:02 tbox Exp $ */
00018 
00019 #include <config.h>
00020 
00021 #include <unistd.h>
00022 
00023 #include <isc/app.h>
00024 #include <isc/magic.h>
00025 #include <isc/mutex.h>
00026 #include <isc/once.h>
00027 #include <isc/util.h>
00028 
00029 static isc_mutex_t createlock;
00030 static isc_once_t once = ISC_ONCE_INIT;
00031 static isc_appctxcreatefunc_t appctx_createfunc = NULL;
00032 static isc_boolean_t is_running = ISC_FALSE;
00033 
00034 #define ISCAPI_APPMETHODS_VALID(m) ISC_MAGIC_VALID(m, ISCAPI_APPMETHODS_MAGIC)
00035 
00036 static void
00037 initialize(void) {
00038         RUNTIME_CHECK(isc_mutex_init(&createlock) == ISC_R_SUCCESS);
00039 }
00040 
00041 isc_result_t
00042 isc_app_register(isc_appctxcreatefunc_t createfunc) {
00043         isc_result_t result = ISC_R_SUCCESS;
00044 
00045         RUNTIME_CHECK(isc_once_do(&once, initialize) == ISC_R_SUCCESS);
00046 
00047         LOCK(&createlock);
00048         if (appctx_createfunc == NULL)
00049                 appctx_createfunc = createfunc;
00050         else
00051                 result = ISC_R_EXISTS;
00052         UNLOCK(&createlock);
00053 
00054         return (result);
00055 }
00056 
00057 isc_result_t
00058 isc_appctx_create(isc_mem_t *mctx, isc_appctx_t **ctxp) {
00059         isc_result_t result;
00060 
00061         if (isc_bind9)
00062                 return (isc__appctx_create(mctx, ctxp));
00063 
00064         LOCK(&createlock);
00065 
00066         REQUIRE(appctx_createfunc != NULL);
00067         result = (*appctx_createfunc)(mctx, ctxp);
00068 
00069         UNLOCK(&createlock);
00070 
00071         return (result);
00072 }
00073 
00074 void
00075 isc_appctx_destroy(isc_appctx_t **ctxp) {
00076         REQUIRE(ctxp != NULL && ISCAPI_APPCTX_VALID(*ctxp));
00077 
00078         if (isc_bind9)
00079                 isc__appctx_destroy(ctxp);
00080         else
00081                 (*ctxp)->methods->ctxdestroy(ctxp);
00082 
00083         ENSURE(*ctxp == NULL);
00084 }
00085 
00086 isc_result_t
00087 isc_app_ctxstart(isc_appctx_t *ctx) {
00088         REQUIRE(ISCAPI_APPCTX_VALID(ctx));
00089 
00090         if (isc_bind9)
00091                 return (isc__app_ctxstart(ctx));
00092 
00093         return (ctx->methods->ctxstart(ctx));
00094 }
00095 
00096 isc_result_t
00097 isc_app_ctxrun(isc_appctx_t *ctx) {
00098         REQUIRE(ISCAPI_APPCTX_VALID(ctx));
00099 
00100         if (isc_bind9)
00101                 return (isc__app_ctxrun(ctx));
00102 
00103         return (ctx->methods->ctxrun(ctx));
00104 }
00105 
00106 isc_result_t
00107 isc_app_ctxonrun(isc_appctx_t *ctx, isc_mem_t *mctx,
00108                  isc_task_t *task, isc_taskaction_t action,
00109                  void *arg)
00110 {
00111         REQUIRE(ISCAPI_APPCTX_VALID(ctx));
00112 
00113         if (isc_bind9)
00114                 return (isc__app_ctxonrun(ctx, mctx, task, action, arg));
00115 
00116         return (ctx->methods->ctxonrun(ctx, mctx, task, action, arg));
00117 }
00118 
00119 isc_result_t
00120 isc_app_ctxsuspend(isc_appctx_t *ctx) {
00121         REQUIRE(ISCAPI_APPCTX_VALID(ctx));
00122 
00123         if (isc_bind9)
00124                 return (isc__app_ctxsuspend(ctx));
00125 
00126         return (ctx->methods->ctxsuspend(ctx));
00127 }
00128 
00129 isc_result_t
00130 isc_app_ctxshutdown(isc_appctx_t *ctx) {
00131         REQUIRE(ISCAPI_APPCTX_VALID(ctx));
00132 
00133         if (isc_bind9)
00134                 return (isc__app_ctxshutdown(ctx));
00135 
00136         return (ctx->methods->ctxshutdown(ctx));
00137 }
00138 
00139 void
00140 isc_app_ctxfinish(isc_appctx_t *ctx) {
00141         REQUIRE(ISCAPI_APPCTX_VALID(ctx));
00142 
00143         if (isc_bind9)
00144                 isc__app_ctxfinish(ctx);
00145 
00146         ctx->methods->ctxfinish(ctx);
00147 }
00148 
00149 void
00150 isc_appctx_settaskmgr(isc_appctx_t *ctx, isc_taskmgr_t *taskmgr) {
00151         REQUIRE(ISCAPI_APPCTX_VALID(ctx));
00152         REQUIRE(taskmgr != NULL);
00153 
00154         if (isc_bind9)
00155                 isc__appctx_settaskmgr(ctx, taskmgr);
00156 
00157         ctx->methods->settaskmgr(ctx, taskmgr);
00158 }
00159 
00160 void
00161 isc_appctx_setsocketmgr(isc_appctx_t *ctx, isc_socketmgr_t *socketmgr) {
00162         REQUIRE(ISCAPI_APPCTX_VALID(ctx));
00163         REQUIRE(socketmgr != NULL);
00164 
00165         if (isc_bind9)
00166                 isc__appctx_setsocketmgr(ctx, socketmgr);
00167 
00168         ctx->methods->setsocketmgr(ctx, socketmgr);
00169 }
00170 
00171 void
00172 isc_appctx_settimermgr(isc_appctx_t *ctx, isc_timermgr_t *timermgr) {
00173         REQUIRE(ISCAPI_APPCTX_VALID(ctx));
00174         REQUIRE(timermgr != NULL);
00175 
00176         if (isc_bind9)
00177                 isc__appctx_settimermgr(ctx, timermgr);
00178 
00179         ctx->methods->settimermgr(ctx, timermgr);
00180 }
00181 
00182 isc_result_t
00183 isc_app_start(void) {
00184         if (isc_bind9)
00185                 return (isc__app_start());
00186 
00187         return (ISC_R_NOTIMPLEMENTED);
00188 }
00189 
00190 isc_result_t
00191 isc_app_onrun(isc_mem_t *mctx, isc_task_t *task,
00192                isc_taskaction_t action, void *arg)
00193 {
00194         if (isc_bind9)
00195                 return (isc__app_onrun(mctx, task, action, arg));
00196 
00197         return (ISC_R_NOTIMPLEMENTED);
00198 }
00199 
00200 isc_result_t
00201 isc_app_run() {
00202         if (isc_bind9) {
00203                 isc_result_t result;
00204 
00205                 is_running = ISC_TRUE;
00206                 result = isc__app_run();
00207                 is_running = ISC_FALSE;
00208 
00209                 return (result);
00210         }
00211 
00212         return (ISC_R_NOTIMPLEMENTED);
00213 }
00214 
00215 isc_boolean_t
00216 isc_app_isrunning() {
00217         return (is_running);
00218 }
00219 
00220 isc_result_t
00221 isc_app_shutdown(void) {
00222         if (isc_bind9)
00223                 return (isc__app_shutdown());
00224 
00225         return (ISC_R_NOTIMPLEMENTED);
00226 }
00227 
00228 isc_result_t
00229 isc_app_reload(void) {
00230         if (isc_bind9)
00231                 return (isc__app_reload());
00232 
00233         return (ISC_R_NOTIMPLEMENTED);
00234 }
00235 
00236 void
00237 isc_app_finish(void) {
00238         if (!isc_bind9)
00239                 return;
00240 
00241         isc__app_finish();
00242 }
00243 
00244 void
00245 isc_app_block(void) {
00246         if (!isc_bind9)
00247                 return;
00248 
00249         isc__app_block();
00250 }
00251 
00252 void
00253 isc_app_unblock(void) {
00254         if (!isc_bind9)
00255                 return;
00256 
00257         isc__app_unblock();
00258 }

Generated on Tue Apr 28 17:41:03 2015 by Doxygen 1.5.4 for BIND9 Internals 9.11.0pre-alpha