// It shouldn't return. If it does, exit
MOVL $302, AX // sys_threxit
SYSCALL
- JMP -3(PC) // keep exiting
+ JMP -3(PC) // keep exiting
-TEXT runtime·sys_sched_yield(SB),7,$0
- MOVL $298, AX
+TEXT runtime·osyield(SB),7,$0
+ MOVL $298, AX // sys_sched_yield
SYSCALL
RET
MOVL $116, AX // sys_gettimeofday
SYSCALL
- MOVQ 8(SP), BX // sec
+ MOVQ 8(SP), BX // sec
MOVQ sec+0(FP), DI
MOVQ BX, (DI)
- MOVL 16(SP), BX // usec
+ MOVL 16(SP), BX // usec
MOVQ usec+8(FP), DI
MOVL BX, (DI)
RET
extern SigTab runtime·sigtab[];
extern int64 runtime·rfork_thread(int32 flags, void *stack, M *m, G *g, void (*fn)(void));
-extern void runtime·sys_sched_yield(void);
+
+enum
+{
+ ENOTSUP = 91,
+};
// Basic spinlocks using CAS. We can improve on these later.
static void
lock(Lock *l)
{
- uint32 v;
- int32 ret;
-
for(;;) {
if(runtime·cas(&l->key, 0, 1))
return;
- runtime·sys_sched_yield();
+ runtime·osyield();
}
}
unlock(Lock *l)
{
uint32 v;
- int32 ret;
for (;;) {
v = l->key;
if((ret = runtime·rfork_thread(flags, stk, m, g, fn)) < 0) {
runtime·printf("runtime: failed to create new OS thread (have %d already; errno=%d)\n", runtime·mcount() - 1, -ret);
- runtime·printf("runtime: is kern.rthreads disabled?\n");
-
+ if (ret == -ENOTSUP)
+ runtime·printf("runtime: is kern.rthreads disabled?\n");
runtime·throw("runtime.newosproc");
}
}