1
0
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:
Mike Makonnen 2003-05-23 23:39:31 +00:00
parent 42b919d4a6
commit 59a47b31d0
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=115271
3 changed files with 20 additions and 4 deletions

View File

@ -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 *

View File

@ -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);

View File

@ -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();
}