2
0
Fork 0
Browse Source

solo5: do not yield for expired deadlines

absolute-needed
Emery Hemingway 2 years ago
parent
commit
e90c74304b
  1. 2
      packages/solo5/default.nix
  2. 60
      packages/solo5/time.patch

2
packages/solo5/default.nix

@ -20,7 +20,7 @@ in stdenv.mkDerivation {
enableParallelBuilding = true;
patches = [ ./genode.patch ./elftool.patch ];
patches = [ ./genode.patch ./elftool.patch ./time.patch ];
configurePhase = ''
runHook preConfigure

60
packages/solo5/time.patch

@ -0,0 +1,60 @@
commit a7902e24ba8fd2c6cfd56f68952f8d5417b9a303
Author: Emery Hemingway <ehmry@posteo.net>
Date: Sat May 16 02:07:54 2020 +0530
Genode: do not yield for expired deadlines
diff --git a/bindings/genode/bindings.cc b/bindings/genode/bindings.cc
index 5785ae5..a4a4a34 100644
--- a/bindings/genode/bindings.cc
+++ b/bindings/genode/bindings.cc
@@ -104,6 +104,12 @@ namespace Solo5
return epoch;
}
+
+ static Microseconds from_ns(solo5_time_t ns) {
+ return Microseconds { ns / 1000ULL }; }
+
+ static solo5_time_t to_ns(Microseconds us) {
+ return us.value * 1000ULL; }
}
@@ -431,20 +437,19 @@ struct Solo5::Platform
_initial_epoch = rtc_epoch(env);
return _initial_epoch * 1000000000ULL
- + timer.curr_time().trunc_to_plain_us().value * 1000ULL;
+ + to_ns(timer.curr_time().trunc_to_plain_us());
}
void
yield(solo5_time_t deadline_ns, solo5_handle_set_t *ready_set)
{
if (!nic_ready) {
- solo5_time_t deadline_us = deadline_ns / 1000;
- solo5_time_t now_us = timer.curr_time()
- .trunc_to_plain_us().value;
+ Microseconds deadline = from_ns(deadline_ns);
+ Microseconds now = timer.curr_time().trunc_to_plain_us();
+ if (deadline.value <= now.value) return;
// schedule a timeout signal
- yield_timeout.schedule(
- Genode::Microseconds{deadline_us - now_us});
+ yield_timeout.schedule(Microseconds {deadline.value - now.value});
/*
* Block for Nic and Timer signals until a packet is
@@ -531,8 +536,8 @@ void solo5_abort(void)
solo5_time_t solo5_clock_monotonic(void)
{
- return Platform::instance->timer.curr_time()
- .trunc_to_plain_us().value*1000;
+ return Solo5::to_ns(Platform::instance->
+ timer.curr_time().trunc_to_plain_us());
}
Loading…
Cancel
Save