Hello Alexander,
I wrote a simple example to test the NOVA+NUL. In my example, I created two Execution Contexts.
When the the first Execution Context starts, it obtains a portal capability to the second Execution Context, and run a while(true) loop as follow :
... while(1) { Logging::printf("#tsc=%llu\n", now); nova_call(pt); } ...
The second Execution Context run also a while(true) loop as follow:
... while(1) { count++; Logging::printf("WorkerThread is working... count= %u\n", count); } ...
The first Execution Context call the second Execution Context. When the second Execution Context receive the call in its portal function, it calls the msleep( ) function on a TimerHelper instance that it has already created:
unsigned portal_func(Utcb &utcb, Utcb::Frame &input, bool &free_cap, cap_sel pid) { Logging::printf("Thread will sleep... count=%u\n", count); timer->msleep(1000); return ENONE; }
The problem is that, it is the first Execution Context who is blocked and not the second Execution Context.
Could anyone please give me an example of how can I achieve the inverse case, where the first EC continue running and suspends the second EC.
this is my code to obtain the portal:
cap_sel pseudonym = alloc_cap(); res = ParentProtocol::get_pseudonym(*utcb, "s0/ec2", 0, pseudonym); cap_sel pt = alloc_cap(); res = ParentProtocol::get_portal(*utcb, pseudonym, pt, true, "s0/worker_thread");
Thank you in advance.
Mehdi