Commits

Paweł Wieczorek committed 312dd8f

* dalsza czesc dokumentacji

Comments (0)

Files changed (2)

support/unix_ctx_setjmp.c

     curstack.ss_sp = sa;
     curstack.ss_size = sl;
     curstack.ss_flags = 0;
-
+    // zachowujemy obecną maskę sygnałów
     if (sigprocmask(SIG_SETMASK, &shortjump_waitmask, &oldmask) == -1) {
         int e = errno;
         pwuthread_perror(e, "setting new sigmask");
         return e;
     }
+    // ustawiamy alternatywny stos dla obsługi sygnału SIGUSR2
     if (sigaltstack(&curstack, &oldstack) == -1) {
         int e = errno;
         pwuthread_perror(e, "setting new sigaltstack");
         return e;
     }
 
+    // rejestrujemy uchwyt dla SIGUSR2
     shortjump_sa.sa_mask = oldmask;
     shortjump_sigmask = oldmask;
     if (sigaction(SIGUSR2, &shortjump_sa, &oldsa) == -1) {
     }
 
     t->context = PWUTHREAD_MALLOC(struct pwuthread_ctx);
+    /* wywołujemy sygnał
+     * -- być może lepiej użyć raise(SIGUSR2), który wg standardu POSIX
+     * powinien wrócić dopiero gdy nastąpi powrót z procedury obsługi sygnału
+     */
+    
     shortjump_raised = 0;
     shortjump_thread = t;
     kill(getpid(), SIGUSR2);
             return e;
         } 
     }
+    // przywracanie starego stosu alternatywnego, maski procesów itp
     if (sigaction(SIGUSR2, &oldsa, NULL) == -1) {
         int e = errno;
         pwuthread_perror(e, "setting old signal handler");
 int
 pwuthread_ctx_switch(pwuthread_ctx_t ctx0, pwuthread_ctx_t ctx1)
 {
+    // zapis obecny kontekst i wykonaj skok do innego
     if (sigsetjmp(ctx0->jb, 1) == 0) {
         siglongjmp(ctx1->jb, 1);
     } 
     return 0;
 }
 
+/**
+ * @brief procesura obsługi krótkiego skoku
+ *
+ * Uruchomiona jako obsługa sygnału SIGUSR2 zapamiętuje kontekst procesora
+ * i natychmiastowo powraca. Gdy nastąpi skok do tak zachowanego kontekstu
+ * procesora uruchamia program wątku.
+ */
 void
 shortjump_handler(int s)
 {

support/unix_ctx_ucontext.c

 int
 pwuthread_ctx_detach(pwuthread_ctx_t ctx)
 {
-    return ENOTSUP;
+    free(ctx);
+    return 0;
 }