diff options
| author | Daniel Eischen <deischen@FreeBSD.org> | 2003-09-03 17:56:26 +0000 |
|---|---|---|
| committer | Daniel Eischen <deischen@FreeBSD.org> | 2003-09-03 17:56:26 +0000 |
| commit | 850108c0b4ef4545310af9b03c4a8531b8b36d55 (patch) | |
| tree | 4224af62a2f45f6a320c58acdd7f40a2692ca686 /lib | |
| parent | b66752c4a194ce35085c061ddd41713eeb06a28e (diff) | |
Notes
Diffstat (limited to 'lib')
25 files changed, 109 insertions, 42 deletions
diff --git a/lib/libkse/arch/amd64/include/atomic_ops.h b/lib/libkse/arch/amd64/include/atomic_ops.h index 5edb533c7e8db..980eb8e664caa 100644 --- a/lib/libkse/arch/amd64/include/atomic_ops.h +++ b/lib/libkse/arch/amd64/include/atomic_ops.h @@ -33,17 +33,25 @@ * Atomic swap: * Atomic (tmp = *dst, *dst = val), then *res = tmp * - * void atomic_swap_long(long *dst, long val, long *res); + * void atomic_swap64(intptr_t *dst, intptr_t val, intptr_t *res); */ static inline void -atomic_swap_long(long *dst, long val, long *res) +atomic_swap64(intptr_t *dst, intptr_t val, intptr_t *res) { __asm __volatile( "xchgq %2, %1; movq %2, %0" : "=m" (*res) : "m" (*dst), "r" (val) : "memory"); } +static inline void +atomic_swap_int(int *dst, int val, int *res) +{ + __asm __volatile( + "xchgl %2, %1; movl %2, %0" + : "=m" (*res) : "m" (*dst), "r" (val) : "memory"); +} + #define atomic_swap_ptr(d, v, r) \ - atomic_swap_long((long *)(d), (long)(v), (long *)(r)) + atomic_swap64((intptr_t *)(d), (intptr_t)(v), (intptr_t *)(r)) #endif diff --git a/lib/libkse/arch/i386/include/atomic_ops.h b/lib/libkse/arch/i386/include/atomic_ops.h index 1825b8cfb6585..7bc3d1b71a054 100644 --- a/lib/libkse/arch/i386/include/atomic_ops.h +++ b/lib/libkse/arch/i386/include/atomic_ops.h @@ -33,19 +33,19 @@ * Atomic swap: * Atomic (tmp = *dst, *dst = val), then *res = tmp * - * void atomic_swap_long(long *dst, long val, long *res); + * void atomic_swap32(intptr_t *dst, intptr_t val, intptr_t *res); */ static inline void -atomic_swap_long(long *dst, long val, long *res) +atomic_swap32(intptr_t *dst, intptr_t val, intptr_t *res) { __asm __volatile( "xchgl %2, %1; movl %2, %0" : "=m" (*res) : "m" (*dst), "r" (val) : "memory"); } -#define atomic_swap_int(d, v, r) \ - atomic_swap_long((long *)(d), (long)(v), (long *)(r)) - -#define atomic_swap_ptr atomic_swap_int +#define atomic_swap_ptr(d, v, r) \ + atomic_swap32((intptr_t *)d, (intptr_t)v, (intptr_t *)r) +#define atomic_swap_int(d, v, r) \ + atomic_swap32((intptr_t *)d, (intptr_t)v, (intptr_t *)r) #endif diff --git a/lib/libkse/sys/lock.c b/lib/libkse/sys/lock.c index c67da334362e5..9cae0361e4e55 100644 --- a/lib/libkse/sys/lock.c +++ b/lib/libkse/sys/lock.c @@ -107,7 +107,7 @@ void _lock_acquire(struct lock *lck, struct lockuser *lu, int prio) { int i; - long lval; + int lval; /** * XXX - We probably want to remove these checks to optimize @@ -167,7 +167,7 @@ _lock_acquire(struct lock *lck, struct lockuser *lu, int prio) if (lu->lu_watchreq->lr_active == 0) break; } - atomic_swap_long((long *)&lu->lu_watchreq->lr_locked, + atomic_swap_int((int *)&lu->lu_watchreq->lr_locked, 2, &lval); if (lval == 0) lu->lu_watchreq->lr_locked = 0; @@ -188,7 +188,7 @@ _lock_release(struct lock *lck, struct lockuser *lu) struct lockuser *lu_tmp, *lu_h; struct lockreq *myreq; int prio_h; - long lval; + int lval; /** * XXX - We probably want to remove these checks to optimize @@ -240,8 +240,8 @@ _lock_release(struct lock *lck, struct lockuser *lu) if (lu_h != NULL) { /* Give the lock to the highest priority user. */ if (lck->l_wakeup != NULL) { - atomic_swap_long( - (long *)&lu_h->lu_watchreq->lr_locked, + atomic_swap_int( + (int *)&lu_h->lu_watchreq->lr_locked, 0, &lval); if (lval == 2) /* Notify the sleeper */ @@ -249,11 +249,11 @@ _lock_release(struct lock *lck, struct lockuser *lu) lu_h->lu_myreq->lr_watcher); } else - atomic_store_rel_long( + atomic_store_rel_int( &lu_h->lu_watchreq->lr_locked, 0); } else { if (lck->l_wakeup != NULL) { - atomic_swap_long((long *)&myreq->lr_locked, + atomic_swap_int((int *)&myreq->lr_locked, 0, &lval); if (lval == 2) /* Notify the sleeper */ @@ -261,7 +261,7 @@ _lock_release(struct lock *lck, struct lockuser *lu) } else /* Give the lock to the previous request. */ - atomic_store_rel_long(&myreq->lr_locked, 0); + atomic_store_rel_int(&myreq->lr_locked, 0); } } else { /* @@ -274,14 +274,14 @@ _lock_release(struct lock *lck, struct lockuser *lu) lu->lu_watchreq = NULL; lu->lu_myreq->lr_locked = 1; if (lck->l_wakeup) { - atomic_swap_long((long *)&myreq->lr_locked, 0, &lval); + atomic_swap_int((int *)&myreq->lr_locked, 0, &lval); if (lval == 2) /* Notify the sleeper */ lck->l_wakeup(lck, myreq->lr_watcher); } else /* Give the lock to the previous request. */ - atomic_store_rel_long(&myreq->lr_locked, 0); + atomic_store_rel_int(&myreq->lr_locked, 0); } lu->lu_myreq->lr_active = 0; } @@ -289,7 +289,7 @@ _lock_release(struct lock *lck, struct lockuser *lu) void _lock_grant(struct lock *lck /* unused */, struct lockuser *lu) { - atomic_store_rel_long(&lu->lu_watchreq->lr_locked, 3); + atomic_store_rel_int(&lu->lu_watchreq->lr_locked, 3); } void diff --git a/lib/libkse/sys/lock.h b/lib/libkse/sys/lock.h index 9d4b994fd40b7..917ca6379c4da 100644 --- a/lib/libkse/sys/lock.h +++ b/lib/libkse/sys/lock.h @@ -51,9 +51,9 @@ struct lock { /* Try to make this >= CACHELINESIZE */ struct lockreq { - volatile long lr_locked; /* lock granted = 0, busy otherwise */ struct lockuser *lr_watcher; /* only used for priority locks */ struct lockuser *lr_owner; /* only used for priority locks */ + volatile int lr_locked; /* lock granted = 0, busy otherwise */ volatile int lr_active; /* non-zero if the lock is last lock for thread */ }; diff --git a/lib/libkse/thread/thr_creat.c b/lib/libkse/thread/thr_creat.c index bba8ec3615018..478e037fc736d 100644 --- a/lib/libkse/thread/thr_creat.c +++ b/lib/libkse/thread/thr_creat.c @@ -33,6 +33,8 @@ #include <pthread.h> #include "thr_private.h" +extern int __creat(const char *, mode_t); + __weak_reference(___creat, creat); int diff --git a/lib/libkse/thread/thr_pause.c b/lib/libkse/thread/thr_pause.c index b6bcc51591ff3..aa97c77823fef 100644 --- a/lib/libkse/thread/thr_pause.c +++ b/lib/libkse/thread/thr_pause.c @@ -33,6 +33,8 @@ #include <pthread.h> #include "thr_private.h" +extern int __pause(void); + __weak_reference(_pause, pause); int diff --git a/lib/libkse/thread/thr_sleep.c b/lib/libkse/thread/thr_sleep.c index 0f02db772fb65..b494e5bcdea53 100644 --- a/lib/libkse/thread/thr_sleep.c +++ b/lib/libkse/thread/thr_sleep.c @@ -33,6 +33,8 @@ #include <pthread.h> #include "thr_private.h" +extern unsigned int __sleep(unsigned int); + __weak_reference(_sleep, sleep); unsigned int diff --git a/lib/libkse/thread/thr_system.c b/lib/libkse/thread/thr_system.c index 28976d397d7b7..ae26c9cad0d83 100644 --- a/lib/libkse/thread/thr_system.c +++ b/lib/libkse/thread/thr_system.c @@ -33,6 +33,8 @@ #include <pthread.h> #include "thr_private.h" +extern int __system(const char *); + __weak_reference(_system, system); int diff --git a/lib/libkse/thread/thr_tcdrain.c b/lib/libkse/thread/thr_tcdrain.c index 6a2002b79a3e6..86af9c2dcaa86 100644 --- a/lib/libkse/thread/thr_tcdrain.c +++ b/lib/libkse/thread/thr_tcdrain.c @@ -33,6 +33,8 @@ #include <pthread.h> #include "thr_private.h" +extern int __tcdrain(int); + __weak_reference(_tcdrain, tcdrain); int diff --git a/lib/libkse/thread/thr_wait.c b/lib/libkse/thread/thr_wait.c index 98f2c8d558f37..b0a3af4b55b08 100644 --- a/lib/libkse/thread/thr_wait.c +++ b/lib/libkse/thread/thr_wait.c @@ -32,6 +32,8 @@ #include <pthread.h> #include "thr_private.h" +extern int __wait(int *); + __weak_reference(_wait, wait); pid_t diff --git a/lib/libkse/thread/thr_wait4.c b/lib/libkse/thread/thr_wait4.c index 9f235848ed7c1..07ff79df1825c 100644 --- a/lib/libkse/thread/thr_wait4.c +++ b/lib/libkse/thread/thr_wait4.c @@ -33,9 +33,12 @@ */ #include <sys/types.h> +#include "namespace.h" #include <errno.h> #include <sys/wait.h> #include <pthread.h> +#include "un-namespace.h" + #include "thr_private.h" __weak_reference(__wait4, wait4); diff --git a/lib/libkse/thread/thr_waitpid.c b/lib/libkse/thread/thr_waitpid.c index 8ee3ce1606823..e09bbd58db42c 100644 --- a/lib/libkse/thread/thr_waitpid.c +++ b/lib/libkse/thread/thr_waitpid.c @@ -34,6 +34,8 @@ #include <pthread.h> #include "thr_private.h" +extern int __waitpid(pid_t, int *, int); + __weak_reference(_waitpid, waitpid); pid_t diff --git a/lib/libpthread/arch/alpha/include/atomic_ops.h b/lib/libpthread/arch/alpha/include/atomic_ops.h index 90ffd8de9bdd7..caa291bc3d904 100644 --- a/lib/libpthread/arch/alpha/include/atomic_ops.h +++ b/lib/libpthread/arch/alpha/include/atomic_ops.h @@ -45,6 +45,23 @@ atomic_swap_long(long *dst, long val, long *res) " stq_c $2, %1\n" /* attempt the store; $2 clobbered */ " beq $2, 1b\n" /* it didn't work, loop */ " stq $1, %0\n" /* save value of *dst in *res */ + " mb \n" + : "+m"(*res) + : "m"(*dst), "r"(val) + : "memory", "$1", "$2"); /* clobber t0 and t1 */ +} + +static inline void +atomic_swap_int(int *dst, int val, int *res) +{ + /* $1 and $2 are t0 and t1 respectively. */ + __asm ( " ldl $1, %1\n" /* get cache line before lock */ + "1: ldl_l $1, %1\n" /* load *dst asserting lock */ + " mov %2, $2\n" /* save value to be swapped */ + " stl_c $2, %1\n" /* attempt the store; $2 clobbered */ + " beq $2, 1b\n" /* it didn't work, loop */ + " stl $1, %0\n" /* save value of *dst in *res */ + " mb \n" : "+m"(*res) : "m"(*dst), "r"(val) : "memory", "$1", "$2"); /* clobber t0 and t1 */ diff --git a/lib/libpthread/arch/amd64/include/atomic_ops.h b/lib/libpthread/arch/amd64/include/atomic_ops.h index 5edb533c7e8db..980eb8e664caa 100644 --- a/lib/libpthread/arch/amd64/include/atomic_ops.h +++ b/lib/libpthread/arch/amd64/include/atomic_ops.h @@ -33,17 +33,25 @@ * Atomic swap: * Atomic (tmp = *dst, *dst = val), then *res = tmp * - * void atomic_swap_long(long *dst, long val, long *res); + * void atomic_swap64(intptr_t *dst, intptr_t val, intptr_t *res); */ static inline void -atomic_swap_long(long *dst, long val, long *res) +atomic_swap64(intptr_t *dst, intptr_t val, intptr_t *res) { __asm __volatile( "xchgq %2, %1; movq %2, %0" : "=m" (*res) : "m" (*dst), "r" (val) : "memory"); } +static inline void +atomic_swap_int(int *dst, int val, int *res) +{ + __asm __volatile( + "xchgl %2, %1; movl %2, %0" + : "=m" (*res) : "m" (*dst), "r" (val) : "memory"); +} + #define atomic_swap_ptr(d, v, r) \ - atomic_swap_long((long *)(d), (long)(v), (long *)(r)) + atomic_swap64((intptr_t *)(d), (intptr_t)(v), (intptr_t *)(r)) #endif diff --git a/lib/libpthread/arch/i386/include/atomic_ops.h b/lib/libpthread/arch/i386/include/atomic_ops.h index 1825b8cfb6585..7bc3d1b71a054 100644 --- a/lib/libpthread/arch/i386/include/atomic_ops.h +++ b/lib/libpthread/arch/i386/include/atomic_ops.h @@ -33,19 +33,19 @@ * Atomic swap: * Atomic (tmp = *dst, *dst = val), then *res = tmp * - * void atomic_swap_long(long *dst, long val, long *res); + * void atomic_swap32(intptr_t *dst, intptr_t val, intptr_t *res); */ static inline void -atomic_swap_long(long *dst, long val, long *res) +atomic_swap32(intptr_t *dst, intptr_t val, intptr_t *res) { __asm __volatile( "xchgl %2, %1; movl %2, %0" : "=m" (*res) : "m" (*dst), "r" (val) : "memory"); } -#define atomic_swap_int(d, v, r) \ - atomic_swap_long((long *)(d), (long)(v), (long *)(r)) - -#define atomic_swap_ptr atomic_swap_int +#define atomic_swap_ptr(d, v, r) \ + atomic_swap32((intptr_t *)d, (intptr_t)v, (intptr_t *)r) +#define atomic_swap_int(d, v, r) \ + atomic_swap32((intptr_t *)d, (intptr_t)v, (intptr_t *)r) #endif diff --git a/lib/libpthread/sys/lock.c b/lib/libpthread/sys/lock.c index c67da334362e5..9cae0361e4e55 100644 --- a/lib/libpthread/sys/lock.c +++ b/lib/libpthread/sys/lock.c @@ -107,7 +107,7 @@ void _lock_acquire(struct lock *lck, struct lockuser *lu, int prio) { int i; - long lval; + int lval; /** * XXX - We probably want to remove these checks to optimize @@ -167,7 +167,7 @@ _lock_acquire(struct lock *lck, struct lockuser *lu, int prio) if (lu->lu_watchreq->lr_active == 0) break; } - atomic_swap_long((long *)&lu->lu_watchreq->lr_locked, + atomic_swap_int((int *)&lu->lu_watchreq->lr_locked, 2, &lval); if (lval == 0) lu->lu_watchreq->lr_locked = 0; @@ -188,7 +188,7 @@ _lock_release(struct lock *lck, struct lockuser *lu) struct lockuser *lu_tmp, *lu_h; struct lockreq *myreq; int prio_h; - long lval; + int lval; /** * XXX - We probably want to remove these checks to optimize @@ -240,8 +240,8 @@ _lock_release(struct lock *lck, struct lockuser *lu) if (lu_h != NULL) { /* Give the lock to the highest priority user. */ if (lck->l_wakeup != NULL) { - atomic_swap_long( - (long *)&lu_h->lu_watchreq->lr_locked, + atomic_swap_int( + (int *)&lu_h->lu_watchreq->lr_locked, 0, &lval); if (lval == 2) /* Notify the sleeper */ @@ -249,11 +249,11 @@ _lock_release(struct lock *lck, struct lockuser *lu) lu_h->lu_myreq->lr_watcher); } else - atomic_store_rel_long( + atomic_store_rel_int( &lu_h->lu_watchreq->lr_locked, 0); } else { if (lck->l_wakeup != NULL) { - atomic_swap_long((long *)&myreq->lr_locked, + atomic_swap_int((int *)&myreq->lr_locked, 0, &lval); if (lval == 2) /* Notify the sleeper */ @@ -261,7 +261,7 @@ _lock_release(struct lock *lck, struct lockuser *lu) } else /* Give the lock to the previous request. */ - atomic_store_rel_long(&myreq->lr_locked, 0); + atomic_store_rel_int(&myreq->lr_locked, 0); } } else { /* @@ -274,14 +274,14 @@ _lock_release(struct lock *lck, struct lockuser *lu) lu->lu_watchreq = NULL; lu->lu_myreq->lr_locked = 1; if (lck->l_wakeup) { - atomic_swap_long((long *)&myreq->lr_locked, 0, &lval); + atomic_swap_int((int *)&myreq->lr_locked, 0, &lval); if (lval == 2) /* Notify the sleeper */ lck->l_wakeup(lck, myreq->lr_watcher); } else /* Give the lock to the previous request. */ - atomic_store_rel_long(&myreq->lr_locked, 0); + atomic_store_rel_int(&myreq->lr_locked, 0); } lu->lu_myreq->lr_active = 0; } @@ -289,7 +289,7 @@ _lock_release(struct lock *lck, struct lockuser *lu) void _lock_grant(struct lock *lck /* unused */, struct lockuser *lu) { - atomic_store_rel_long(&lu->lu_watchreq->lr_locked, 3); + atomic_store_rel_int(&lu->lu_watchreq->lr_locked, 3); } void diff --git a/lib/libpthread/sys/lock.h b/lib/libpthread/sys/lock.h index 9d4b994fd40b7..917ca6379c4da 100644 --- a/lib/libpthread/sys/lock.h +++ b/lib/libpthread/sys/lock.h @@ -51,9 +51,9 @@ struct lock { /* Try to make this >= CACHELINESIZE */ struct lockreq { - volatile long lr_locked; /* lock granted = 0, busy otherwise */ struct lockuser *lr_watcher; /* only used for priority locks */ struct lockuser *lr_owner; /* only used for priority locks */ + volatile int lr_locked; /* lock granted = 0, busy otherwise */ volatile int lr_active; /* non-zero if the lock is last lock for thread */ }; diff --git a/lib/libpthread/thread/thr_creat.c b/lib/libpthread/thread/thr_creat.c index bba8ec3615018..478e037fc736d 100644 --- a/lib/libpthread/thread/thr_creat.c +++ b/lib/libpthread/thread/thr_creat.c @@ -33,6 +33,8 @@ #include <pthread.h> #include "thr_private.h" +extern int __creat(const char *, mode_t); + __weak_reference(___creat, creat); int diff --git a/lib/libpthread/thread/thr_pause.c b/lib/libpthread/thread/thr_pause.c index b6bcc51591ff3..aa97c77823fef 100644 --- a/lib/libpthread/thread/thr_pause.c +++ b/lib/libpthread/thread/thr_pause.c @@ -33,6 +33,8 @@ #include <pthread.h> #include "thr_private.h" +extern int __pause(void); + __weak_reference(_pause, pause); int diff --git a/lib/libpthread/thread/thr_sleep.c b/lib/libpthread/thread/thr_sleep.c index 0f02db772fb65..b494e5bcdea53 100644 --- a/lib/libpthread/thread/thr_sleep.c +++ b/lib/libpthread/thread/thr_sleep.c @@ -33,6 +33,8 @@ #include <pthread.h> #include "thr_private.h" +extern unsigned int __sleep(unsigned int); + __weak_reference(_sleep, sleep); unsigned int diff --git a/lib/libpthread/thread/thr_system.c b/lib/libpthread/thread/thr_system.c index 28976d397d7b7..ae26c9cad0d83 100644 --- a/lib/libpthread/thread/thr_system.c +++ b/lib/libpthread/thread/thr_system.c @@ -33,6 +33,8 @@ #include <pthread.h> #include "thr_private.h" +extern int __system(const char *); + __weak_reference(_system, system); int diff --git a/lib/libpthread/thread/thr_tcdrain.c b/lib/libpthread/thread/thr_tcdrain.c index 6a2002b79a3e6..86af9c2dcaa86 100644 --- a/lib/libpthread/thread/thr_tcdrain.c +++ b/lib/libpthread/thread/thr_tcdrain.c @@ -33,6 +33,8 @@ #include <pthread.h> #include "thr_private.h" +extern int __tcdrain(int); + __weak_reference(_tcdrain, tcdrain); int diff --git a/lib/libpthread/thread/thr_wait.c b/lib/libpthread/thread/thr_wait.c index 98f2c8d558f37..b0a3af4b55b08 100644 --- a/lib/libpthread/thread/thr_wait.c +++ b/lib/libpthread/thread/thr_wait.c @@ -32,6 +32,8 @@ #include <pthread.h> #include "thr_private.h" +extern int __wait(int *); + __weak_reference(_wait, wait); pid_t diff --git a/lib/libpthread/thread/thr_wait4.c b/lib/libpthread/thread/thr_wait4.c index 9f235848ed7c1..07ff79df1825c 100644 --- a/lib/libpthread/thread/thr_wait4.c +++ b/lib/libpthread/thread/thr_wait4.c @@ -33,9 +33,12 @@ */ #include <sys/types.h> +#include "namespace.h" #include <errno.h> #include <sys/wait.h> #include <pthread.h> +#include "un-namespace.h" + #include "thr_private.h" __weak_reference(__wait4, wait4); diff --git a/lib/libpthread/thread/thr_waitpid.c b/lib/libpthread/thread/thr_waitpid.c index 8ee3ce1606823..e09bbd58db42c 100644 --- a/lib/libpthread/thread/thr_waitpid.c +++ b/lib/libpthread/thread/thr_waitpid.c @@ -34,6 +34,8 @@ #include <pthread.h> #include "thr_private.h" +extern int __waitpid(pid_t, int *, int); + __weak_reference(_waitpid, waitpid); pid_t |
