PERFORCE change 65517 for review
David Xu
davidxu at FreeBSD.org
Fri Nov 19 20:51:19 PST 2004
http://perforce.freebsd.org/chv.cgi?CH=65517
Change 65517 by davidxu at davidxu_alona on 2004/11/20 04:51:02
Use thread level lock, no kse sched level lock.
Affected files ...
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_detach.c#2 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_exit.c#2 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_find_thread.c#2 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_getschedparam.c#2 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_join.c#2 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_setschedparam.c#2 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_stack.c#2 edit
Differences ...
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_detach.c#2 (text+ko) ====
@@ -43,8 +43,8 @@
_pthread_detach(pthread_t pthread)
{
struct pthread *curthread = _get_curthread();
- struct kse_mailbox *kmbx = NULL;
struct pthread *joiner;
+ long tid = -1;
int rval = 0;
/* Check for invalid calling parameters: */
@@ -64,36 +64,20 @@
rval = EINVAL;
} else {
/* Lock the detached thread: */
- THR_SCHED_LOCK(curthread, pthread);
+ THR_THREAD_LOCK(curthread, pthread);
/* Flag the thread as detached: */
pthread->attr.flags |= PTHREAD_DETACHED;
/* Retrieve any joining thread and remove it: */
joiner = pthread->joiner;
- if ((joiner != NULL) && (joiner->kseg == pthread->kseg)) {
- /*
- * We already own the scheduler lock for the joiner.
- * Take advantage of that and make the joiner runnable.
- */
- if (joiner->join_status.thread == pthread) {
- /*
- * Set the return value for the woken thread:
- */
- joiner->join_status.error = ESRCH;
- joiner->join_status.ret = NULL;
- joiner->join_status.thread = NULL;
+ THR_THREAD_UNLOCK(curthread, pthread);
- kmbx = _thr_setrunnable_unlocked(joiner);
- }
- joiner = NULL;
- }
- THR_SCHED_UNLOCK(curthread, pthread);
/* See if there is a thread waiting in pthread_join(): */
if ((joiner != NULL) &&
(_thr_ref_add(curthread, joiner, 0) == 0)) {
/* Lock the joiner before fiddling with it. */
- THR_SCHED_LOCK(curthread, joiner);
+ THR_THREAD_LOCK(curthread, joiner);
if (joiner->join_status.thread == pthread) {
/*
* Set the return value for the woken thread:
@@ -102,14 +86,14 @@
joiner->join_status.ret = NULL;
joiner->join_status.thread = NULL;
- kmbx = _thr_setrunnable_unlocked(joiner);
+ tid = _thr_setrunnable_unlocked(joiner);
}
- THR_SCHED_UNLOCK(curthread, joiner);
+ THR_THREAD_UNLOCK(curthread, joiner);
_thr_ref_delete(curthread, joiner);
}
_thr_ref_delete(curthread, pthread);
- if (kmbx != NULL)
- kse_wakeup(kmbx);
+ if (tid != -1)
+ thr_wake(tid);
}
/* Return the completion status: */
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_exit.c#2 (text+ko) ====
@@ -86,8 +86,6 @@
_pthread_exit(void *status)
{
struct pthread *curthread = _get_curthread();
- kse_critical_t crit;
- struct kse *curkse;
/* Check if this thread is already in the process of exiting: */
if ((curthread->flags & THR_FLAGS_EXITING) != 0) {
@@ -102,23 +100,10 @@
* Flag this thread as exiting. Threads should now be prevented
* from joining to this thread.
*/
- THR_SCHED_LOCK(curthread, curthread);
+ THR_LOCK(curthread);
curthread->flags |= THR_FLAGS_EXITING;
- THR_SCHED_UNLOCK(curthread, curthread);
+ THR_UNLOCK(curthread);
- /*
- * To avoid signal-lost problem, if signals had already been
- * delivered to us, handle it. we have already set EXITING flag
- * so no new signals should be delivered to us.
- * XXX this is not enough if signal was delivered just before
- * thread called sigprocmask and masked it! in this case, we
- * might have to re-post the signal by kill() if the signal
- * is targeting process (not for a specified thread).
- * Kernel has same signal-lost problem, a signal may be delivered
- * to a thread which is on the way to call sigprocmask or thr_exit()!
- */
- if (curthread->check_pending)
- _thr_sig_check_pending(curthread);
/* Save the return value: */
curthread->ret = status;
while (curthread->cleanup != NULL) {
@@ -132,24 +117,19 @@
/* Run the thread-specific data destructors: */
_thread_cleanupspecific();
}
- if (!_kse_isthreaded())
+ if (!_thr_isthreaded())
exit(0);
- crit = _kse_critical_enter();
- curkse = _get_curkse();
- KSE_LOCK_ACQUIRE(curkse, &_thread_list_lock);
+ THR_LOCK_ACQUIRE(curthread, &_thread_list_lock);
/* Use thread_list_lock */
_thread_active_threads--;
- if ((_thread_scope_system <= 0 && _thread_active_threads == 1) ||
- (_thread_scope_system > 0 && _thread_active_threads == 0)) {
- KSE_LOCK_RELEASE(curkse, &_thread_list_lock);
- _kse_critical_leave(crit);
+ if (_thread_active_threads == 0) {
+ THR_LOCK_RELEASE(curthread, &_thread_list_lock);
exit(0);
/* Never reach! */
}
- KSE_LOCK_RELEASE(curkse, &_thread_list_lock);
+ THR_LOCK_RELEASE(curthread, &_thread_list_lock);
- /* This thread will never be re-scheduled. */
- KSE_LOCK(curkse);
+ THR_LOCK_SWITCH(curthread);
THR_SET_STATE(curthread, PS_DEAD);
_thr_sched_switch_unlocked(curthread);
/* Never reach! */
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_find_thread.c#2 (text+ko) ====
@@ -45,17 +45,13 @@
_thr_ref_add(struct pthread *curthread, struct pthread *thread,
int include_dead)
{
- kse_critical_t crit;
struct pthread *pthread;
- struct kse *curkse;
if (thread == NULL)
/* Invalid thread: */
return (EINVAL);
- crit = _kse_critical_enter();
- curkse = _get_curkse();
- KSE_LOCK_ACQUIRE(curkse, &_thread_list_lock);
+ THR_LOCK_ACQUIRE(curthread, &_thread_list_lock);
pthread = _thr_hash_find(thread);
if (pthread) {
if ((include_dead == 0) &&
@@ -69,8 +65,7 @@
curthread->critical_count++;
}
}
- KSE_LOCK_RELEASE(curkse, &_thread_list_lock);
- _kse_critical_leave(crit);
+ THR_LOCK_RELEASE(curthread, &_thread_list_lock);
/* Return zero if the thread exists: */
return ((pthread != NULL) ? 0 : ESRCH);
@@ -79,20 +74,14 @@
void
_thr_ref_delete(struct pthread *curthread, struct pthread *thread)
{
- kse_critical_t crit;
- struct kse *curkse;
-
if (thread != NULL) {
- crit = _kse_critical_enter();
- curkse = _get_curkse();
- KSE_LOCK_ACQUIRE(curkse, &_thread_list_lock);
+ THR_LOCK_ACQUIRE(curthread, &_thread_list_lock);
thread->refcount--;
if (curthread != NULL)
curthread->critical_count--;
if ((thread->refcount == 0) &&
(thread->tlflags & TLFLAGS_GC_SAFE) != 0)
THR_GCLIST_ADD(thread);
- KSE_LOCK_RELEASE(curkse, &_thread_list_lock);
- _kse_critical_leave(crit);
+ THR_LOCK_RELEASE(curthread, &_thread_list_lock);
}
}
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_getschedparam.c#2 (text+ko) ====
@@ -52,22 +52,22 @@
* Avoid searching the thread list when it is the current
* thread.
*/
- THR_SCHED_LOCK(curthread, curthread);
+ THR_THREAD_LOCK(curthread, curthread);
param->sched_priority =
THR_BASE_PRIORITY(pthread->base_priority);
tmp = pthread->attr.sched_policy;
- THR_SCHED_UNLOCK(curthread, curthread);
+ THR_THREAD_UNLOCK(curthread, curthread);
*policy = tmp;
ret = 0;
}
/* Find the thread in the list of active threads. */
else if ((ret = _thr_ref_add(curthread, pthread, /*include dead*/0))
== 0) {
- THR_SCHED_LOCK(curthread, pthread);
+ THR_THREAD_LOCK(curthread, pthread);
param->sched_priority =
THR_BASE_PRIORITY(pthread->base_priority);
tmp = pthread->attr.sched_policy;
- THR_SCHED_UNLOCK(curthread, pthread);
+ THR_THREAD_UNLOCK(curthread, pthread);
_thr_ref_delete(curthread, pthread);
*policy = tmp;
}
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_join.c#2 (text+ko) ====
@@ -42,7 +42,6 @@
{
struct pthread *curthread = _get_curthread();
void *tmp;
- kse_critical_t crit;
int ret = 0;
_thr_cancel_enter(curthread);
@@ -71,10 +70,10 @@
return (ESRCH);
}
- THR_SCHED_LOCK(curthread, pthread);
+ THR_THREAD_LOCK(curthread, pthread);
/* Check if this thread has been detached: */
if ((pthread->attr.flags & PTHREAD_DETACHED) != 0) {
- THR_SCHED_UNLOCK(curthread, pthread);
+ THR_THREAD_UNLOCK(curthread, pthread);
/* Remove the reference and return an error: */
_thr_ref_delete(curthread, pthread);
ret = ESRCH;
@@ -88,18 +87,16 @@
pthread->attr.flags |= PTHREAD_DETACHED;
/* Unlock the thread. */
- THR_SCHED_UNLOCK(curthread, pthread);
+ THR_THREAD_UNLOCK(curthread, pthread);
/*
* Remove the thread from the list of active
* threads and add it to the GC list.
*/
- crit = _kse_critical_enter();
- KSE_LOCK_ACQUIRE(curthread->kse, &_thread_list_lock);
+ THR_LOCK_ACQUIRE(curthread, &_thread_list_lock);
THR_LIST_REMOVE(pthread);
THR_GCLIST_ADD(pthread);
- KSE_LOCK_RELEASE(curthread->kse, &_thread_list_lock);
- _kse_critical_leave(crit);
+ THR_LOCK_RELEASE(curthread, &_thread_list_lock);
/* Remove the reference. */
_thr_ref_delete(curthread, pthread);
@@ -108,7 +105,7 @@
}
else if (pthread->joiner != NULL) {
/* Unlock the thread and remove the reference. */
- THR_SCHED_UNLOCK(curthread, pthread);
+ THR_THREAD_UNLOCK(curthread, pthread);
_thr_ref_delete(curthread, pthread);
/* Multiple joiners are not supported. */
@@ -122,25 +119,24 @@
curthread->join_status.thread = pthread;
/* Unlock the thread and remove the reference. */
- THR_SCHED_UNLOCK(curthread, pthread);
+ THR_THREAD_UNLOCK(curthread, pthread);
_thr_ref_delete(curthread, pthread);
- THR_SCHED_LOCK(curthread, curthread);
+ THR_LOCK_SWITCH(curthread);
while (curthread->join_status.thread == pthread) {
THR_SET_STATE(curthread, PS_JOIN);
- THR_SCHED_UNLOCK(curthread, curthread);
/* Schedule the next thread: */
- _thr_sched_switch(curthread);
- THR_SCHED_LOCK(curthread, curthread);
+ _thr_sched_switch_unlocked(curthread);
+ THR_LOCK_SWITCH(curthread);
}
- THR_SCHED_UNLOCK(curthread, curthread);
+ THR_UNLOCK_SWITCH(curthread);
if ((curthread->cancelflags & THR_CANCELLING) &&
!(curthread->cancelflags & PTHREAD_CANCEL_DISABLE)) {
if (_thr_ref_add(curthread, pthread, 1) == 0) {
- THR_SCHED_LOCK(curthread, pthread);
+ THR_THREAD_LOCK(curthread, pthread);
pthread->joiner = NULL;
- THR_SCHED_UNLOCK(curthread, pthread);
+ THR_THREAD_UNLOCK(curthread, pthread);
_thr_ref_delete(curthread, pthread);
}
pthread_exit(PTHREAD_CANCELED);
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_setschedparam.c#2 (text+ko) ====
@@ -63,11 +63,11 @@
* Lock the threads scheduling queue while we change
* its priority:
*/
- THR_SCHED_LOCK(curthread, pthread);
+ THR_THREAD_LOCK(curthread, pthread);
if ((pthread->state == PS_DEAD) ||
(pthread->state == PS_DEADLOCK) ||
((pthread->flags & THR_FLAGS_EXITING) != 0)) {
- THR_SCHED_UNLOCK(curthread, pthread);
+ THR_THREAD_UNLOCK(curthread, pthread);
_thr_ref_delete(curthread, pthread);
return (ESRCH);
}
@@ -82,7 +82,7 @@
* There is nothing to do; unlock the threads
* scheduling queue.
*/
- THR_SCHED_UNLOCK(curthread, pthread);
+ THR_THREAD_UNLOCK(curthread, pthread);
else {
/*
* Remove the thread from its current priority
@@ -90,9 +90,9 @@
* active priority:
*/
old_prio = pthread->active_priority;
- if ((pthread->flags & THR_FLAGS_IN_RUNQ) != 0) {
+ /* if ((pthread->flags & THR_FLAGS_IN_RUNQ) != 0) */ {
in_readyq = 1;
- THR_RUNQ_REMOVE(pthread);
+ /* THR_RUNQ_REMOVE(pthread); */
}
/* Set the thread base priority: */
@@ -114,14 +114,14 @@
* its priority if it owns any priority
* protection or inheritence mutexes.
*/
- THR_RUNQ_INSERT_HEAD(pthread);
+ /* THR_RUNQ_INSERT_HEAD(pthread); */
}
else
- THR_RUNQ_INSERT_TAIL(pthread);
+ /* THR_RUNQ_INSERT_TAIL(pthread)*/ ;
}
/* Unlock the threads scheduling queue: */
- THR_SCHED_UNLOCK(curthread, pthread);
+ THR_THREAD_UNLOCK(curthread, pthread);
/*
* Check for any mutex priority adjustments. This
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_stack.c#2 (text+ko) ====
@@ -129,9 +129,8 @@
int
_thr_stack_alloc(struct pthread_attr *attr)
{
+ struct pthread *curthread = _get_curthread();
struct stack *spare_stack;
- struct kse *curkse;
- kse_critical_t crit;
size_t stacksize;
size_t guardsize;
char *stackaddr;
@@ -153,9 +152,7 @@
* Use the garbage collector lock for synchronization of the
* spare stack lists and allocations from usrstack.
*/
- crit = _kse_critical_enter();
- curkse = _get_curkse();
- KSE_LOCK_ACQUIRE(curkse, &_thread_list_lock);
+ THR_LOCK_ACQUIRE(curthread, &_thread_list_lock);
/*
* If the stack and guard sizes are default, try to allocate a stack
* from the default-size stack cache:
@@ -185,8 +182,7 @@
}
if (attr->stackaddr_attr != NULL) {
/* A cached stack was found. Release the lock. */
- KSE_LOCK_RELEASE(curkse, &_thread_list_lock);
- _kse_critical_leave(crit);
+ THR_LOCK_RELEASE(curthread, &_thread_list_lock);
}
else {
/* Allocate a stack from usrstack. */
@@ -207,8 +203,7 @@
last_stack -= (stacksize + guardsize);
/* Release the lock before mmap'ing it. */
- KSE_LOCK_RELEASE(curkse, &_thread_list_lock);
- _kse_critical_leave(crit);
+ THR_LOCK_RELEASE(curthread, &_thread_list_lock);
/* Map the stack and guard page together, and split guard
page from allocated space: */
More information about the p4-projects
mailing list