aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/runtime/os_nacl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/runtime/os_nacl.c')
-rw-r--r--src/pkg/runtime/os_nacl.c72
1 files changed, 62 insertions, 10 deletions
diff --git a/src/pkg/runtime/os_nacl.c b/src/pkg/runtime/os_nacl.c
index f859dd0d35..fba32e5687 100644
--- a/src/pkg/runtime/os_nacl.c
+++ b/src/pkg/runtime/os_nacl.c
@@ -65,6 +65,7 @@ runtime·crash(void)
*(int32*)0 = 0;
}
+#pragma textflag NOSPLIT
void
runtime·get_random_data(byte **rnd, int32 *rnd_len)
{
@@ -112,8 +113,8 @@ runtime·newosproc(M *mp, void *stk)
}
}
-uintptr
-runtime·semacreate(void)
+static void
+semacreate(void)
{
int32 mu, cond;
@@ -128,14 +129,32 @@ runtime·semacreate(void)
runtime·throw("semacreate");
}
g->m->waitsemalock = mu;
- return cond; // assigned to m->waitsema
+ g->m->scalararg[0] = cond; // assigned to m->waitsema
}
#pragma textflag NOSPLIT
-int32
-runtime·semasleep(int64 ns)
+uint32
+runtime·semacreate(void)
+{
+ void (*fn)(void);
+ uint32 x;
+
+ fn = semacreate;
+ runtime·onM(&fn);
+ x = g->m->scalararg[0];
+ g->m->scalararg[0] = 0;
+ return x;
+}
+
+static void
+semasleep(void)
{
int32 ret;
+ int64 ns;
+
+ ns = (int64)(uint32)g->m->scalararg[0] | (int64)(uint32)g->m->scalararg[1]<<32;
+ g->m->scalararg[0] = 0;
+ g->m->scalararg[1] = 0;
ret = runtime·nacl_mutex_lock(g->m->waitsemalock);
if(ret < 0) {
@@ -145,7 +164,8 @@ runtime·semasleep(int64 ns)
if(g->m->waitsemacount > 0) {
g->m->waitsemacount = 0;
runtime·nacl_mutex_unlock(g->m->waitsemalock);
- return 0;
+ g->m->scalararg[0] = 0;
+ return;
}
while(g->m->waitsemacount == 0) {
@@ -163,7 +183,8 @@ runtime·semasleep(int64 ns)
ret = runtime·nacl_cond_timed_wait_abs(g->m->waitsema, g->m->waitsemalock, &ts);
if(ret == -ETIMEDOUT) {
runtime·nacl_mutex_unlock(g->m->waitsemalock);
- return -1;
+ g->m->scalararg[0] = -1;
+ return;
}
if(ret < 0) {
//runtime·printf("nacl_cond_timed_wait_abs: error %d\n", -ret);
@@ -174,14 +195,34 @@ runtime·semasleep(int64 ns)
g->m->waitsemacount = 0;
runtime·nacl_mutex_unlock(g->m->waitsemalock);
- return 0;
+ g->m->scalararg[0] = 0;
}
-void
-runtime·semawakeup(M *mp)
+#pragma textflag NOSPLIT
+int32
+runtime·semasleep(int64 ns)
+{
+ int32 r;
+ void (*fn)(void);
+
+ g->m->scalararg[0] = (uint32)ns;
+ g->m->scalararg[1] = (uint32)(ns>>32);
+ fn = semasleep;
+ runtime·onM(&fn);
+ r = g->m->scalararg[0];
+ g->m->scalararg[0] = 0;
+ return r;
+}
+
+static void
+semawakeup(void)
{
int32 ret;
+ M *mp;
+ mp = g->m->ptrarg[0];
+ g->m->ptrarg[0] = nil;
+
ret = runtime·nacl_mutex_lock(mp->waitsemalock);
if(ret < 0) {
//runtime·printf("nacl_mutex_lock: error %d\n", -ret);
@@ -196,6 +237,17 @@ runtime·semawakeup(M *mp)
runtime·nacl_mutex_unlock(mp->waitsemalock);
}
+#pragma textflag NOSPLIT
+void
+runtime·semawakeup(M *mp)
+{
+ void (*fn)(void);
+
+ g->m->ptrarg[0] = mp;
+ fn = semawakeup;
+ runtime·onM(&fn);
+}
+
uintptr
runtime·memlimit(void)
{