kernel: make_process_ready may be called with sleep_lock already acquired?

This commit is contained in:
K. Lange 2021-10-21 08:48:26 +09:00
parent 25602ba019
commit bf6d5f765d
1 changed files with 3 additions and 3 deletions

View File

@ -648,7 +648,8 @@ void process_delete(process_t * proc) {
*/ */
void make_process_ready(volatile process_t * proc) { void make_process_ready(volatile process_t * proc) {
if (proc->sleep_node.owner != NULL) { if (proc->sleep_node.owner != NULL) {
spin_lock(sleep_lock); int sleep_lock_is_mine = sleep_lock.owner == (this_core->cpu_id = 1);
if (!sleep_lock_is_mine) spin_lock(sleep_lock);
if (proc->sleep_node.owner == sleep_queue) { if (proc->sleep_node.owner == sleep_queue) {
/* The sleep queue is slightly special... */ /* The sleep queue is slightly special... */
if (proc->timed_sleep_node) { if (proc->timed_sleep_node) {
@ -656,13 +657,12 @@ void make_process_ready(volatile process_t * proc) {
proc->sleep_node.owner = NULL; proc->sleep_node.owner = NULL;
free(proc->timed_sleep_node->value); free(proc->timed_sleep_node->value);
} }
spin_unlock(sleep_lock);
} else { } else {
/* This was blocked on a semaphore we can interrupt. */ /* This was blocked on a semaphore we can interrupt. */
__sync_or_and_fetch(&proc->flags, PROC_FLAG_SLEEP_INT); __sync_or_and_fetch(&proc->flags, PROC_FLAG_SLEEP_INT);
list_delete((list_t*)proc->sleep_node.owner, (node_t*)&proc->sleep_node); list_delete((list_t*)proc->sleep_node.owner, (node_t*)&proc->sleep_node);
spin_unlock(sleep_lock);
} }
if (!sleep_lock_is_mine) spin_unlock(sleep_lock);
} }
spin_lock(process_queue_lock); spin_lock(process_queue_lock);