diff --git a/headers/os/kernel/syscalls.h b/headers/os/kernel/syscalls.h index b6fc2d51f7..8a9114b007 100755 --- a/headers/os/kernel/syscalls.h +++ b/headers/os/kernel/syscalls.h @@ -26,7 +26,7 @@ int sys_getrlimit(int resource, struct rlimit * rlp); int sys_setrlimit(int resource, const struct rlimit * rlp); bigtime_t sys_system_time(); -int sys_snooze(bigtime_t time); +status_t sys_snooze_until(bigtime_t time, int timebase); /* sem functions */ sem_id sys_create_sem(int count, const char *name); diff --git a/headers/private/kernel/ksyscalls.h b/headers/private/kernel/ksyscalls.h index b546d76145..2ad4157ba6 100755 --- a/headers/private/kernel/ksyscalls.h +++ b/headers/private/kernel/ksyscalls.h @@ -26,7 +26,7 @@ enum { SYSCALL_READ_PATH_STAT, SYSCALL_WRITE_PATH_STAT, SYSCALL_SYSTEM_TIME, - SYSCALL_SNOOZE, + SYSCALL_SNOOZE_UNTIL, SYSCALL_SEM_CREATE, SYSCALL_SEM_DELETE, SYSCALL_SEM_ACQUIRE, /* 20 */ diff --git a/src/kernel/apps/sig_test.c b/src/kernel/apps/sig_test.c index 161fd1d26b..ef65412420 100644 --- a/src/kernel/apps/sig_test.c +++ b/src/kernel/apps/sig_test.c @@ -112,7 +112,7 @@ main(int argc, char **argv) } printf("Done. Entering sleep mode...\n"); while (1) { - if (sys_snooze(1000000000L) == B_INTERRUPTED) + if (snooze(1000000000L) == B_INTERRUPTED) // this never gets called as the syscall is always restarted printf("sig_test (main): snooze was interrupted!\n"); } diff --git a/src/kernel/apps/testapp/main.c b/src/kernel/apps/testapp/main.c index f22bf4bd24..aa6d3dd810 100644 --- a/src/kernel/apps/testapp/main.c +++ b/src/kernel/apps/testapp/main.c @@ -18,7 +18,7 @@ static int32 test_thread(void *args) { int i = (int)args; - sys_snooze(1000000); + snooze(1000000); for(;;) { printf("%c", 'a' + i); } @@ -74,7 +74,7 @@ int main(int argc, char **argv) #endif #if 0 for(;;) { - sys_snooze(100000); + snooze(100000); printf("booyah!"); } @@ -82,7 +82,7 @@ int main(int argc, char **argv) #endif #if 0 printf("waiting 5 seconds\n"); - sys_snooze(5000000); + snooze(5000000); #endif #if 0 fd = sys_open("/dev/net/rtl8139/0", "", STREAM_TYPE_DEVICE); @@ -154,7 +154,7 @@ int main(int argc, char **argv) resume_thread(tids[i]); } - sys_snooze(5000000); + snooze(5000000); sys_kill_team(sys_get_current_team_id()); /* sys_snooze(3000000); @@ -196,7 +196,7 @@ int main(int argc, char **argv) printf("writing to the speaker\n"); data = 3; sys_write(fd, &data, 0, 1); - sys_snooze(1000000); + snooze(1000000); data = 0; sys_write(fd, &data, 0, 1); sys_close(fd); diff --git a/src/kernel/apps/tests/thread_test.c b/src/kernel/apps/tests/thread_test.c index d543e7ed6f..573a800b62 100644 --- a/src/kernel/apps/tests/thread_test.c +++ b/src/kernel/apps/tests/thread_test.c @@ -102,7 +102,7 @@ int main(int argc, char **argv) resume_thread(t[1]); resume_thread(t[2]); - sys_snooze(100000); + snooze(100000); sys_wait_on_thread(t[0], NULL); sys_wait_on_thread(t[1], NULL); @@ -115,7 +115,7 @@ int main(int argc, char **argv) printf("sending"); send_data(t[0], i, comm_test[i], strlen(comm_test[i]) + 1); // Give time to the commthread to display info - sys_snooze(10000); + snooze(10000); } sys_wait_on_thread(t[0], NULL); diff --git a/src/kernel/core/syscalls.c b/src/kernel/core/syscalls.c index f0ecc29ec7..9353b73d8e 100644 --- a/src/kernel/core/syscalls.c +++ b/src/kernel/core/syscalls.c @@ -175,8 +175,8 @@ int syscall_dispatcher(unsigned long call_num, void *arg_buffer, uint64 *call_re case SYSCALL_SYSTEM_TIME: *call_ret = system_time(); break; - case SYSCALL_SNOOZE: - *call_ret = snooze((bigtime_t)INT32TOINT64(arg0, arg1)); + case SYSCALL_SNOOZE_UNTIL: + *call_ret = snooze_etc((bigtime_t)INT32TOINT64(arg0, arg1), (int)arg2, B_CAN_INTERRUPT); break; case SYSCALL_SEM_CREATE: *call_ret = user_create_sem((int)arg0, (const char *)arg1); diff --git a/src/kernel/core/thread.c b/src/kernel/core/thread.c index d8333a70bf..ee42a94515 100644 --- a/src/kernel/core/thread.c +++ b/src/kernel/core/thread.c @@ -884,10 +884,20 @@ thread_init_percpu(int cpu_num) } +// This snooze is for internal kernel use only; doesn't interrupt on signals. status_t snooze(bigtime_t timeout) { - return acquire_sem_etc(snooze_sem, 1, B_TIMEOUT | B_CAN_INTERRUPT, timeout); + return acquire_sem_etc(snooze_sem, 1, B_RELATIVE_TIMEOUT, timeout); +} + + +status_t +snooze_etc(bigtime_t timeout, int timebase, uint32 flags) +{ + if (timebase != B_SYSTEM_TIMEBASE) + return B_BAD_VALUE; + return acquire_sem_etc(snooze_sem, 1, B_ABSOLUTE_TIMEOUT | flags, timeout); } diff --git a/src/kernel/libroot/os/syscalls.S b/src/kernel/libroot/os/syscalls.S index 903a957470..680d411222 100644 --- a/src/kernel/libroot/os/syscalls.S +++ b/src/kernel/libroot/os/syscalls.S @@ -96,7 +96,7 @@ SYSCALL4(sys_spawn_thread, 35) SYSCALL1(sys_kill_thread, 36) SYSCALL1(sys_suspend_thread, 37) SYSCALL1(sys_resume_thread, 38) -SYSCALL2(sys_snooze, 17) +SYSCALL3(sys_snooze_until, 17) SYSCALL4(send_data, 94) SYSCALL3(receive_data, 95) SYSCALL1(has_data, 96) diff --git a/src/kernel/libroot/os/thread.c b/src/kernel/libroot/os/thread.c index 462104ced0..4209a2005d 100644 --- a/src/kernel/libroot/os/thread.c +++ b/src/kernel/libroot/os/thread.c @@ -149,16 +149,14 @@ has_data(thread_id thread) status_t snooze(bigtime_t microseconds) { - // ToDo: snooze() - return B_ERROR; + return sys_snooze_until(system_time() + microseconds, B_SYSTEM_TIMEBASE); } status_t snooze_until(bigtime_t time, int timeBase) { - // ToDo: snooze_until() - return B_ERROR; + return sys_snooze_until(time, timeBase); } diff --git a/src/kernel/libroot/posix/unistd/sleep.c b/src/kernel/libroot/posix/unistd/sleep.c index f2c7a60295..18c8355685 100644 --- a/src/kernel/libroot/posix/unistd/sleep.c +++ b/src/kernel/libroot/posix/unistd/sleep.c @@ -20,7 +20,7 @@ sleep(unsigned seconds) usecs= 1000000; usecs*= (bigtime_t) seconds; - err= sys_snooze(usecs); + err= sys_snooze_until(start + usecs, B_SYSTEM_TIMEBASE); retval= 0; if(err) { diff --git a/src/kernel/libroot/posix/unistd/usleep.c b/src/kernel/libroot/posix/unistd/usleep.c index 6a09a310c3..6a00a957d2 100644 --- a/src/kernel/libroot/posix/unistd/usleep.c +++ b/src/kernel/libroot/posix/unistd/usleep.c @@ -10,5 +10,5 @@ int usleep(unsigned useconds) { - return sys_snooze((bigtime_t)(useconds)); + return sys_snooze_until(sys_system_time() + (bigtime_t)(useconds), B_SYSTEM_TIMEBASE); }