Hi,
Here is the TSRM diff file in unified diff format.
I have used the command: cvs diff -uN
Regards,
Ananth.
>>> Marcus Boerger <[EMAIL PROTECTED]> 1/30/2004 12:31:43 PM >>>
Hello Ananth,
please provide a unified diff (cvs di -u) and we cannot accept
precompiler statements starting after column 0. You *must* keep
this in mind. For a full list of rules to follow you can visit
the file CODING_STANDARDS.
regards
marcus
Friday, January 30, 2004, 7:11:23 AM, you wrote:
> Oops. I did not know that the system only accepts text/plain
> attachments. Here is the attachment for TSRM diff. This is in
> text format. I will send the diff for the whole project soon.
> Thanks,
> Ananth.
>>>> Derick Rethans <[EMAIL PROTECTED]> 1/29/2004 5:26:01 PM >>>
> On Thu, 29 Jan 2004, Ananth Kesari wrote:
>> Our changes are spread across many files, so I am not sure if we
can
>> checkin at this stage of the release of PHP 5.0. Anyway, I have
>> attached the diff file for TSRM. Please review the same and give me
>> your comments. There are similar changes in other files. If you
> think
>> I should send across the diffs for other files also, then I will do
>> so. Let me know.
> Just make *one* diff against latest CVS of all changes? And you
didn't
> add an attachment (we only accept text/plain attachments here).
>> In the meantime, I have a question. I am interested in contributing
>> to the Open source PHP. I was thinking that the good way to start
>> could be to begin working on some simple defects and fix them.
>> Can you let me know if I can do that and if yes, how? I mean,
>> where to look for the defects filed and what is the procedure to
>> start fixing them?
> Have a look at bugs.php.net, there are plenty of open bugs.
> regards,
> Derick
--
Best regards,
Marcus mailto:[EMAIL PROTECTED]
Index: ./tsrm/TSRM.c
===================================================================
RCS file: /repository/TSRM/TSRM.c,v
retrieving revision 1.55
diff -u -r1.55 TSRM.c
--- ./tsrm/TSRM.c 14 Dec 2003 15:41:50 -0000 1.55
+++ ./tsrm/TSRM.c 30 Jan 2004 12:45:28 -0000
@@ -106,6 +106,18 @@
pth_init();
#elif defined(PTHREADS)
pthread_key_create( &tls_key, 0 );
+#ifdef NETWARE
+ /* Anantha Kesari
+ * For NetWare we have made it such a way that TSRM is started twice when
+ * Apache 2 is reloaded. When Apache2 is restarted, TSRM is started only once.
+ * Due to this, pthread_key_create is called twice. First time when TSRM
+ * is unloaded, the value associated with the key doesn't get cleared properly
+ * though the value itself is freed up. So for safety, the pthread_setspecific
+ * call below clears this value every time the key is created. Without this
call,
+ * Apache 2.0 would crash even when it is loading.
+ */
+ pthread_setspecific(tls_key, 0);
+#endif
#elif defined(TSRM_ST)
st_init();
st_key_create(&tls_key, 0);
@@ -294,15 +306,6 @@
int hash_value;
tsrm_tls_entry *thread_resources;
-#ifdef NETWARE
- /* The below if loop is added for NetWare to fix an abend while unloading PHP
- * when an Apache unload command is issued on the system console.
- * While exiting from PHP, at the end for some reason, this function is called
- * with tsrm_tls_table = NULL. When this happened, the server abends when
- * tsrm_tls_table is accessed since it is NULL.
- */
- if(tsrm_tls_table) {
-#endif
if (!th_id) {
#if defined(PTHREADS)
/* Fast path for looking up the resources for the current
@@ -365,9 +368,6 @@
* changes to the structure as we read it.
*/
TSRM_SAFE_RETURN_RSRC(thread_resources->storage, id, thread_resources->count);
-#ifdef NETWARE
- } /* if(tsrm_tls_table) */
-#endif
}
@@ -434,13 +434,6 @@
{
#ifdef TSRM_WIN32
return GetCurrentThreadId();
-#elif defined(NETWARE)
- /* There seems to be some problem with the LibC call: NXThreadGetId().
- * Due to this, the PHPMyAdmin application is abending in PHP calls.
- * Used the call, kCurrentThread instead and it works fine.
- */
-/* return NXThreadGetId(); */
- return kCurrentThread();
#elif defined(GNUPTH)
return pth_self();
#elif defined(PTHREADS)
@@ -451,6 +444,20 @@
return PIThread_getCurrent();
#elif defined(TSRM_ST)
return st_thread_self();
+#elif defined(NETWARE)
+/* Anantha Kesari. 20 Aug 2003.
+ *
+ * Apache 1.3 is Clib based and it creats the threads using Clib calls.
+ * PHP is LibC based and so here also we should use the Clib calls to
+ * get the ID for these threads. If not, there will be a mismatch in the
+ * threads created and its usage. This will lead to abend when complex scripts
+ * are run and also when multiple scripts are run simulataneously.
+ */
+#ifdef APACHE_2_BUILD
+ return NXThreadGetId();
+#else
+ return kCurrentThread();
+#endif
#elif defined(BETHREADS)
return find_thread(NULL);
#endif
@@ -461,24 +468,10 @@
TSRM_API MUTEX_T tsrm_mutex_alloc(void)
{
MUTEX_T mutexp;
-#ifdef NETWARE
-#ifndef USE_MPK
- /* To use the Recursive Mutex Locking of LibC */
- long flags = NX_MUTEX_RECURSIVE;
- NXHierarchy_t order = 0;
- NX_LOCK_INFO_ALLOC (lockInfo, "PHP-TSRM", 0);
-#endif
-#endif
#ifdef TSRM_WIN32
mutexp = malloc(sizeof(CRITICAL_SECTION));
InitializeCriticalSection(mutexp);
-#elif defined(NETWARE)
-#ifdef USE_MPK
- mutexp = kMutexAlloc((BYTE*)"PHP-TSRM");
-#else
- mutexp = NXMutexAlloc(flags, order, &lockInfo);
-#endif
#elif defined(GNUPTH)
mutexp = (MUTEX_T) malloc(sizeof(*mutexp));
pth_mutex_init(mutexp);
@@ -491,6 +484,17 @@
mutexp = PIPlatform_allocLocalMutex();
#elif defined(TSRM_ST)
mutexp = st_mutex_new();
+#elif defined(NETWARE)
+ #ifdef USE_MPK
+ mutexp = kMutexAlloc((BYTE*)"PHP-TSRM");
+ #else
+ /* To use the Recursive Mutex Locking of LibC */
+ long flags = NX_MUTEX_RECURSIVE;
+ NXHierarchy_t order = 0;
+ NX_LOCK_INFO_ALLOC (lockInfo, "PHP-TSRM", 0);
+
+ mutexp = NXMutexAlloc(flags, order, &lockInfo);
+ #endif
#elif defined(BETHREADS)
mutexp = (beos_ben*)malloc(sizeof(beos_ben));
mutexp->ben = 0;
@@ -510,12 +514,6 @@
#ifdef TSRM_WIN32
DeleteCriticalSection(mutexp);
free(mutexp);
-#elif defined(NETWARE)
-#ifdef USE_MPK
- kMutexFree(mutexp);
-#else
- NXMutexFree(mutexp);
-#endif
#elif defined(GNUPTH)
free(mutexp);
#elif defined(PTHREADS)
@@ -527,6 +525,12 @@
PISync_delete(mutexp);
#elif defined(TSRM_ST)
st_mutex_destroy(mutexp);
+#elif defined(NETWARE)
+ #ifdef USE_MPK
+ kMutexFree(mutexp);
+ #else
+ NXMutexFree(mutexp);
+ #endif
#elif defined(BETHREADS)
delete_sem(mutexp->sem);
free(mutexp);
@@ -545,12 +549,6 @@
#ifdef TSRM_WIN32
EnterCriticalSection(mutexp);
return 1;
-#elif defined(NETWARE)
-#ifdef USE_MPK
- return kMutexLock(mutexp);
-#else
- return NXLock(mutexp);
-#endif
#elif defined(GNUPTH)
return pth_mutex_acquire(mutexp, 0, NULL);
#elif defined(PTHREADS)
@@ -561,6 +559,12 @@
return PISync_lock(mutexp);
#elif defined(TSRM_ST)
return st_mutex_lock(mutexp);
+#elif defined(NETWARE)
+ #ifdef USE_MPK
+ return kMutexLock(mutexp);
+ #else
+ return NXLock(mutexp);
+ #endif
#elif defined(BETHREADS)
if (atomic_add(&mutexp->ben, 1) != 0)
return acquire_sem(mutexp->sem);
@@ -576,12 +580,6 @@
#ifdef TSRM_WIN32
LeaveCriticalSection(mutexp);
return 1;
-#elif defined(NETWARE)
-#ifdef USE_MPK
- return kMutexUnlock(mutexp);
-#else
- return NXUnlock(mutexp);
-#endif
#elif defined(GNUPTH)
return pth_mutex_release(mutexp);
#elif defined(PTHREADS)
@@ -592,6 +590,12 @@
return PISync_unlock(mutexp);
#elif defined(TSRM_ST)
return st_mutex_unlock(mutexp);
+#elif defined(NETWARE)
+ #ifdef USE_MPK
+ return kMutexUnlock(mutexp);
+ #else
+ return NXUnlock(mutexp);
+ #endif
#elif defined(BETHREADS)
if (atomic_add(&mutexp->ben, -1) != 1)
return release_sem(mutexp->sem);
Index: ./tsrm/TSRM.h
===================================================================
RCS file: /repository/TSRM/TSRM.h,v
retrieving revision 1.43
diff -u -r1.43 TSRM.h
--- ./tsrm/TSRM.h 3 Dec 2003 14:26:41 -0000 1.43
+++ ./tsrm/TSRM.h 30 Jan 2004 12:45:28 -0000
@@ -42,6 +42,12 @@
# endif
# include <windows.h>
# include <shellapi.h>
+#elif defined(GNUPTH)
+# include <pth.h>
+#elif defined(PTHREADS)
+# include <pthread.h>
+#elif defined(TSRM_ST)
+# include <st.h>
#elif defined(NETWARE)
# include <nks/thread.h>
#ifdef USE_MPK
@@ -49,12 +55,6 @@
#else
# include <nks/synch.h>
#endif
-#elif defined(GNUPTH)
-# include <pth.h>
-#elif defined(PTHREADS)
-# include <pthread.h>
-#elif defined(TSRM_ST)
-# include <st.h>
#elif defined(BETHREADS)
#include <kernel/OS.h>
#include <TLS.h>
@@ -66,13 +66,6 @@
#ifdef TSRM_WIN32
# define THREAD_T DWORD
# define MUTEX_T CRITICAL_SECTION *
-#elif defined(NETWARE)
-# define THREAD_T NXThreadId_t
-#ifdef USE_MPK
-# define MUTEX_T MUTEX
-#else
-# define MUTEX_T NXMutex_t *
-#endif
#elif defined(GNUPTH)
# define THREAD_T pth_t
# define MUTEX_T pth_mutex_t *
@@ -88,6 +81,13 @@
#elif defined(TSRM_ST)
# define THREAD_T st_thread_t
# define MUTEX_T st_mutex_t
+#elif defined(NETWARE)
+# define THREAD_T NXThreadId_t
+#ifdef USE_MPK
+# define MUTEX_T MUTEX
+#else
+# define MUTEX_T NXMutex_t *
+#endif
#elif defined(BETHREADS)
# define THREAD_T thread_id
typedef struct {
Index: ./tsrm/acconfig.h
===================================================================
RCS file: /repository/TSRM/acconfig.h,v
retrieving revision 1.3
diff -u -r1.3 acconfig.h
--- ./tsrm/acconfig.h 24 Sep 1999 20:52:46 -0000 1.3
+++ ./tsrm/acconfig.h 30 Jan 2004 12:45:28 -0000
@@ -1 +1,24 @@
+/* Anantha Kesari. 20 Aug 2003.
+ *
+ * Define PTHREADS only for Apache 2 and not for Apache 1.3.
+ * This is because the former is LibC based and everything works fine in that case.
+ * The latter is Clib based and so the thread calls will change if we use PTHREADS
+ * and the server abends if we use PTHREADS in PHP for Apache 1.3.
+ *
+ * Explanation:
+ *
+ * In the case of Apache 1.3, pthread_self always returns 0 due to mismatch in
+ * the function calls used to create the treads and getting the IDs for them.
+ * (Threads are created by Apache 1.3 using Clib calls whereas LibC's PTHREAD call
+ * is used to get the ID for these threads).
+ * Now, using this thread specific ID returned by pthread_self, we store some
+ * thread specific data into different hash tables. When we execute multiple scripts
+ * simultaneously, since the ID is always 0, one thread reads/writs data from/into
+ * another thread's data area.
+ * This causes the server to abend.
+ */
+#ifdef APACHE_2_BUILD
+#define PTHREADS
+#else
#undef PTHREADS
+#endif
Index: ./tsrm/tsrm_virtual_cwd.c
===================================================================
RCS file: /repository/TSRM/tsrm_virtual_cwd.c,v
retrieving revision 1.60
diff -u -r1.60 tsrm_virtual_cwd.c
--- ./tsrm/tsrm_virtual_cwd.c 8 Jan 2004 08:14:03 -0000 1.60
+++ ./tsrm/tsrm_virtual_cwd.c 30 Jan 2004 12:45:28 -0000
@@ -42,7 +42,6 @@
#endif
#ifdef NETWARE
-/*#include "pipe.h"*/
#include "tsrm_nw.h"
#endif
@@ -100,10 +99,12 @@
(len == 1 && element[0] == '.')
#elif defined(NETWARE)
-/* NetWare has strtok() (in LibC) and allows both slashes in paths, like Windows --
- but rest of the stuff is like Unix */
-/* strtok() call in LibC is abending when used in a different address space -- hence
using
- PHP's version itself for now */
+/* NetWare has strtok() (in LibC) and allows both slashes in paths, like Windows.
+ * But rest of the stuff is like Unix
+ */
+/* strtok() call in LibC is abending when used in a different address space.
+ * Hence using PHP's version itself for now
+ */
/*#define tsrm_strtok_r(a,b,c) strtok((a),(b))*/
#define TOKENIZER_STRING "/\\"
@@ -139,18 +140,16 @@
#define CWD_STATE_FREE(s) \
free((s)->cwd);
-
-static int php_is_dir_ok(const cwd_state *state)
+
+static int php_is_dir_ok(const cwd_state *state)
{
-#if !(defined(NETWARE) && defined(CLIB_STAT_PATCH))
+#if (defined(NETWARE) && defined(CLIB_STAT_PATCH))
+ struct stat_libc buf;
+#else
struct stat buf;
+#endif
if (stat(state->cwd, &buf) == 0 && S_ISDIR(buf.st_mode))
-#else
- struct stat_libc buf;
-
- if (stat(state->cwd, (struct stat*)(&buf)) == 0 && S_ISDIR(buf.st_mode))
-#endif
return (0);
return (1);
@@ -158,15 +157,13 @@
static int php_is_file_ok(const cwd_state *state)
{
-#if !(defined(NETWARE) && defined(CLIB_STAT_PATCH))
+#if (defined(NETWARE) && defined(CLIB_STAT_PATCH))
+ struct stat_libc buf;
+#else
struct stat buf;
+#endif
if (stat(state->cwd, &buf) == 0 && S_ISREG(buf.st_mode))
-#else
- struct stat_libc buf;
-
- if (stat(state->cwd, (struct stat*)(&buf)) == 0 && S_ISREG(buf.st_mode))
-#endif
return (0);
return (1);
@@ -373,6 +370,9 @@
#ifdef TSRM_WIN32
} else if (IS_SLASH(path_copy[0])) {
copy_amount = 2;
+#elif defined(NETWARE)
+ } else if (IS_SLASH(path_copy[0])) {
+ copy_amount = 4; /* This is the size of the string "sys:" which
is 4 */
#endif
}
@@ -693,8 +693,11 @@
return retval;
}
-#if !(defined(NETWARE) && defined(CLIB_STAT_PATCH))
+#if (defined(NETWARE) && defined(CLIB_STAT_PATCH))
+CWD_API int virtual_stat(const char *path, struct stat_libc *buf TSRMLS_DC)
+#else
CWD_API int virtual_stat(const char *path, struct stat *buf TSRMLS_DC)
+#endif
{
cwd_state new_state;
int retval;
@@ -707,21 +710,6 @@
CWD_STATE_FREE(&new_state);
return retval;
}
-#else
-CWD_API int virtual_stat(const char *path, struct stat_libc *buf TSRMLS_DC)
-{
- cwd_state new_state;
- int retval;
-
- CWD_STATE_COPY(&new_state, &CWDG(cwd));
- virtual_file_ex(&new_state, path, NULL, 1);
-
- retval = stat(new_state.cwd, (struct stat*)buf);
-
- CWD_STATE_FREE(&new_state);
- return retval;
-}
-#endif
#if !defined(TSRM_WIN32) && !defined(NETWARE)
CWD_API int virtual_lstat(const char *path, struct stat *buf TSRMLS_DC)
@@ -811,8 +799,8 @@
#elif defined(NETWARE)
-/* On NetWare, the trick of prepending "cd cwd; " doesn't work so we need to perform
- a VCWD_CHDIR() and mutex it
+/* On NetWare, the trick of prepending "cd cwd;" doesn't work.
+ * So we need to perform a VCWD_CHDIR() and mutex it.
*/
CWD_API FILE *virtual_popen(const char *command, const char *type TSRMLS_DC)
{
Index: ./tsrm/tsrm_virtual_cwd.h
===================================================================
RCS file: /repository/TSRM/tsrm_virtual_cwd.h,v
retrieving revision 1.42
diff -u -r1.42 tsrm_virtual_cwd.h
--- ./tsrm/tsrm_virtual_cwd.h 8 Jan 2004 17:31:46 -0000 1.42
+++ ./tsrm/tsrm_virtual_cwd.h 30 Jan 2004 12:45:28 -0000
@@ -141,10 +141,10 @@
CWD_API int virtual_open(const char *path TSRMLS_DC, int flags, ...);
CWD_API int virtual_creat(const char *path, mode_t mode TSRMLS_DC);
CWD_API int virtual_rename(char *oldname, char *newname TSRMLS_DC);
-#if !(defined(NETWARE) && defined(CLIB_STAT_PATCH))
-CWD_API int virtual_stat(const char *path, struct stat *buf TSRMLS_DC);
-#else
+#if (defined(NETWARE) && defined(CLIB_STAT_PATCH))
CWD_API int virtual_stat(const char *path, struct stat_libc *buf TSRMLS_DC);
+#else
+CWD_API int virtual_stat(const char *path, struct stat *buf TSRMLS_DC);
#endif
#if !defined(TSRM_WIN32) && !defined(NETWARE)
CWD_API int virtual_lstat(const char *path, struct stat *buf TSRMLS_DC);
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php