aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/runtime/os_dragonfly.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/runtime/os_dragonfly.c')
-rw-r--r--src/pkg/runtime/os_dragonfly.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/pkg/runtime/os_dragonfly.c b/src/pkg/runtime/os_dragonfly.c
index a2a88e4c80..f93c02ce1c 100644
--- a/src/pkg/runtime/os_dragonfly.c
+++ b/src/pkg/runtime/os_dragonfly.c
@@ -72,19 +72,40 @@ runtime·futexsleep(uint32 *addr, uint32 val, int64 ns)
*(int32*)0x1005 = 0x1005;
}
+static void badfutexwakeup(void);
+
+#pragma textflag NOSPLIT
void
runtime·futexwakeup(uint32 *addr, uint32 cnt)
{
int32 ret;
+ void (*fn)(void);
ret = runtime·sys_umtx_wakeup(addr, cnt);
if(ret >= 0)
return;
- runtime·printf("umtx_wake addr=%p ret=%d\n", addr, ret);
+ g->m->ptrarg[0] = addr;
+ g->m->scalararg[0] = ret;
+ fn = badfutexwakeup;
+ if(g == g->m->gsignal)
+ fn();
+ else
+ runtime·onM(&fn);
*(int32*)0x1006 = 0x1006;
}
+static void
+badfutexwakeup(void)
+{
+ void *addr;
+ int32 ret;
+
+ addr = g->m->ptrarg[0];
+ ret = g->m->scalararg[0];
+ runtime·printf("umtx_wake addr=%p ret=%d\n", addr, ret);
+}
+
void runtime·lwp_start(void*);
void
@@ -119,6 +140,7 @@ runtime·osinit(void)
runtime·ncpu = getncpu();
}
+#pragma textflag NOSPLIT
void
runtime·get_random_data(byte **rnd, int32 *rnd_len)
{