summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2015-02-17 01:03:06 +0000
committerkib <kib@FreeBSD.org>2015-02-17 01:03:06 +0000
commit0cb0cb1b24a8ada17d71f3f1cad36e89d0c0ccfc (patch)
tree6c211c0db8606bd913bc7ca6b008edcddc8f1cd3 /lib
parentc30b890b0bb2a5cdb5c6bf8b1b31ac21d986f650 (diff)
downloadFreeBSD-src-0cb0cb1b24a8ada17d71f3f1cad36e89d0c0ccfc.zip
FreeBSD-src-0cb0cb1b24a8ada17d71f3f1cad36e89d0c0ccfc.tar.gz
MFC r278751:
Properly interpose libc spinlocks, was missed in r276630.
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/gen/_spinlock_stub.c41
-rw-r--r--lib/libc/include/libc_private.h5
-rw-r--r--lib/libc/sys/interposing_table.c2
-rw-r--r--lib/libthr/thread/thr_private.h4
-rw-r--r--lib/libthr/thread/thr_spinlock.c10
-rw-r--r--lib/libthr/thread/thr_syscalls.c2
6 files changed, 34 insertions, 30 deletions
diff --git a/lib/libc/gen/_spinlock_stub.c b/lib/libc/gen/_spinlock_stub.c
index 47bbfeb..fddfc1b 100644
--- a/lib/libc/gen/_spinlock_stub.c
+++ b/lib/libc/gen/_spinlock_stub.c
@@ -33,51 +33,48 @@ __FBSDID("$FreeBSD$");
#include <stdio.h>
#include "spinlock.h"
+#include "libc_private.h"
long _atomic_lock_stub(volatile long *);
void _spinlock_stub(spinlock_t *);
void _spinunlock_stub(spinlock_t *);
void _spinlock_debug_stub(spinlock_t *, char *, int);
-/*
- * Declare weak definitions in case the application is not linked
- * with libpthread.
- */
__weak_reference(_atomic_lock_stub, _atomic_lock);
-__weak_reference(_spinlock_stub, _spinlock);
-__weak_reference(_spinunlock_stub, _spinunlock);
-__weak_reference(_spinlock_debug_stub, _spinlock_debug);
-/*
- * This function is a stub for the _atomic_lock function in libpthread.
- */
long
_atomic_lock_stub(volatile long *lck __unused)
{
return (0L);
}
+__weak_reference(_spinlock, _spinlock_debug);
+#pragma weak _spinlock
+void
+_spinlock(spinlock_t *lck)
+{
-/*
- * This function is a stub for the spinlock function in libpthread.
- */
+ ((void (*)(spinlock_t *lck))__libc_interposing[INTERPOS_spinlock])
+ (lck);
+
+}
+
+#pragma weak _spinlock
void
-_spinlock_stub(spinlock_t *lck __unused)
+_spinunlock(spinlock_t *lck)
{
+
+ ((void (*)(spinlock_t *lck))__libc_interposing[INTERPOS_spinunlock])
+ (lck);
+
}
-/*
- * This function is a stub for the spinunlock function in libpthread.
- */
void
-_spinunlock_stub(spinlock_t *lck __unused)
+__libc_spinlock_stub(spinlock_t *lck __unused)
{
}
-/*
- * This function is a stub for the debug spinlock function in libpthread.
- */
void
-_spinlock_debug_stub(spinlock_t *lck __unused, char *fname __unused, int lineno __unused)
+__libc_spinunlock_stub(spinlock_t *lck __unused)
{
}
diff --git a/lib/libc/include/libc_private.h b/lib/libc/include/libc_private.h
index 347b463..7468f9d 100644
--- a/lib/libc/include/libc_private.h
+++ b/lib/libc/include/libc_private.h
@@ -95,6 +95,9 @@ do { \
_SPINUNLOCK(&__stdio_thread_lock); \
} while (0)
+void __libc_spinlock_stub(struct _spinlock *);
+void __libc_spinunlock_stub(struct _spinlock *);
+
/*
* Indexes into the pthread jump table.
*
@@ -216,6 +219,8 @@ enum {
INTERPOS_write,
INTERPOS_writev,
INTERPOS__pthread_mutex_init_calloc_cb,
+ INTERPOS_spinlock,
+ INTERPOS_spinunlock,
INTERPOS_MAX
};
diff --git a/lib/libc/sys/interposing_table.c b/lib/libc/sys/interposing_table.c
index d303779..0fd6c75 100644
--- a/lib/libc/sys/interposing_table.c
+++ b/lib/libc/sys/interposing_table.c
@@ -73,6 +73,8 @@ interpos_func_t __libc_interposing[INTERPOS_MAX] = {
SLOT(write, __sys_write),
SLOT(writev, __sys_writev),
SLOT(_pthread_mutex_init_calloc_cb, _pthread_mutex_init_calloc_cb_stub),
+ SLOT(spinlock, __libc_spinlock_stub),
+ SLOT(spinunlock, __libc_spinunlock_stub),
};
#undef SLOT
diff --git a/lib/libthr/thread/thr_private.h b/lib/libthr/thread/thr_private.h
index d62de98..3597485 100644
--- a/lib/libthr/thread/thr_private.h
+++ b/lib/libthr/thread/thr_private.h
@@ -928,6 +928,10 @@ int __thr_sigwait(const sigset_t *set, int *sig);
int __thr_sigwaitinfo(const sigset_t *set, siginfo_t *info);
int __thr_swapcontext(ucontext_t *oucp, const ucontext_t *ucp);
+struct _spinlock;
+void __thr_spinunlock(struct _spinlock *lck);
+void __thr_spinlock(struct _spinlock *lck);
+
__END_DECLS
#endif /* !_THR_PRIVATE_H */
diff --git a/lib/libthr/thread/thr_spinlock.c b/lib/libthr/thread/thr_spinlock.c
index ecc8067..380d10d 100644
--- a/lib/libthr/thread/thr_spinlock.c
+++ b/lib/libthr/thread/thr_spinlock.c
@@ -61,7 +61,7 @@ static void init_spinlock(spinlock_t *lck);
*/
void
-_spinunlock(spinlock_t *lck)
+__thr_spinunlock(spinlock_t *lck)
{
struct spinlock_extra *_extra;
@@ -70,7 +70,7 @@ _spinunlock(spinlock_t *lck)
}
void
-_spinlock(spinlock_t *lck)
+__thr_spinlock(spinlock_t *lck)
{
struct spinlock_extra *_extra;
@@ -84,12 +84,6 @@ _spinlock(spinlock_t *lck)
THR_UMUTEX_LOCK(_get_curthread(), &_extra->lock);
}
-void
-_spinlock_debug(spinlock_t *lck, char *fname __unused, int lineno __unused)
-{
- _spinlock(lck);
-}
-
static void
init_spinlock(spinlock_t *lck)
{
diff --git a/lib/libthr/thread/thr_syscalls.c b/lib/libthr/thread/thr_syscalls.c
index 06b63c8..10fbad4 100644
--- a/lib/libthr/thread/thr_syscalls.c
+++ b/lib/libthr/thread/thr_syscalls.c
@@ -597,6 +597,8 @@ __thr_interpose_libc(void)
SLOT(wait4);
SLOT(write);
SLOT(writev);
+ SLOT(spinlock);
+ SLOT(spinunlock);
#undef SLOT
*(__libc_interposing_slot(
INTERPOS__pthread_mutex_init_calloc_cb)) =
OpenPOWER on IntegriCloud