1/* Licensed to the Apache Software Foundation (ASF) under one or more 2 * contributor license agreements. See the NOTICE file distributed with 3 * this work for additional information regarding copyright ownership. 4 * The ASF licenses this file to You under the Apache License, Version 2.0 5 * (the "License"); you may not use this file except in compliance with 6 * the License. You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include "apr_portable.h" 18#include "apr_arch_threadproc.h" 19 20apr_status_t apr_threadkey_private_create(apr_threadkey_t **key, 21 void (*dest)(void *), apr_pool_t *pool) 22{ 23 apr_status_t stat; 24 25 (*key) = (apr_threadkey_t *)apr_palloc(pool, sizeof(apr_threadkey_t)); 26 if ((*key) == NULL) { 27 return APR_ENOMEM; 28 } 29 30 (*key)->pool = pool; 31 32 if ((stat = NXKeyCreate(NULL, dest, &(*key)->key)) == 0) { 33 return stat; 34 } 35 return stat; 36} 37 38apr_status_t apr_threadkey_private_get(void **new, apr_threadkey_t *key) 39{ 40 apr_status_t stat; 41 42 if ((stat = NXKeyGetValue(key->key, new)) == 0) { 43 return APR_SUCCESS; 44 } 45 else { 46 return stat; 47 } 48} 49 50apr_status_t apr_threadkey_private_set(void *priv, apr_threadkey_t *key) 51{ 52 apr_status_t stat; 53 if ((stat = NXKeySetValue(key->key, priv)) == 0) { 54 return APR_SUCCESS; 55 } 56 else { 57 return stat; 58 } 59} 60 61apr_status_t apr_threadkey_private_delete(apr_threadkey_t *key) 62{ 63 apr_status_t stat; 64 if ((stat = NXKeyDelete(key->key)) == 0) { 65 return APR_SUCCESS; 66 } 67 return stat; 68} 69 70apr_status_t apr_threadkey_data_get(void **data, const char *key, apr_threadkey_t *threadkey) 71{ 72 return apr_pool_userdata_get(data, key, threadkey->pool); 73} 74 75apr_status_t apr_threadkey_data_set(void *data, 76 const char *key, apr_status_t (*cleanup) (void *), 77 apr_threadkey_t *threadkey) 78{ 79 return apr_pool_userdata_set(data, key, cleanup, threadkey->pool); 80} 81 82apr_status_t apr_os_threadkey_get(apr_os_threadkey_t *thekey, 83 apr_threadkey_t *key) 84{ 85 thekey = &(key->key); 86 return APR_SUCCESS; 87} 88 89apr_status_t apr_os_threadkey_put(apr_threadkey_t **key, 90 apr_os_threadkey_t *thekey, apr_pool_t *pool) 91{ 92 if (pool == NULL) { 93 return APR_ENOPOOL; 94 } 95 if ((*key) == NULL) { 96 (*key) = (apr_threadkey_t *)apr_palloc(pool, sizeof(apr_threadkey_t)); 97 (*key)->pool = pool; 98 } 99 (*key)->key = *thekey; 100 return APR_SUCCESS; 101} 102 103