On Thu, 31 Oct 2002, Alexander Kabaev wrote:

> On Wed, 30 Oct 2002 22:25:12 -0500 (EST)
> Daniel Eischen <[EMAIL PROTECTED]> wrote:
>
> > > If last weak will win, the normal case when Xthrstub is loaded
> > > _after_ libc_r will break. The only way to really fix this is to
> > > export pthread_ symbols as strong in libc_r. Exporting them as weak
> > > sounds like is a mistake which should be fixed.
> >
> > I disagree.  See Solaris 6, 7, 8 & 9 for an example.
> >
> Cool. Then let's be consistent and follow Solaris all the way. Libc on
> Solaris provides full set of pthread_? functions which in turn call
> weakly defined _pthread_?? counterparts. libpthread in turn provides
> strong definitions for _pthread_??.
>
> Since in absolute majority of cases libc is the first library searched
> for symbols, all pthread references will be bound to it and failure
> described by Doug will not happen.
>
> Any library providing strong pthread_ definitions will be able to
> override ones provided by the system.

Something along these lines appears to work nicely and ought to work
either with or without libXThrStub, which is now redundant since libc will
be providing strong symbols that override all the weak symbols in
libXThrStub. We should adjust the XFree86-4-libraries port to avoid
building and using that library.

Index: gen/_pthread_stubs.c
===================================================================
RCS file: /home/ncvs/src/lib/libc/gen/_pthread_stubs.c,v
retrieving revision 1.7
diff -u -r1.7 _pthread_stubs.c
--- gen/_pthread_stubs.c        19 Sep 2002 01:09:49 -0000      1.7
+++ gen/_pthread_stubs.c        31 Oct 2002 09:31:25 -0000
@@ -31,6 +31,9 @@
 #include <pthread.h>
 #include <pthread_np.h>

+void *_pthread_getspecific(pthread_key_t key);
+pthread_t _pthread_self(void);
+
 /*
  * Weak symbols: All libc internal usage of these functions should
  * use the weak symbol versions (_pthread_XXX).  If libpthread is
@@ -42,6 +45,7 @@
  */
 __weak_reference(_pthread_cond_init_stub,      _pthread_cond_init);
 __weak_reference(_pthread_cond_signal_stub,    _pthread_cond_signal);
+__weak_reference(_pthread_cond_broadcast_stub, _pthread_cond_broadcast);
 __weak_reference(_pthread_cond_wait_stub,      _pthread_cond_wait);
 __weak_reference(_pthread_cond_destroy_stub,   _pthread_cond_destroy);
 __weak_reference(_pthread_getspecific_stub,    _pthread_getspecific);
@@ -87,6 +91,12 @@
 }

 int
+_pthread_cond_broadcast_stub(pthread_cond_t *cond)
+{
+       return (0);
+}
+
+int
 _pthread_cond_wait_stub(pthread_cond_t *cond, pthread_mutex_t *mutex)
 {
        return (0);
@@ -235,4 +245,174 @@
 _pthread_sigmask_stub(int how, const sigset_t *set, sigset_t *oset)
 {
        return (0);
+}
+
+int
+pthread_cond_init(pthread_cond_t *cond,
+    const pthread_condattr_t *cond_attr)
+{
+       return (_pthread_cond_init(cond, cond_attr));
+}
+
+int
+pthread_cond_signal(pthread_cond_t *cond)
+{
+       return (_pthread_cond_signal(cond));
+}
+
+int
+pthread_cond_broadcast(pthread_cond_t *cond)
+{
+       return (_pthread_cond_broadcast(cond));
+}
+
+int
+pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
+{
+       return (_pthread_cond_wait(cond, mutex));
+}
+
+int
+pthread_cond_destroy(pthread_cond_t *cond)
+{
+       return (_pthread_cond_destroy(cond));
+}
+
+void *
+pthread_getspecific(pthread_key_t key)
+{
+       return (_pthread_getspecific(key));
+}
+
+int
+pthread_key_create(pthread_key_t *key, void (*destructor) (void *))
+{
+       return (_pthread_key_create(key, destructor));
+}
+
+int
+pthread_key_delete(pthread_key_t key)
+{
+       return (_pthread_key_delete(key));
+}
+
+int
+pthread_main_np()
+{
+       return (_pthread_main_np());
+}
+
+int
+pthread_mutex_destroy(pthread_mutex_t *mattr)
+{
+       return (_pthread_mutex_destroy(mattr));
+}
+
+int
+pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mattr)
+{
+       return (_pthread_mutex_init(mutex, mattr));
+}
+
+int
+pthread_mutex_lock(pthread_mutex_t *mutex)
+{
+       return (_pthread_mutex_lock(mutex));
+}
+
+int
+pthread_mutex_trylock(pthread_mutex_t *mutex)
+{
+       return (_pthread_mutex_trylock(mutex));
+}
+
+int
+pthread_mutex_unlock(pthread_mutex_t *mutex)
+{
+       return (_pthread_mutex_unlock(mutex));
+}
+
+int
+pthread_mutexattr_init(pthread_mutexattr_t *mattr)
+{
+       return (_pthread_mutexattr_init(mattr));
+}
+
+int
+pthread_mutexattr_destroy(pthread_mutexattr_t *mattr)
+{
+       return (_pthread_mutexattr_destroy(mattr));
+}
+
+int
+pthread_mutexattr_settype(pthread_mutexattr_t *mattr, int type)
+{
+       return (_pthread_mutexattr_settype(mattr, type));
+}
+
+int
+pthread_once(pthread_once_t *once_control, void (*init_routine) (void))
+{
+       return (_pthread_once(once_control, init_routine));
+}
+
+int
+pthread_rwlock_init(pthread_rwlock_t *rwlock,
+    const pthread_rwlockattr_t *attr)
+{
+       return (_pthread_rwlock_init(rwlock, attr));
+}
+
+int
+pthread_rwlock_destroy(pthread_rwlock_t *rwlock)
+{
+       return (_pthread_rwlock_destroy(rwlock));
+}
+
+int
+pthread_rwlock_rdlock(pthread_rwlock_t *rwlock)
+{
+       return (_pthread_rwlock_rdlock(rwlock));
+}
+
+int
+pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock)
+{
+       return (_pthread_rwlock_tryrdlock(rwlock));
+}
+
+int
+pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock)
+{
+       return (_pthread_rwlock_trywrlock(rwlock));
+}
+
+int
+pthread_rwlock_unlock(pthread_rwlock_t *rwlock)
+{
+       return (_pthread_rwlock_unlock(rwlock));
+}
+
+int
+pthread_rwlock_wrlock(pthread_rwlock_t *rwlock)
+{
+       return (_pthread_rwlock_wrlock(rwlock));
+}
+
+pthread_t
+pthread_self(void)
+{
+       return (_pthread_self());
+}
+
+int
+pthread_setspecific(pthread_key_t key, const void *value)
+{
+       return (_pthread_setspecific(key, value));
+}
+
+int
+pthread_sigmask(int how, const sigset_t *set, sigset_t *oset)
+{
+       return (_pthread_sigmask(how, set, oset));
 }
Index: include/namespace.h
===================================================================
RCS file: /home/ncvs/src/lib/libc/include/namespace.h,v
retrieving revision 1.9
diff -u -r1.9 namespace.h
--- include/namespace.h 29 Mar 2002 22:43:42 -0000      1.9
+++ include/namespace.h 30 Oct 2002 20:04:44 -0000
@@ -77,6 +77,7 @@
 #define                open                            _open
 #define                poll                            _poll
 #define                pthread_cond_signal             _pthread_cond_signal
+#define                pthread_cond_broadcast          _pthread_cond_broadcast
 #define                pthread_cond_wait               _pthread_cond_wait
 #define                pthread_cond_init               _pthread_cond_init
 #define                pthread_exit                    _pthread_exit
Index: include/reentrant.h
===================================================================
RCS file: /home/ncvs/src/lib/libc/include/reentrant.h,v
retrieving revision 1.1
diff -u -r1.1 reentrant.h
--- include/reentrant.h 19 Mar 2001 12:49:49 -0000      1.1
+++ include/reentrant.h 30 Oct 2002 20:04:44 -0000
@@ -109,6 +109,8 @@
 #define cond_init(c, a, p)     _pthread_cond_init(c, a)
 #define cond_signal(m)         if (__isthreaded) \
                                _pthread_cond_signal(m)
+#define cond_broadcast(m)      if (__isthreaded) \
+                               _pthread_cond_broadcast(m)
 #define cond_wait(c, m)                if (__isthreaded) \
                                _pthread_cond_wait(c, m)


-- 
Doug Rabson                             Mail:  [EMAIL PROTECTED]
                                        Phone: +44 20 8348 6160



To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to