00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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 }