This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Hi!
All GCCs which are using libio (ie. < 3.0) depend on _IO_lock_t in
<bits/stdio-lock.h> being an complete type if _MTSAFE_IO (until now
linuxthread's bits/stdio-lock.h simply declared
typedef pthread_mutex_t _IO_lock_t).
On the other side, bits/libc-lock.h does not want its locks to be used
outside of _LIBC, so it defined its locks as opaque structures, so that apps
can use only pointers to locks.
But as stdio-lock.h is not modeled on top of libc-lock.h's locks, this means
one cannot rebuild GCC < 3.0 any more.
Here is a possible solution, which tries to keep status quo in that standard
libc-lock.h's types are opaque outside of glibc, _IO_lock_t is not opaque
and stdio-lock.h can be shared.
Other possibilities include separate stdio-lock.h headers for each
implementation, including some other new per-implementation header in
stdio-lock.h (like bits/libc-io-lock.h) or giving up and using non-opaque
libc-lock.h types for recursive lock.
2001-08-26 Jakub Jelinek <jakub@redhat.com>
* sysdeps/pthread/bits/libc-lock.h (__libc_iolock_recursive_t): New
type.
(__libc_iolock_define_recursive): Define.
* sysdeps/generic/bits/stdio-lock.h (_IO_lock_t): Use
__libc_iolock_define_recursive.
* sysdeps/generic/bits/libc-lock.h (__libc_iolock_define_recursive):
Define.
* sysdeps/mach/hurd/bits/libc-lock.h (__libc_iolock_recursive_t):
New type.
(__libc_iolock_define_recursive): Define.
--- libc/linuxthreads/sysdeps/pthread/bits/libc-lock.h.jj Fri Aug 24 11:09:51 2001
+++ libc/linuxthreads/sysdeps/pthread/bits/libc-lock.h Sun Aug 26 21:41:04 2001
@@ -27,10 +27,12 @@
typedef pthread_mutex_t __libc_lock_t;
typedef pthread_rwlock_t __libc_rwlock_t;
typedef struct { pthread_mutex_t mutex; } __libc_lock_recursive_t;
+#define __libc_iolock_recursive_t __libc_lock_recursive_t
#else
typedef struct __libc_lock_opaque__ __libc_lock_t;
typedef struct __libc_lock_recursive_opaque__ __libc_lock_recursive_t;
typedef struct __libc_rwlock_opaque__ __libc_rwlock_t;
+typedef struct { pthread_mutex_t mutex; } __libc_iolock_recursive_t;
#endif
/* Type for key to thread-specific data. */
@@ -49,6 +51,8 @@ typedef pthread_key_t __libc_key_t;
CLASS __libc_rwlock_t NAME;
#define __libc_lock_define_recursive(CLASS,NAME) \
CLASS __libc_lock_recursive_t NAME;
+#define __libc_iolock_define_recursive(CLASS,NAME) \
+ CLASS __libc_iolock_recursive_t NAME;
/* Define an initialized lock variable NAME with storage class CLASS.
--- libc/sysdeps/generic/bits/stdio-lock.h.jj Fri Aug 24 11:10:54 2001
+++ libc/sysdeps/generic/bits/stdio-lock.h Sun Aug 26 21:41:53 2001
@@ -22,7 +22,7 @@
#include <bits/libc-lock.h>
-__libc_lock_define_recursive (typedef, _IO_lock_t)
+__libc_iolock_define_recursive (typedef, _IO_lock_t)
/* We need recursive (counting) mutexes. */
#ifdef _LIBC_LOCK_RECURSIVE_INITIALIZER
--- libc/sysdeps/generic/bits/libc-lock.h.jj Fri Aug 24 11:10:54 2001
+++ libc/sysdeps/generic/bits/libc-lock.h Sun Aug 26 21:45:01 2001
@@ -30,6 +30,7 @@
of libc. */
#define __libc_lock_define(CLASS,NAME)
#define __libc_lock_define_recursive(CLASS,NAME)
+#define __libc_iolock_define_recursive(CLASS,NAME)
#define __libc_rwlock_define(CLASS,NAME)
/* Define an initialized lock variable NAME with storage class CLASS. */
--- libc/sysdeps/mach/hurd/bits/libc-lock.h.jj Fri Aug 24 05:21:28 2001
+++ libc/sysdeps/mach/hurd/bits/libc-lock.h Sun Aug 26 21:47:58 2001
@@ -33,10 +33,16 @@ typedef struct
} __libc_lock_recursive_t;
#define __libc_lock_owner_self() ((void *) __hurd_threadvar_location (0))
-
+#define __libc_iolock_recursive_t __libc_lock_recursive_t
#else
typedef struct __libc_lock_opaque__ __libc_lock_t;
typedef struct __libc_lock_recursive_opaque__ __libc_lock_recursive_t;
+typedef struct
+{
+ struct mutex mutex;
+ void *owner;
+ int count;
+} __libc_iolock_recursive_t;
#endif
/* Define a lock variable NAME with storage class CLASS. The lock must be
@@ -76,6 +82,8 @@ typedef struct __libc_lock_recursive_opa
#define __libc_lock_define_recursive(CLASS,NAME) \
CLASS __libc_lock_recursive_t NAME;
+#define __libc_iolock_define_recursive(CLASS,NAME) \
+ CLASS __libc_iolock_recursive_t NAME;
#define _LIBC_LOCK_RECURSIVE_INITIALIZER { MUTEX_INITIALIZER, 0, 0 }
#define __libc_lock_define_initialized_recursive(CLASS,NAME) \
CLASS __libc_lock_recursive_t NAME = _LIBC_LOCK_RECURSIVE_INITIALIZER;
Jakub
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |