Hi Stas

SF>>resource id, and it would need to be a ZTS build. Whatever way you look at
SF>>it, that's a screwed up configuration.

So we would blame the user for our broken code. Do you think it's a good
idea.

No I don't, so I wrote something completely different. Is the attached a better solution? Again, it's intended to work _alongside_ Dmitry's, not replace it. It checks for globals_id_ptr, you need to change that to globals_id if you're trying it against current 5_2.

- Steph


--
Stanislav Malyshev, Zend Products Engineer
[EMAIL PROTECTED]  http://www.zend.com/ +972-3-6139665 ext.115

Index: TSRM/TSRM.c
===================================================================
RCS file: /repository/TSRM/TSRM.c,v
retrieving revision 1.68.2.3
diff -u -r1.68.2.3 TSRM.c
--- TSRM/TSRM.c 14 Mar 2006 15:16:07 -0000      1.68.2.3
+++ TSRM/TSRM.c 11 Jun 2006 07:38:38 -0000
@@ -31,6 +31,7 @@


typedef struct {
+       char *name;
        size_t size;
        ts_allocate_ctor ctor;
        ts_allocate_dtor dtor;
@@ -212,9 +213,12 @@


/* allocates a new thread-safe-resource id */
-TSRM_API ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, size_t size, 
ts_allocate_ctor ctor, ts_allocate_dtor dtor)
+TSRM_API ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, size_t size, 
ts_allocate_ctor ctor, ts_allocate_dtor dtor, ...)
{
        int i;
+       va_list args;
+       char *name = NULL;
+       unsigned char a;

        TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Obtaining a new resource id, %d 
bytes", size));

@@ -222,6 +226,20 @@

        /* obtain a resource id */
        *rsrc_id = TSRM_SHUFFLE_RSRC_ID(id_count++);
+
+       /* pick up internal module name, if one exists */
+       va_start(args, dtor);
+       name = (char *)va_arg(args, int);
+       if (!name || (name && (int) name > CHAR_MIN && (int) name < CHAR_MAX)) {
+               name = NULL; /* missing name or uchar */
+       } else {
+               a = name[0];
+               if (a < 97 || a > 122) {
+                       name = NULL; /* not lowercase ASCII */
+               }
+       }
+       va_end(args);
+
        TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Obtained resource id %d", 
*rsrc_id));

        /* store the new resource type in the resource sizes table */
@@ -235,6 +253,8 @@
                }
                resource_types_table_size = id_count;
        }
+
+       resource_types_table[TSRM_UNSHUFFLE_RSRC_ID(*rsrc_id)].name = name;
        resource_types_table[TSRM_UNSHUFFLE_RSRC_ID(*rsrc_id)].size = size;
        resource_types_table[TSRM_UNSHUFFLE_RSRC_ID(*rsrc_id)].ctor = ctor;
        resource_types_table[TSRM_UNSHUFFLE_RSRC_ID(*rsrc_id)].dtor = dtor;
@@ -542,7 +562,7 @@

                        while (p) {
                                if (p->count > j && p->storage[j]) {
-                                       if (resource_types_table && 
resource_types_table[j].dtor) {
+                                       if (resource_types_table && 
resource_types_table[j].dtor && !resource_types_table[j].done) {
                                                
resource_types_table[j].dtor(p->storage[j], &p->storage);
                                        }
                                        free(p->storage[j]);
@@ -587,6 +607,37 @@
}


+/* Obtain thread id from module name */
+TSRM_API ts_rsrc_id tsrm_get_id(char *name)
+{
+       int i, j;
+
+       tsrm_mutex_lock(tsmm_mutex);
+
+       if (tsrm_tls_table) {
+               for (i = 0; i < tsrm_tls_table_size; i++) {
+                       tsrm_tls_entry *p = tsrm_tls_table[i];
+
+                       while (p) {
+
+                               for (j = 0; j < id_count; j++) {
+                                       if (p->count > j && p->storage[j]) {
+                                               if (resource_types_table[j].name 
&& strcasecmp(name, resource_types_table[j].name) == 0) {
+                                                       
tsrm_mutex_unlock(tsmm_mutex);
+                                                       return 
TSRM_SHUFFLE_RSRC_ID(j);
+                                               }
+                                       }
+                               }
+                               p = p->next;
+                       }
+               }
+       }
+
+       tsrm_mutex_unlock(tsmm_mutex);
+       return FALSE;
+}
+
+
/* Allocate a mutex */
TSRM_API MUTEX_T tsrm_mutex_alloc(void)
{
Index: TSRM/TSRM.h
===================================================================
RCS file: /repository/TSRM/TSRM.h,v
retrieving revision 1.50.2.2
diff -u -r1.50.2.2 TSRM.h
--- TSRM/TSRM.h 14 Mar 2006 15:16:07 -0000      1.50.2.2
+++ TSRM/TSRM.h 11 Jun 2006 05:43:50 -0000
@@ -20,7 +20,7 @@

#ifdef WIN32
# define TSRM_WIN32
-# include "tsrm_config.w32.h"
+# include "tsrm_config_common.h"
#endif

#ifdef TSRM_WIN32
@@ -97,7 +97,7 @@
TSRM_API void tsrm_shutdown(void);

/* allocates a new thread-safe-resource id */
-TSRM_API ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, size_t size, 
ts_allocate_ctor ctor, ts_allocate_dtor dtor);
+TSRM_API ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, size_t size, 
ts_allocate_ctor ctor, ts_allocate_dtor dtor, ...);

/* fetches the requested resource for the current thread */
TSRM_API void *ts_resource_ex(ts_rsrc_id id, THREAD_T *th_id);
@@ -127,6 +127,7 @@

/* utility functions */
TSRM_API THREAD_T tsrm_thread_id(void);
+TSRM_API ts_rsrc_id tsrm_get_id(char* name);
TSRM_API MUTEX_T tsrm_mutex_alloc(void);
TSRM_API void tsrm_mutex_free(MUTEX_T mutexp);
TSRM_API int tsrm_mutex_lock(MUTEX_T mutexp);
Index: TSRM/tsrm_config.w32.h
===================================================================
RCS file: /repository/TSRM/tsrm_config.w32.h,v
retrieving revision 1.5
diff -u -r1.5 tsrm_config.w32.h
--- TSRM/tsrm_config.w32.h      30 Sep 2003 09:49:40 -0000      1.5
+++ TSRM/tsrm_config.w32.h      11 Jun 2006 07:38:14 -0000
@@ -4,10 +4,12 @@
#define HAVE_UTIME 1
#define HAVE_ALLOCA 1
#define HAVE_REALPATH 1
+#define HAVE_LIMITS_H 1

#include <malloc.h>
#include <stdlib.h>
#include <crtdbg.h>
+#include <string.h>

#undef inline
#ifdef ZEND_WIN32_FORCE_INLINE
@@ -16,5 +18,9 @@
# define inline
#endif

+#ifndef strcasecmp
+#define strcasecmp(s1, s2) _stricmp(s1, s2)
+#define strncasecmp(s1, s2, n) _strnicmp(s1, s2, n)
+#endif

#endif
Index: TSRM/tsrm_config_common.h
===================================================================
RCS file: /repository/TSRM/tsrm_config_common.h,v
retrieving revision 1.17.2.1
diff -u -r1.17.2.1 tsrm_config_common.h
--- TSRM/tsrm_config_common.h   20 Dec 2005 14:24:14 -0000      1.17.2.1
+++ TSRM/tsrm_config_common.h   11 Jun 2006 07:24:20 -0000
@@ -57,4 +57,10 @@
# define tsrm_free_alloca(p) free(p)
#endif

+/* the path of least danger */
+#ifndef CHAR_MAX
+#  define CHAR_MAX 127
+#  define CHAR_MIN 0
+#endif
+
#endif /* TSRM_CONFIG_COMMON_H */
Index: Zend/zend_API.c
===================================================================
RCS file: /repository/ZendEngine2/zend_API.c,v
retrieving revision 1.296.2.27.2.17
diff -u -r1.296.2.27.2.17 zend_API.c
--- Zend/zend_API.c     7 Jun 2006 09:43:54 -0000       1.296.2.27.2.17
+++ Zend/zend_API.c     11 Jun 2006 07:20:23 -0000
@@ -1889,6 +1889,17 @@
#if HAVE_LIBDL || defined(HAVE_MACH_O_DYLD_H)
#if !(defined(NETWARE) && defined(APACHE_1_BUILD))
        if (module->handle) {
+#ifdef ZTS
+               if (!module->globals_id_ptr) {
+                       ts_rsrc_id tsrm_id;
+
+                       tsrm_id = tsrm_get_id(module->name);
+
+                       if (tsrm_id) {
+                               ts_free_id(tsrm_id);
+                       }
+               }
+#endif
                DL_UNLOAD(module->handle);
        }
#endif
Index: Zend/zend_API.h
===================================================================
RCS file: /repository/ZendEngine2/zend_API.h,v
retrieving revision 1.207.2.8.2.3
diff -u -r1.207.2.8.2.3 zend_API.h
--- Zend/zend_API.h     7 Jun 2006 09:43:54 -0000       1.207.2.8.2.3
+++ Zend/zend_API.h     11 Jun 2006 06:05:04 -0000
@@ -105,7 +105,7 @@
#define ZEND_EXTERN_MODULE_GLOBALS(module_name)                                 
                        \
        extern ts_rsrc_id module_name##_globals_id;
#define ZEND_INIT_MODULE_GLOBALS(module_name, globals_ctor, globals_dtor)       
\
-       ts_allocate_id(&module_name##_globals_id, 
sizeof(zend_##module_name##_globals), (ts_allocate_ctor) globals_ctor, 
(ts_allocate_dtor) globals_dtor);
+       ts_allocate_id(&module_name##_globals_id, 
sizeof(zend_##module_name##_globals), (ts_allocate_ctor) globals_ctor, 
(ts_allocate_dtor) globals_dtor, #module_name);

#else


-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to