mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-12 14:29:28 +00:00
Add two functions: _spinlock_pthread() and _spinunlock_pthread()
that take the address of a struct pthread as their first argument. _spin[un]lock() just become wrappers arround these two functions. These new functions are for use in situations where curthread can't be used. One example is _thread_retire(), where we invalidate the array index curthread uses to get its pointer.. Approved by: re/blanket libthr
This commit is contained in:
parent
42b919d4a6
commit
59a47b31d0
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=115271
@ -75,13 +75,15 @@ ldt_init(void)
|
||||
void
|
||||
_retire_thread(void *entry)
|
||||
{
|
||||
_SPINLOCK(&ldt_lock);
|
||||
pthread_t thr = curthread;
|
||||
|
||||
_spinlock_pthread(thr, &ldt_lock);
|
||||
if (ldt_free == NULL)
|
||||
*(void **)entry = NULL;
|
||||
else
|
||||
*(void **)entry = *ldt_free;
|
||||
ldt_free = entry;
|
||||
_SPINUNLOCK(&ldt_lock);
|
||||
_spinunlock_pthread(thr, &ldt_lock);
|
||||
}
|
||||
|
||||
void *
|
||||
|
@ -713,6 +713,8 @@ int _pthread_mutexattr_settype(pthread_mutexattr_t *, int);
|
||||
int _pthread_once(pthread_once_t *, void (*) (void));
|
||||
pthread_t _pthread_self(void);
|
||||
int _pthread_setspecific(pthread_key_t, const void *);
|
||||
inline void _spinlock_pthread(pthread_t, spinlock_t *);
|
||||
inline void _spinunlock_pthread(pthread_t, spinlock_t *);
|
||||
void _thread_exit(char *, int, char *);
|
||||
void _thread_exit_cleanup(void);
|
||||
void *_thread_cleanup(pthread_t);
|
||||
|
@ -47,7 +47,13 @@
|
||||
void
|
||||
_spinunlock(spinlock_t *lck)
|
||||
{
|
||||
if (umtx_unlock((struct umtx *)lck, curthread->thr_id))
|
||||
_spinunlock_pthread(curthread, lck);
|
||||
}
|
||||
|
||||
inline void
|
||||
_spinunlock_pthread(pthread_t pthread, spinlock_t *lck)
|
||||
{
|
||||
if (umtx_unlock((struct umtx *)lck, pthread->thr_id))
|
||||
abort();
|
||||
}
|
||||
|
||||
@ -60,7 +66,13 @@ _spinunlock(spinlock_t *lck)
|
||||
void
|
||||
_spinlock(spinlock_t *lck)
|
||||
{
|
||||
if (umtx_lock((struct umtx *)lck, curthread->thr_id))
|
||||
_spinlock_pthread(curthread, lck);
|
||||
}
|
||||
|
||||
inline void
|
||||
_spinlock_pthread(pthread_t pthread, spinlock_t *lck)
|
||||
{
|
||||
if (umtx_lock((struct umtx *)lck, pthread->thr_id))
|
||||
abort();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user