diff options
Diffstat (limited to 'src/pkg/runtime/os_dragonfly.c')
| -rw-r--r-- | src/pkg/runtime/os_dragonfly.c | 24 |
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) { |
