summaryrefslogtreecommitdiff
path: root/usr/src/lib/libc/inc/thr_uberdata.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libc/inc/thr_uberdata.h')
-rw-r--r--usr/src/lib/libc/inc/thr_uberdata.h37
1 files changed, 26 insertions, 11 deletions
diff --git a/usr/src/lib/libc/inc/thr_uberdata.h b/usr/src/lib/libc/inc/thr_uberdata.h
index 4b00040fcf..7dbe4d7aab 100644
--- a/usr/src/lib/libc/inc/thr_uberdata.h
+++ b/usr/src/lib/libc/inc/thr_uberdata.h
@@ -378,6 +378,8 @@ extern void queue_unlock(queue_head_t *);
extern void enqueue(queue_head_t *, struct ulwp *, void *, int);
extern struct ulwp *dequeue(queue_head_t *, void *, int *);
extern struct ulwp *queue_waiter(queue_head_t *, void *);
+extern struct ulwp *queue_unlink(queue_head_t *,
+ struct ulwp **, struct ulwp *);
extern uint8_t dequeue_self(queue_head_t *, void *);
extern void unsleep_self(void);
extern void spin_lock_set(mutex_t *);
@@ -662,21 +664,21 @@ typedef struct {
/*
- * siguaction members have 64-byte size and alignment.
- * We know that sizeof (struct sigaction) is 32 bytes for
- * both _ILP32 and _LP64, so we put the padding in the middle.
+ * siguaction members have 128-byte size and 64-byte alignment.
+ * We know that sizeof (struct sigaction) is 32 bytes for both
+ * _ILP32 and _LP64 and that sizeof (rwlock_t) is 64 bytes.
*/
typedef struct {
- mutex_t sig_lock;
- char sig_pad[64 - (sizeof (mutex_t) + sizeof (struct sigaction))];
+ rwlock_t sig_lock;
struct sigaction sig_uaction;
+ char sig_pad[128 - sizeof (rwlock_t) - sizeof (struct sigaction)];
} siguaction_t;
#ifdef _SYSCALL32
typedef struct {
- mutex_t sig_lock;
- char sig_pad[64 - (sizeof (mutex_t) + sizeof (struct sigaction32))];
+ rwlock_t sig_lock;
struct sigaction32 sig_uaction;
+ char sig_pad[128 - sizeof (rwlock_t) - sizeof (struct sigaction32)];
} siguaction32_t;
#endif /* _SYSCALL32 */
@@ -1080,6 +1082,14 @@ extern void _flush_windows(void);
#endif
extern void set_curthread(void *);
+/*
+ * Utility function used by cond_broadcast() and rw_unlock()
+ * when waking up many threads (more than MAXLWPS) all at once.
+ */
+#define MAXLWPS 128 /* max remembered lwpids before overflow */
+#define NEWLWPS 2048 /* max remembered lwpids at first overflow */
+extern lwpid_t *alloc_lwpids(lwpid_t *, int *, int *);
+
/* enter a critical section */
#define enter_critical(self) (self->ul_critical++)
@@ -1152,6 +1162,9 @@ extern void _lwp_start(void);
extern void _lwp_terminate(void);
extern void lmutex_lock(mutex_t *);
extern void lmutex_unlock(mutex_t *);
+extern void lrw_rdlock(rwlock_t *);
+extern void lrw_wrlock(rwlock_t *);
+extern void lrw_unlock(rwlock_t *);
extern void sig_mutex_lock(mutex_t *);
extern void sig_mutex_unlock(mutex_t *);
extern int sig_mutex_trylock(mutex_t *);
@@ -1361,10 +1374,12 @@ extern int _private_lwp_mutex_unlock(mutex_t *);
* inlines
*/
extern int set_lock_byte(volatile uint8_t *);
-extern uint32_t swap32(volatile uint32_t *, uint32_t);
-extern uint32_t cas32(volatile uint32_t *, uint32_t, uint32_t);
-extern void incr32(volatile uint32_t *);
-extern void decr32(volatile uint32_t *);
+extern uint32_t atomic_swap_32(volatile uint32_t *, uint32_t);
+extern uint32_t atomic_cas_32(volatile uint32_t *, uint32_t, uint32_t);
+extern void atomic_inc_32(volatile uint32_t *);
+extern void atomic_dec_32(volatile uint32_t *);
+extern void atomic_and_32(volatile uint32_t *, uint32_t);
+extern void atomic_or_32(volatile uint32_t *, uint32_t);
#if defined(__sparc)
extern ulong_t caller(void);
extern ulong_t getfp(void);