nginx-0.0.7-2004-07-07-19:01:00 import
diff --git a/src/core/ngx_cycle.c b/src/core/ngx_cycle.c
index 5a19f30..fe6abc2 100644
--- a/src/core/ngx_cycle.c
+++ b/src/core/ngx_cycle.c
@@ -15,6 +15,10 @@
ngx_uint_t ngx_test_config;
+#if (NGX_THREADS)
+ngx_tls_key_t ngx_core_tls_key;
+#endif
+
/* STUB NAME */
static ngx_connection_t dumb;
diff --git a/src/core/ngx_cycle.h b/src/core/ngx_cycle.h
index 5708ce4..8452189 100644
--- a/src/core/ngx_cycle.h
+++ b/src/core/ngx_cycle.h
@@ -49,6 +49,11 @@
} ngx_core_conf_t;
+typedef struct {
+ ngx_pool_t *pool; /* pcre's malloc() pool */
+} ngx_core_tls_t;
+
+
ngx_cycle_t *ngx_init_cycle(ngx_cycle_t *old_cycle);
ngx_int_t ngx_create_pidfile(ngx_cycle_t *cycle, ngx_cycle_t *old_cycle);
void ngx_delete_pidfile(ngx_cycle_t *cycle);
@@ -60,6 +65,9 @@
extern ngx_array_t ngx_old_cycles;
extern ngx_module_t ngx_core_module;
extern ngx_uint_t ngx_test_config;
+#if (NGX_THREADS)
+extern ngx_tls_key_t ngx_core_tls_key;
+#endif
#endif /* _NGX_CYCLE_H_INCLUDED_ */
diff --git a/src/core/ngx_regex.c b/src/core/ngx_regex.c
index 617fddc..f4d827d 100644
--- a/src/core/ngx_regex.c
+++ b/src/core/ngx_regex.c
@@ -7,7 +7,6 @@
static void ngx_regex_free(void *p);
-/* THREADS: this pool should be private for each thread */
static ngx_pool_t *ngx_pcre_pool;
@@ -21,12 +20,29 @@
ngx_regex_t *ngx_regex_compile(ngx_str_t *pattern, ngx_int_t options,
ngx_pool_t *pool, ngx_str_t *err)
{
- int erroff;
- const char *errstr;
- ngx_regex_t *re;
+ int erroff;
+ const char *errstr;
+ ngx_regex_t *re;
+#if (NGX_THREADS)
+ ngx_core_tls_t *tls;
+
+#if (NGX_SUPPRESS_WARN)
+ tls = NULL;
+#endif
+
+ if (ngx_threaded) {
+ tls = ngx_thread_get_tls(ngx_core_tls_key);
+ tls->pool = pool;
+ } else {
+ ngx_pcre_pool = pool;
+ }
+
+#else
ngx_pcre_pool = pool;
+#endif
+
re = pcre_compile((const char *) pattern->data, (int) options,
&errstr, &erroff, NULL);
@@ -44,7 +60,15 @@
/* ensure that there is no current pool */
+#if (NGX_THREADS)
+ if (ngx_threaded) {
+ tls->pool = NULL;
+ } else {
+ ngx_pcre_pool = NULL;
+ }
+#else
ngx_pcre_pool = NULL;
+#endif
return re;
}
@@ -68,8 +92,22 @@
static void *ngx_regex_malloc(size_t size)
{
- if (ngx_pcre_pool) {
- return ngx_palloc(ngx_pcre_pool, size);
+ ngx_pool_t *pool;
+#if (NGX_THREADS)
+ ngx_core_tls_t *tls;
+
+ if (ngx_threaded) {
+ tls = ngx_thread_get_tls(ngx_core_tls_key);
+ pool = tls->pool;
+ } else {
+ pool = ngx_pcre_pool;
+ }
+#else
+ pool = ngx_pcre_pool;
+#endif
+
+ if (pool) {
+ return ngx_palloc(pool, size);
}
return NULL;