The main reason I commit this: the last change also made set_sem_owner() to check
for a valid team id. Added a comment about a race condition in set_sem_owner(). Some minor style changes. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@1309 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -739,6 +739,9 @@ set_sem_owner(sem_id id, team_id team)
|
|||||||
return B_BAD_SEM_ID;
|
return B_BAD_SEM_ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Todo: this is a small race condition: the team ID could already
|
||||||
|
// be invalid at this point - we would lose one semaphore slot in
|
||||||
|
// this case!
|
||||||
gSems[slot].owner = team;
|
gSems[slot].owner = team;
|
||||||
|
|
||||||
RELEASE_SEM_LOCK(gSems[slot]);
|
RELEASE_SEM_LOCK(gSems[slot]);
|
||||||
@@ -799,7 +802,7 @@ remove_thread_from_sem(struct thread *t, struct sem_entry *sem, struct thread_qu
|
|||||||
|
|
||||||
// remove the thread from the queue and place it in the supplied queue
|
// remove the thread from the queue and place it in the supplied queue
|
||||||
t1 = thread_dequeue_id(&sem->q, t->id);
|
t1 = thread_dequeue_id(&sem->q, t->id);
|
||||||
if(t != t1)
|
if (t != t1)
|
||||||
return ERR_NOT_FOUND;
|
return ERR_NOT_FOUND;
|
||||||
sem->count += t->sem_acquire_count;
|
sem->count += t->sem_acquire_count;
|
||||||
t->state = B_THREAD_READY;
|
t->state = B_THREAD_READY;
|
||||||
@@ -811,7 +814,7 @@ remove_thread_from_sem(struct thread *t, struct sem_entry *sem, struct thread_qu
|
|||||||
int delta = min(t->sem_count, sem->count);
|
int delta = min(t->sem_count, sem->count);
|
||||||
|
|
||||||
t->sem_count -= delta;
|
t->sem_count -= delta;
|
||||||
if(t->sem_count <= 0) {
|
if (t->sem_count <= 0) {
|
||||||
t = thread_dequeue(&sem->q);
|
t = thread_dequeue(&sem->q);
|
||||||
t->state = B_THREAD_READY;
|
t->state = B_THREAD_READY;
|
||||||
thread_enqueue(t, queue);
|
thread_enqueue(t, queue);
|
||||||
|
|||||||
Reference in New Issue
Block a user