Fixes mhello, soon to be destroyed
authorBarret Rhoden <brho@cs.berkeley.edu>
Sat, 7 Apr 2012 01:27:11 +0000 (18:27 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sat, 7 Apr 2012 01:27:11 +0000 (18:27 -0700)
mhello is pretty ugly, and continues to get uglier as uthread code
becomes more capable.  This keeps it alive a bit longer, allowing it to
deal with blocking syscalls (I have mmap() blocking in some of my
tests).  mhello will just spin til the syscall is done.

tests/mhello.c

index 088f586..23682c1 100644 (file)
@@ -32,6 +32,13 @@ struct schedule_ops ghetto_sched_ops = {
 };
 struct schedule_ops *sched_ops = &ghetto_sched_ops;
 
 };
 struct schedule_ops *sched_ops = &ghetto_sched_ops;
 
+/* Extreme ghetto */
+static void __ros_syscall_spinon(struct syscall *sysc)
+{
+       while (!(atomic_read(&sysc->flags) & (SC_DONE | SC_PROGRESS)))
+               cpu_relax();
+}
+
 /* to trick uthread_create() */
 int main(int argc, char** argv)
 {
 /* to trick uthread_create() */
 int main(int argc, char** argv)
 {
@@ -74,6 +81,10 @@ int main(int argc, char** argv)
         * _M mode.  Note this requests one vcore for us */
        struct uthread dummy = {0};
        uthread_lib_init(&dummy);
         * _M mode.  Note this requests one vcore for us */
        struct uthread dummy = {0};
        uthread_lib_init(&dummy);
+       /* Reset the blockon to be the spinner...  This is really shitty.  Any
+        * blocking calls after we become an MCP and before this will fail.  This is
+        * just mhello showing its warts due to trying to work outside uthread.c */
+       ros_syscall_blockon = __ros_syscall_spinon;
 
        if ((vcoreid = vcore_id())) {
                printf("Should never see me! (from vcore %d)\n", vcoreid);
 
        if ((vcoreid = vcore_id())) {
                printf("Should never see me! (from vcore %d)\n", vcoreid);