User can set how long sys_block() sleeps
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 5 May 2011 18:41:05 +0000 (11:41 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:36:02 +0000 (17:36 -0700)
kern/src/syscall.c
tests/block_test.c
tests/hello.c
tests/syscall.c
user/parlib/include/parlib.h
user/parlib/syscall.c

index 71b672a..4c2025e 100644 (file)
@@ -96,15 +96,14 @@ static int sys_null(void)
 
 /* Diagnostic function: blocks the kthread/syscall, to help userspace test its
  * async I/O handling. */
-static int sys_block(void)
+static int sys_block(struct proc *p, unsigned int usec)
 {
        struct timer_chain *tchain = &per_cpu_info[core_id()].tchain;
        struct alarm_waiter a_waiter;
        init_awaiter(&a_waiter, 0);
-       /* Block for 5ms.  Note printing takes a few ms, so your printds won't be
-        * perfect. */
+       /* Note printing takes a few ms, so your printds won't be perfect. */
        printd("[kernel] sys_block(), sleeping at %llu\n", read_tsc());
-       set_awaiter_rel(&a_waiter, 5000);
+       set_awaiter_rel(&a_waiter, usec);
        set_alarm(tchain, &a_waiter);
        sleep_on_awaiter(&a_waiter);
        printd("[kernel] sys_block(), waking up at %llu\n", read_tsc());
index ab132fd..b43b92e 100644 (file)
@@ -23,7 +23,7 @@ void *block_thread(void* arg)
        assert(!in_vcore_context());
        for (int i = 0; i < NUM_TEST_LOOPS; i++) {
                printf_safe("[A] pthread %d on vcore %d\n", pthread_self()->id, vcore_id());
-               ros_syscall(SYS_block, 0, 0, 0, 0, 0, 0);
+               sys_block(5000);
        }
        return (void*)(pthread_self()->id);
 }
index 32fb773..4efc982 100644 (file)
@@ -1,11 +1,11 @@
 #include <stdlib.h>
 #include <stdio.h>
-#include <ros/syscall.h>
+#include <parlib.h>
 
 int main(int argc, char** argv)
 {
        printf("Hello world from program %s!!\n", argv[0]);
-       ros_syscall(SYS_block, 0, 0, 0, 0, 0, 0);
+       sys_block(5000);
        printf("Done\n");
        return 0;
 }
index 92922cc..3350121 100644 (file)
@@ -38,6 +38,7 @@ int main(int argc, char** argv)
        ev_q = get_big_event_q();
        /* issue the diagnostic block syscall */
        sysc.num = SYS_block;
+       sysc.arg0 = 5000;       /* 5ms */
        sysc.ev_q = ev_q;
        /* Trap */
        num_started = __ros_arch_syscall((long)&sysc, 1);
@@ -80,6 +81,7 @@ int main(int argc, char** argv)
        sysc.u_data = (void*)1; /* using this to loop on */
        /* issue the diagnostic blocking syscall */
        sysc.num = SYS_block;
+       sysc.arg0 = 5000;       /* 5ms */
        sysc.ev_q = ev_q;
        num_started = __ros_arch_syscall((long)&sysc, 1);
        /* have this thread "wait" */
index 08a7618..9a14999 100644 (file)
@@ -50,7 +50,7 @@ int         sys_self_notify(uint32_t vcoreid, unsigned int ev_type,
                             struct event_msg *u_msg);
 int         sys_halt_core(unsigned int usec);
 void*          sys_init_arsc();
-
+int         sys_block(unsigned int usec);
 
 #endif // !ASSEMBLER
 
index 189ebc2..c48e1c1 100644 (file)
@@ -132,3 +132,8 @@ void* sys_init_arsc()
 {
        return (void*)ros_syscall(SYS_init_arsc, 0, 0, 0, 0, 0, 0);
 }
+
+int sys_block(unsigned int usec)
+{
+       return ros_syscall(SYS_block, usec, 0, 0, 0, 0, 0);
+}