-: 0:Source:modperl_global.c -: 0:Object:modperl_global.bb -: 1:/* Copyright 2001-2004 The Apache Software Foundation -: 2: * -: 3: * Licensed under the Apache License, Version 2.0 (the "License"); -: 4: * you may not use this file except in compliance with the License. -: 5: * You may obtain a copy of the License at -: 6: * -: 7: * http://www.apache.org/licenses/LICENSE-2.0 -: 8: * -: 9: * Unless required by applicable law or agreed to in writing, software -: 10: * distributed under the License is distributed on an "AS IS" BASIS, -: 11: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -: 12: * See the License for the specific language governing permissions and -: 13: * limitations under the License. -: 14: */ -: 15: -: 16:#include "mod_perl.h" -: 17: -: 18:void modperl_global_request_cfg_set(request_rec *r) 840: 19:{ 840: 20: MP_dDCFG; 840: 21: MP_dRCFG; -: 22: -: 23: /* only if PerlOptions +GlobalRequest and not done already */ 840: 24: if (MpDirGLOBAL_REQUEST(dcfg) && !MpReqSET_GLOBAL_REQUEST(rcfg)) { 76: 25: modperl_global_request_set(r); -: 26: } -: 27:} -: 28: -: 29:void modperl_global_request_set(request_rec *r) 204: 30:{ 204: 31: MP_dRCFG; 204: 32: request_rec *old_r = NULL; -: 33: -: 34: /* reset old value, important for subrequests */ 204: 35: (void)modperl_tls_get_request_rec(&old_r); 204: 36: modperl_tls_reset_cleanup_request_rec(r->pool, old_r); -: 37: 204: 38: modperl_tls_set_request_rec(r); -: 39: -: 40: /* so 'PerlOptions +GlobalRequest' doesnt wipe us out */ 204: 41: MpReqSET_GLOBAL_REQUEST_On(rcfg); -: 42:} -: 43: -: 44:/* get/set */ -: 45:request_rec *modperl_global_request(pTHX_ SV *svr) 33: 46:{ 33: 47: request_rec *cur = NULL; 33: 48: apr_status_t status = modperl_tls_get_request_rec(&cur); -: 49: 33: 50: if (status != APR_SUCCESS) { -: 51: /* an internal problem */ #####: 52: Perl_croak(aTHX_ "failed to retrieve the request object"); -: 53: } -: 54: 33: 55: if (!cur) { -: 56: /* wrong configuration */ 3: 57: Perl_croak(aTHX_ "Global $r object is not available. Set:\n" -: 58: "\tPerlOptions +GlobalRequest\nin httpd.conf"); -: 59: } -: 60: 30: 61: if (svr) { 2: 62: modperl_global_request_obj_set(aTHX_ svr); -: 63: } -: 64: 30: 65: return cur; -: 66:} -: 67: -: 68:void modperl_global_request_obj_set(pTHX_ SV *svr) 2: 69:{ -: 70: /* XXX: support sublassing */ 2: 71: request_rec *r = modperl_sv2request_rec(aTHX_ svr); 2: 72: modperl_global_request_set(r); -: 73:} -: 74: -: 75:#if MP_THREADED -: 76:static apr_status_t modperl_global_cleanup(void *data) 12: 77:{ 12: 78: modperl_global_t *global = (modperl_global_t *)data; -: 79: 12: 80: MP_TRACE_g(MP_FUNC, "destroy lock for %s\n", global->name); 12: 81: MUTEX_DESTROY(&global->glock); -: 82: 12: 83: return APR_SUCCESS; -: 84:} -: 85:#endif -: 86: -: 87:void modperl_global_init(modperl_global_t *global, apr_pool_t *p, -: 88: void *data, const char *name) 30: 89:{ 30: 90: Zero(global, 1, modperl_global_t); -: 91: 30: 92: global->data = data; 30: 93: global->name = name; -: 94: -: 95:#if MP_THREADED 30: 96: MUTEX_INIT(&global->glock); -: 97: 30: 98: apr_pool_cleanup_register(p, (void *)global, -: 99: modperl_global_cleanup, -: 100: apr_pool_cleanup_null); -: 101:#endif -: 102: 30: 103: MP_TRACE_g(MP_FUNC, "init %s\n", name); -: 104:} -: 105: -: 106:void modperl_global_lock(modperl_global_t *global) #####: 107:{ -: 108:#if MP_THREADED #####: 109: MP_TRACE_g(MP_FUNC, "locking %s\n", global->name); #####: 110: MUTEX_LOCK(&global->glock); -: 111:#endif -: 112:} -: 113: -: 114:void modperl_global_unlock(modperl_global_t *global) #####: 115:{ -: 116:#if MP_THREADED #####: 117: MP_TRACE_g(MP_FUNC, "unlocking %s\n", global->name); #####: 118: MUTEX_UNLOCK(&global->glock); -: 119:#endif -: 120:} -: 121: -: 122:void *modperl_global_get(modperl_global_t *global) 447: 123:{ 447: 124: return global->data; -: 125:} -: 126: -: 127:void modperl_global_set(modperl_global_t *global, void *data) #####: 128:{ #####: 129: global->data = data; -: 130:} -: 131: -: 132:/* hopefully there wont be many of these */ -: 133: -: 134:#define MP_GLOBAL_IMPL(gname, type) \ -: 135: \ -: 136:static modperl_global_t MP_global_##gname; \ -: 137: \ -: 138:void modperl_global_init_##gname(apr_pool_t *p, \ -: 139: type gname) \ -: 140:{ \ -: 141: modperl_global_init(&MP_global_##gname, p, \ -: 142: (void *)gname, #gname); \ -: 143:} \ -: 144: \ -: 145:void modperl_global_lock_##gname(void) \ -: 146:{ \ -: 147: modperl_global_lock(&MP_global_##gname); \ -: 148:} \ -: 149: \ -: 150:void modperl_global_unlock_##gname(void) \ -: 151:{ \ -: 152: modperl_global_unlock(&MP_global_##gname); \ -: 153:} \ -: 154: \ -: 155:type modperl_global_get_##gname(void) \ -: 156:{ \ -: 157: return (type ) \ -: 158: modperl_global_get(&MP_global_##gname); \ -: 159:} \ -: 160: \ -: 161:void modperl_global_set_##gname(void *data) \ -: 162:{ \ -: 163: modperl_global_set(&MP_global_##gname, data); \ -: 164:} \ -: 165: 140: 166:MP_GLOBAL_IMPL(pconf, apr_pool_t *); 794: 167:MP_GLOBAL_IMPL(server_rec, server_rec *); 20: 168:MP_GLOBAL_IMPL(threaded_mpm, int); -: 169: -: 170:#if MP_THREADED -: 171:static apr_status_t modperl_tls_cleanup(void *data) 4: 172:{ 4: 173: return apr_threadkey_private_delete((apr_threadkey_t *)data); -: 174:} -: 175:#endif -: 176: -: 177:apr_status_t modperl_tls_create(apr_pool_t *p, modperl_tls_t **key) 10: 178:{ -: 179:#if MP_THREADED 10: 180: apr_status_t status = apr_threadkey_private_create(key, NULL, p); 10: 181: apr_pool_cleanup_register(p, (void *)*key, -: 182: modperl_tls_cleanup, -: 183: apr_pool_cleanup_null); 10: 184: return status; -: 185:#else -: 186: *key = apr_pcalloc(p, sizeof(**key)); -: 187: return APR_SUCCESS; -: 188:#endif -: 189:} -: 190: -: 191:apr_status_t modperl_tls_get(modperl_tls_t *key, void **data) 238: 192:{ -: 193:#if MP_THREADED 238: 194: if (!key) { #####: 195: *data = NULL; #####: 196: return APR_SUCCESS; -: 197: } 238: 198: return apr_threadkey_private_get(data, key); -: 199:#else -: 200: *data = modperl_global_get((modperl_global_t *)key); -: 201: return APR_SUCCESS; -: 202:#endif -: 203:} -: 204: -: 205:apr_status_t modperl_tls_set(modperl_tls_t *key, void *data) 408: 206:{ -: 207:#if MP_THREADED 408: 208: return apr_threadkey_private_set(data, key); -: 209:#else -: 210: modperl_global_set((modperl_global_t *)key, data); -: 211: return APR_SUCCESS; -: 212:#endif -: 213:} -: 214: -: 215:typedef struct { -: 216: modperl_tls_t *key; -: 217: void *data; -: 218:} modperl_tls_cleanup_data_t; -: 219: -: 220:static apr_status_t modperl_tls_reset(void *data) 204: 221:{ 204: 222: modperl_tls_cleanup_data_t *cdata = 204: 223: (modperl_tls_cleanup_data_t *)data; 204: 224: return modperl_tls_set(cdata->key, cdata->data); -: 225:} -: 226: -: 227:void modperl_tls_reset_cleanup(apr_pool_t *p, modperl_tls_t *key, -: 228: void *data) 204: 229:{ 204: 230: modperl_tls_cleanup_data_t *cdata = 204: 231: (modperl_tls_cleanup_data_t *)apr_palloc(p, sizeof(*cdata)); -: 232: 204: 233: cdata->key = key; 204: 234: cdata->data = data; -: 235: 204: 236: apr_pool_cleanup_register(p, (void *)cdata, -: 237: modperl_tls_reset, -: 238: apr_pool_cleanup_null); -: 239:} -: 240: -: 241:/* hopefully there wont be many of these either */ -: 242: -: 243:#define MP_TLS_IMPL(gname, type) \ -: 244: \ -: 245:static modperl_tls_t *MP_tls_##gname; \ -: 246: \ -: 247:apr_status_t \ -: 248:modperl_tls_create_##gname(apr_pool_t *p) \ -: 249:{ \ -: 250: return modperl_tls_create(p, &MP_tls_##gname); \ -: 251:} \ -: 252: \ -: 253:apr_status_t modperl_tls_get_##gname(type *data) \ -: 254:{ \ -: 255: void *ptr; \ -: 256: apr_status_t status = \ -: 257: modperl_tls_get(MP_tls_##gname, &ptr); \ -: 258: *data = (type )ptr; \ -: 259: return status; \ -: 260:} \ -: 261: \ -: 262:apr_status_t modperl_tls_set_##gname(void *data) \ -: 263:{ \ -: 264: return modperl_tls_set(MP_tls_##gname, data); \ -: 265:} \ -: 266: \ -: 267:void modperl_tls_reset_cleanup_##gname(apr_pool_t *p, \ -: 268: type data) \ -: 269:{ \ -: 270: modperl_tls_reset_cleanup(p, MP_tls_##gname, \ -: 271: (void *)data); \ -: 272:} -: 273: 666: 274:MP_TLS_IMPL(request_rec, request_rec *);