HTTP_HDR_REQ *http_hdr_req_new(void) { HTTP_HDR_REQ *hh; ACL_ARRAY *pool; if (var_http_tls_cache <= 0) { hh = (HTTP_HDR_REQ *) http_hdr_new(sizeof(HTTP_HDR_REQ)); __hdr_init(hh); return hh; } #ifdef USE_TLS_EX pool = (ACL_ARRAY*) acl_pthread_tls_get(&cache_key); if (pool == NULL) { pool = acl_array_create(100); acl_pthread_tls_set(cache_key, pool, (void (*)(void*)) thread_cache_free); } pool = (ACL_ARRAY*) acl_pthread_tls_get(&cache_key); hh = (HTTP_HDR_REQ*) pool->pop_back(pool); if (hh) { __hdr_reset(hh, 1); http_hdr_reset((HTTP_HDR *) hh); return hh; } #else acl_pthread_once(&once_control, cache_init); pool = (ACL_ARRAY*) acl_pthread_getspecific(cache_key); if (pool == NULL) { pool = acl_array_create(100); acl_pthread_setspecific(cache_key, pool); if ((unsigned long) acl_pthread_self() == acl_main_thread_self()) { cache_pool = pool; atexit(main_cache_free); } } hh = (HTTP_HDR_REQ*) pool->pop_back(pool); if (hh) { __hdr_reset(hh, 1); http_hdr_reset((HTTP_HDR *) hh); return hh; } #endif hh = (HTTP_HDR_REQ *) http_hdr_new(sizeof(HTTP_HDR_REQ)); __hdr_init(hh); return hh; }
void http_hdr_req_free(HTTP_HDR_REQ *hh) { ACL_ARRAY *pool; if (hh == NULL) return; if (var_http_tls_cache <= 0 || cache_pool == NULL) { __hdr_free_member(hh); http_hdr_free((HTTP_HDR *) hh); return; } #ifdef USE_TLS_EX pool = (ACL_ARRAY*) acl_pthread_tls_get(&cache_key); if (pool != NULL) { pool->push_back(pool, hh); return; } #else pool = (ACL_ARRAY*) acl_pthread_getspecific(cache_key); if (pool != NULL && acl_array_size(pool) < var_http_tls_cache) { pool->push_back(pool, hh); return; } #endif __hdr_free_member(hh); http_hdr_free((HTTP_HDR *) hh); }
char *acl_getenv(const char *name) { #ifdef ACL_WINDOWS const char *myname = "acl_getenv"; static acl_pthread_key_t buf_key = ACL_TLS_OUT_OF_INDEXES; char *buf; #define ENV_BUF_SIZE 4096 buf = (char*) acl_pthread_tls_get(&buf_key); if (buf == NULL) { if (buf_key == ACL_TLS_OUT_OF_INDEXES) { acl_msg_error("%s(%d): acl_pthread_tls_get error(%s)", myname, __LINE__, acl_last_serror()); return (NULL); } buf = (char*) acl_mymalloc(ENV_BUF_SIZE); acl_pthread_tls_set(buf_key, buf, (void (*)(void*)) acl_myfree_fn); } if (GetEnvironmentVariable(name, buf, ENV_BUF_SIZE) == 0) return (NULL); return (buf); #else return (getenv(name)); #endif }
static char *get_tls_buf(void) { const char *myname = "get_tls_buf"; static acl_pthread_key_t buf_key = ACL_TLS_OUT_OF_INDEXES; char *buf; static char buf_unsafe[BUF_SIZE]; buf = (char*) acl_pthread_tls_get(&buf_key); if (buf != NULL) return (buf); if (buf_key == (acl_pthread_key_t) ACL_TLS_OUT_OF_INDEXES) { acl_msg_warn("%s(%d): acl_pthread_tls_get error(%s), " "use unsafe buf", myname, __LINE__, acl_last_serror()); buf = buf_unsafe; } else { buf = (char*) acl_mycalloc(1, BUF_SIZE); acl_pthread_tls_set(buf_key, buf, (void (*)(void*)) acl_myfree_fn); } return (buf); }
const char *acl_token_name1(const ACL_TOKEN *token) { static acl_pthread_key_t buf_key = (acl_pthread_key_t) ACL_TLS_OUT_OF_INDEXES; ACL_VSTRING *buf; static ACL_VSTRING *__buf_unsafe = NULL; buf = (ACL_VSTRING*) acl_pthread_tls_get(&buf_key); if (buf == NULL) { if (buf_key == (acl_pthread_key_t) ACL_TLS_OUT_OF_INDEXES) { if (__buf_unsafe == NULL) __buf_unsafe = acl_vstring_alloc(256); buf = __buf_unsafe; } else { buf = acl_vstring_alloc(256); acl_pthread_tls_set(buf_key, buf, (void (*)(void*)) acl_vstring_free); } } ACL_VSTRING_RESET(buf); acl_token_name(token, buf); return (STR(buf)); }
const char *acl_getenv_list(void) { const char *myname = "acl_getenv_list"; #ifdef ACL_WINDOWS static acl_pthread_key_t buf_key = ACL_TLS_OUT_OF_INDEXES; ACL_VSTRING *buf; LPTSTR lpszVariable; LPVOID lpvEnv; int i = 0, ch = 0; buf = (ACL_VSTRING*) acl_pthread_tls_get(&buf_key); if (buf == NULL) { if (buf_key == ACL_TLS_OUT_OF_INDEXES) { acl_msg_error("%s(%d): acl_pthread_tls_get error(%s)", myname, __LINE__, acl_last_serror()); return (NULL); } buf = acl_vstring_alloc(256); acl_pthread_tls_set(buf_key, buf, (void (*)(void*)) free_vstring); } else ACL_VSTRING_RESET(buf); lpvEnv = GetEnvironmentStrings(); for (lpszVariable = (LPTSTR) lpvEnv; *lpszVariable; lpszVariable++) { if (i++ > 0) acl_vstring_strcat(buf, ", "); while (*lpszVariable) { ACL_VSTRING_ADDCH(buf, *lpszVariable++); ch = *lpszVariable; } } FreeEnvironmentStrings(lpvEnv); ACL_VSTRING_TERMINATE(buf); return (acl_vstring_str(buf)); #else static acl_pthread_key_t buf_key = (acl_pthread_key_t) ACL_TLS_OUT_OF_INDEXES; ACL_VSTRING *buf; extern char **environ; char **pptr = environ; int i = 0; buf = (ACL_VSTRING*) acl_pthread_tls_get(&buf_key); if (buf == NULL) { if (buf_key == (acl_pthread_key_t) ACL_TLS_OUT_OF_INDEXES) { acl_msg_error("%s(%d): acl_pthread_tls_get error(%s)", myname, __LINE__, acl_last_serror()); return (NULL); } buf = acl_vstring_alloc(256); acl_pthread_tls_set(buf_key, buf, (void (*)(void*)) free_vstring); } else ACL_VSTRING_RESET(buf); while (*pptr) { if (i++ > 0) acl_vstring_strcat(buf, ", "); acl_vstring_strcat(buf, *pptr); pptr++; } return (acl_vstring_str(buf)); #endif }