Properly interpose libc spinlocks, was missed in r276630. In
particular, stdio locking was affected. Reported and tested by: "Matthew D. Fuller" <fullermd@over-yonder.net> Sponsored by: The FreeBSD Foundation MFC after: 3 days
This commit is contained in:
parent
738a5a4f41
commit
45468c5356
@ -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);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* This function is a stub for the spinlock function in libpthread.
|
||||
*/
|
||||
__weak_reference(_spinlock, _spinlock_debug);
|
||||
#pragma weak _spinlock
|
||||
void
|
||||
_spinlock_stub(spinlock_t *lck __unused)
|
||||
_spinlock(spinlock_t *lck)
|
||||
{
|
||||
|
||||
((void (*)(spinlock_t *lck))__libc_interposing[INTERPOS_spinlock])
|
||||
(lck);
|
||||
|
||||
}
|
||||
|
||||
#pragma weak _spinlock
|
||||
void
|
||||
_spinunlock(spinlock_t *lck)
|
||||
{
|
||||
|
||||
((void (*)(spinlock_t *lck))__libc_interposing[INTERPOS_spinunlock])
|
||||
(lck);
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
__libc_spinlock_stub(spinlock_t *lck __unused)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* This function is a stub for the spinunlock function in libpthread.
|
||||
*/
|
||||
void
|
||||
_spinunlock_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)
|
||||
{
|
||||
}
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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);
|
||||
|
||||
struct tcb *_tcb_ctor(struct pthread *, int);
|
||||
void _tcb_dtor(struct tcb *);
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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)) =
|
||||
|
Loading…
Reference in New Issue
Block a user