Messages in this thread | | | Date | Thu, 11 Dec 2008 02:32:06 +0100 (CET) | From | xcomp@arcor ... | Subject | Problem with old context in signal handler function |
| |
Hello everyone, I want to switch between user contexts using a signal handler (something like a preemptive scheduler for userlevel threads). I've found several sources, which say that it's not a good idea to use setcontext or swapcontext in a signal handler. Nevertheless there also exists at least one sample code of such an preemptive scheduler, which seems to work well, at least on my machine (Ubuntu 8.04 with linux kernel 2.6.24-22): www.seas.upenn.edu/~cse381/context_demo.c
// [...] static ucontext_t thread_context; static ucontext_t scheduler_context;
int thread_finished; int i;
static void simple_function(void) { // do nothing but counting for (i = 0; i < 1000000000; ++i) { }
if (i == 1000000000) { printf("\n[Thread Function]\t1st counting worked fine..."); } else { printf("\n[Thread Function]\tError: Counting didn't finished (%d)...", i); }
thread_finished = 1; }
static void other_function() { // thread_finished is a global variable, which is set to 1, if the thread function is finished while(thread_finished != 1) { swapcontext(&scheduler_context, &thread_context); } }
static void signal_handler_function(int sig_nr, siginfo_t* info, void *old_context) { if (sig_nr == SIGPROF) { // saves the thread context thread_context = *((ucontext_t*) context);
// swaps back to scheduler context setcontext(&scheduler_context); } } // [...]
I ran into the following problem which belongs to the code above. I interrupted simple_function several times by using a ITimer. But the for-loop doesn't finish successfully everytime. Often the if condition is false. But it does not cancel after the first signal is raised. I've found out that using the third parameter old_context for storing the old context is the reason. But I don't know why. So I thought there might be a problem in the kernel. Am I right? I was afraid to post the whole code, so I hope that this code snippet is enough. I would appreciate if someone can give me a comment whether this strange behaviour is because of a wrong thinking of mine or because of a error in the kernel which needs to be fixed.
Thanks a lot! Matthias
Jetzt komfortabel bei Arcor-Digital TV einsteigen: Mehr Happy Ends, mehr Herzschmerz, mehr Fernsehen! Erleben Sie 50 digitale TV Programme und optional 60 Pay TV Sender, einen elektronischen Programmführer mit Movie Star Bewertungen von TV Movie. Außerdem, aktuelle Filmhits und spannende Dokus in der Arcor-Videothek. Infos unter www.arcor.de/tv -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |