Allow a remote affinity event in a running thread

This commit is contained in:
Rodrigo Arias 2021-08-10 12:46:45 +02:00
parent aa3607f744
commit a7c03179db

View File

@ -213,15 +213,31 @@ ev_affinity_remote(struct ovni_emu *emu)
thread = emu_get_thread(emu, tid);
assert(thread);
assert(thread->state == TH_ST_PAUSED);
/* The thread may still be running */
assert(thread->state == TH_ST_RUNNING ||
thread->state == TH_ST_PAUSED);
/* It must have an assigned CPU */
assert(thread->cpu);
/* Migrate current cpu to the one at cpuid */
newcpu = emu_get_cpu(emu->cur_loom, cpuid);
/* It must not be running in any of the cpus */
/* If running, update the CPU thread lists */
if(thread->state == TH_ST_RUNNING)
{
emu_cpu_remove_thread(thread->cpu, thread);
emu_cpu_add_thread(newcpu, thread);
}
else
{
/* Otherwise, ensure that it is not in any CPU list */
assert(emu_cpu_find_thread(thread->cpu, thread) == -1);
assert(emu_cpu_find_thread(newcpu, thread) == -1);
}
/* Always set the assigned CPU in the thread */
thread->cpu = newcpu;
//dbg("thread %d switches to cpu %d by remote petition\n", tid,