There's a bug in how _POSIX_THREAD_PROCESS_SHARED is checked for, which
is fixed by FreeBSD's ports tree's patches, which is irrelevant since we
seem to unconditionally undef _POSIX_THREAD_PROCESS_SHARED, but is important
for correct semantics later.  With _POSIX_THREAD_PROCESS_SHARED (and all
similar POSIX support symbols), an ifdef check is not the correct way to
check if it is supported.  Such a symbol may be defined, but have the value
-1 to denote that it is unimplemented (or not supported).

Here's diff incl. changelog:
%%%
Index: ChangeLog
===================================================================
RCS file: /cvs/public/mono/mono/io-layer/ChangeLog,v
retrieving revision 1.99
diff -b -d -w -u -r1.99 ChangeLog
--- ChangeLog   8 Dec 2002 13:50:17 -0000       1.99
+++ ChangeLog   12 Dec 2002 01:34:54 -0000
@@ -1,3 +1,11 @@
+2002-12-11  Juli Mallett  <[EMAIL PROTECTED]>
+
+       * daemon.c, handles-private.h, handles.c, wapi-private.h:
+       Check for an implementation which says it supports
+       _POSIX_THREAD_PROCESS_SHARED, rather than just one that
+       defines the symbol.  Defined but with a value of -1 still
+       means that it is unsupported.
+
 2002-12-08  Martin Baulig  <[EMAIL PROTECTED]>
 
        * handles.c (_wapi_handle_new): Create new non-shared handles with
Index: daemon.c
===================================================================
RCS file: /cvs/public/mono/mono/io-layer/daemon.c,v
retrieving revision 1.23
diff -b -d -w -u -r1.23 daemon.c
--- daemon.c    7 Oct 2002 10:21:10 -0000       1.23
+++ daemon.c    12 Dec 2002 01:34:54 -0000
@@ -250,7 +250,7 @@
                
                _wapi_handle_ops_close_shared (GUINT_TO_POINTER (handle));
                
-#ifdef _POSIX_THREAD_PROCESS_SHARED
+#if defined(_POSIX_THREAD_PROCESS_SHARED) && _POSIX_THREAD_PROCESS_SHARED != -1       
+         mono_mutex_destroy (&_wapi_shared_data->handles[handle].signal_mutex);
                pthread_cond_destroy (&_wapi_shared_data->handles[handle].signal_cond);
 #endif
@@ -400,7 +400,7 @@
 
                thread_handle->exitstatus=0;
 
-#ifdef _POSIX_THREAD_PROCESS_SHARED
+#if defined(_POSIX_THREAD_PROCESS_SHARED) && _POSIX_THREAD_PROCESS_SHARED != -1       
+         _wapi_handle_lock_handle (handle);
                _wapi_handle_set_signal_state (handle, TRUE, TRUE);
                _wapi_handle_unlock_handle (handle);
@@ -463,7 +463,7 @@
                _wapi_timeval_to_filetime (&tv,
                                           &process_handle_data->exit_time);
 
-#ifdef _POSIX_THREAD_PROCESS_SHARED
+#if defined(_POSIX_THREAD_PROCESS_SHARED) && _POSIX_THREAD_PROCESS_SHARED != -1       
+         _wapi_handle_lock_handle (process_handle);
                _wapi_handle_set_signal_state (process_handle, TRUE, TRUE);
                _wapi_handle_unlock_handle (process_handle);
Index: handles-private.h
===================================================================
RCS file: /cvs/public/mono/mono/io-layer/handles-private.h,v
retrieving revision 1.9
diff -b -d -w -u -r1.9 handles-private.h
--- handles-private.h   27 Sep 2002 12:02:56 -0000      1.9
+++ handles-private.h   12 Dec 2002 01:34:54 -0000
@@ -109,7 +109,7 @@
                /* Tell everyone blocking on multiple handles that something
                 * was signalled
                 */
-#ifdef _POSIX_THREAD_PROCESS_SHARED
+#if defined(_POSIX_THREAD_PROCESS_SHARED) && _POSIX_THREAD_PROCESS_SHARED != -1       
+         mono_mutex_lock (&_wapi_shared_data->signal_mutex);
                pthread_cond_broadcast (&_wapi_shared_data->signal_cond);
                mono_mutex_unlock (&_wapi_shared_data->signal_mutex);
@@ -144,7 +144,7 @@
 #ifdef DEBUG
        g_message (G_GNUC_PRETTY_FUNCTION ": lock global signal mutex");
 #endif
-#ifdef _POSIX_THREAD_PROCESS_SHARED
+#if defined(_POSIX_THREAD_PROCESS_SHARED) && _POSIX_THREAD_PROCESS_SHARED != -1       
+ return(mono_mutex_lock (&_wapi_shared_data->signal_mutex));
 #else
        return(mono_mutex_lock (&_wapi_private_data->signal_mutex));
@@ -156,7 +156,7 @@
 #ifdef DEBUG
        g_message (G_GNUC_PRETTY_FUNCTION ": unlock global signal mutex");
 #endif
-#ifdef _POSIX_THREAD_PROCESS_SHARED
+#if defined(_POSIX_THREAD_PROCESS_SHARED) && _POSIX_THREAD_PROCESS_SHARED != -1       
+ return(mono_mutex_unlock (&_wapi_shared_data->signal_mutex));
 #else
        return(mono_mutex_unlock (&_wapi_private_data->signal_mutex));
Index: handles.c
===================================================================
RCS file: /cvs/public/mono/mono/io-layer/handles.c,v
retrieving revision 1.28
diff -b -d -w -u -r1.28 handles.c
--- handles.c   8 Dec 2002 13:50:17 -0000       1.28
+++ handles.c   12 Dec 2002 01:34:55 -0000
@@ -147,7 +147,7 @@
        pthread_mutexattr_init (&mutex_shared_attr);
        pthread_condattr_init (&cond_shared_attr);
 
-#ifdef _POSIX_THREAD_PROCESS_SHARED
+#if defined(_POSIX_THREAD_PROCESS_SHARED) && _POSIX_THREAD_PROCESS_SHARED != -1       
+ pthread_mutexattr_setpshared (&mutex_shared_attr,
                                      PTHREAD_PROCESS_SHARED);
        pthread_condattr_setpshared (&cond_shared_attr,
@@ -179,7 +179,7 @@
                        last=i+1;
                        shared->type=type;
                        shared->signalled=FALSE;
-#ifdef _POSIX_THREAD_PROCESS_SHARED
+#if defined(_POSIX_THREAD_PROCESS_SHARED) && _POSIX_THREAD_PROCESS_SHARED != -1       
+                 mono_mutex_init (&_wapi_shared_data->handles[i].signal_mutex, 
+&mutex_shared_attr);
                        pthread_cond_init (&_wapi_shared_data->handles[i].signal_cond, 
&cond_shared_attr);
 #endif
@@ -255,7 +255,7 @@
                return(GUINT_TO_POINTER (_WAPI_HANDLE_INVALID));
        }
 
-#ifndef _POSIX_THREAD_PROCESS_SHARED
+#if !defined(_POSIX_THREAD_PROCESS_SHARED) || _POSIX_THREAD_PROCESS_SHARED == -1
        mono_mutex_init (&_wapi_shared_data->handles[idx].signal_mutex, 
&mutex_shared_attr);
        pthread_cond_init (&_wapi_shared_data->handles[idx].signal_cond, 
&cond_shared_attr);
 #endif
@@ -412,7 +412,7 @@
                        memset (&_wapi_shared_data->handles[idx].u, '\0', 
sizeof(_wapi_shared_data->handles[idx].u));
                
                }
-#ifndef _POSIX_THREAD_PROCESS_SHARED
+#if !defined(_POSIX_THREAD_PROCESS_SHARED) || _POSIX_THREAD_PROCESS_SHARED == -1
                else {
                        mono_mutex_destroy 
(&_wapi_shared_data->handles[idx].signal_mutex);
                        pthread_cond_destroy 
(&_wapi_shared_data->handles[idx].signal_cond);
@@ -1013,7 +1013,7 @@
  */
 int _wapi_handle_wait_signal (void)
 {
-#ifdef _POSIX_THREAD_PROCESS_SHARED
+#if defined(_POSIX_THREAD_PROCESS_SHARED) && _POSIX_THREAD_PROCESS_SHARED != -1       
+ return(mono_cond_wait (&_wapi_shared_data->signal_cond,
                               &_wapi_shared_data->signal_mutex));
 #else
@@ -1035,7 +1035,7 @@
 
 int _wapi_handle_timedwait_signal (struct timespec *timeout)
 {
-#ifdef _POSIX_THREAD_PROCESS_SHARED
+#if defined(_POSIX_THREAD_PROCESS_SHARED) && _POSIX_THREAD_PROCESS_SHARED != -1       
+ return(mono_cond_timedwait (&_wapi_shared_data->signal_cond,
                                    &_wapi_shared_data->signal_mutex,
                                    timeout));
@@ -1067,7 +1067,7 @@
 
 int _wapi_handle_wait_signal_handle (gpointer handle)
 {
-#ifdef _POSIX_THREAD_PROCESS_SHARED
+#if defined(_POSIX_THREAD_PROCESS_SHARED) && _POSIX_THREAD_PROCESS_SHARED != -1       
+ guint32 idx=GPOINTER_TO_UINT (handle);
        
        return(mono_cond_wait (&_wapi_shared_data->handles[idx].signal_cond,
@@ -1093,7 +1093,7 @@
 int _wapi_handle_timedwait_signal_handle (gpointer handle,
                                          struct timespec *timeout)
 {
-#ifdef _POSIX_THREAD_PROCESS_SHARED
+#if defined(_POSIX_THREAD_PROCESS_SHARED) && _POSIX_THREAD_PROCESS_SHARED != -1       
+ guint32 idx=GPOINTER_TO_UINT (handle);
        
        return(mono_cond_timedwait (&_wapi_shared_data->handles[idx].signal_cond,
Index: wapi-private.h
===================================================================
RCS file: /cvs/public/mono/mono/io-layer/wapi-private.h,v
retrieving revision 1.19
diff -b -d -w -u -r1.19 wapi-private.h
--- wapi-private.h      2 Oct 2002 17:00:17 -0000       1.19
+++ wapi-private.h      12 Dec 2002 01:34:55 -0000
@@ -106,7 +106,7 @@
        guchar daemon[MONO_SIZEOF_SUNPATH];
        _wapi_daemon_status daemon_running;
        
-#ifdef _POSIX_THREAD_PROCESS_SHARED
+#if defined(_POSIX_THREAD_PROCESS_SHARED) && _POSIX_THREAD_PROCESS_SHARED != -1       
+ mono_mutex_t signal_mutex;
        pthread_cond_t signal_cond;
 #endif
@@ -134,7 +134,7 @@
  */
 struct _WapiHandlePrivate_list
 {
-#ifndef _POSIX_THREAD_PROCESS_SHARED
+#if !defined(_POSIX_THREAD_PROCESS_SHARED) || _POSIX_THREAD_PROCESS_SHARED == -1
        mono_mutex_t signal_mutex;
        pthread_cond_t signal_cond;
 #endif
%%%

I'd like to commit this some time tonight or tomorrow, if nobody objects.

Thanx,
juli.
-- 
Juli Mallett <[EMAIL PROTECTED]>
OpenDarwin, Mono, FreeBSD Developer.
ircd-hybrid Developer, EFnet addict.
FreeBSD on MIPS-Anything on FreeBSD.

_______________________________________________
Mono-list maillist  -  [EMAIL PROTECTED]
http://lists.ximian.com/mailman/listinfo/mono-list

Reply via email to