Corrected a failure using thread_lock/thread_unlock.
authorJens Krieg <jkrieg@mailbox.tu-berlin.de>
Mon, 27 Jan 2014 15:37:48 +0000 (16:37 +0100)
committerJens Krieg <jkrieg@mailbox.tu-berlin.de>
Mon, 27 Jan 2014 15:37:48 +0000 (16:37 +0100)
Final version without thread locking.

sys/kern/kern_fork.c
sys/kern/subr_sleepqueue.c

index fc5505f..bf2689f 100644 (file)
@@ -963,7 +963,7 @@ fail1:
 //     printf("fork1 done..\n");
        return (error);
 }
-
+int bugChecker = 0;
 /*
  * Handle the return of a child process from fork1().  This function
  * is called from the MD fork_trampoline() entry point.
@@ -1001,15 +1001,27 @@ fork_exit(void (*callout)(void *, struct trapframe *), void *arg,
        enable_intr();
 
        printf("fork_exit thread %s\n", td->td_name);
+       if (!strcmp(td->td_name, "init")) {
+               printf("fork_exit start init\n", td->td_name);
+               bugChecker++;
+       }
 
        /*
         * cpu_set_fork_handler intercepts this function call to
         * have this call a non-return function to stay in kernel mode.
         * initproc has its own fork handler, but it does return.
         */
+       if (bugChecker)
+               printf("fork_exit assert init\n", td->td_name);
        KASSERT(callout != NULL, ("NULL callout in fork_exit"));
+       if (bugChecker)
+               printf("fork_exit assert init done\n", td->td_name);
+
        callout(arg, frame);
-       printf("callout done.\n");
+
+       if (bugChecker)
+               printf("fork_exit callout init done\n", td->td_name);
+
        /*
         * Check if a kernel thread misbehaved and returned from its main
         * function.
index 04aee49..b10b2cb 100644 (file)
@@ -441,7 +441,9 @@ sleepq_catch_signals(void *wchan, int pri)
        }
        stop_allowed = (td->td_flags & TDF_SBDRY) ? SIG_STOP_NOT_ALLOWED :
            SIG_STOP_ALLOWED;
-       thread_unlock(td);
+//     thread_unlock(td);
+       intr_restore(rflags);
+       enable_intr();
        mtx_unlock_spin(&sc->sc_lock);
        CTR3(KTR_PROC, "sleepq catching signals: thread %p (pid %ld, %s)",
                (void *)td, (long)p->p_pid, td->td_name);
@@ -469,9 +471,6 @@ sleepq_catch_signals(void *wchan, int pri)
        mtx_lock_spin(&sc->sc_lock);
        PROC_UNLOCK(p);
        thread_lock(td);
-       intr_restore(rflags);
-       enable_intr();
-
        PROC_SUNLOCK(p);
        if (ret == 0) {
                sleepq_switch(wchan, pri);