All of lore.kernel.org
 help / color / mirror / Atom feed
From: Richard Weinberger <richard.weinberger@gmail.com>
To: "Petr Červenka" <grugh@centrum.cz>
Cc: Jan Kiszka <jan.kiszka@siemens.com>, Xenomai <xenomai@xenomai.org>
Subject: Re: rt_task_unblock() POSIX alternative
Date: Thu, 9 Apr 2020 20:48:31 +0200	[thread overview]
Message-ID: <CAFLxGvxuZw57FvaAQEAxseamoPhHdKX7wfZoaZxKskgeXa4V9g@mail.gmail.com> (raw)
In-Reply-To: <20200409201057.74CB5ED0@centrum.cz>

On Thu, Apr 9, 2020 at 8:10 PM Petr Červenka <grugh@centrum.cz> wrote:
>
> > Don't use signal().
> > Use sigaction() and *don't* set SA_RESTART. Maybe read() is always restarted...
>
>
>
> Thank you for trying to help me.
>
> But with the sigaction (without SA_RESTART) the behavior is completely the same:
>
> Only Ctrl+C or kill(0, SIGINT) are able to invoke the signalHandler.
> The read() is not interrupted (maybe syscall restart in some inner cycle).
>
> Example of the signal handler setup:
>
>     // Setup signal handler
>     struct sigaction act;
>     memset(&act, 0, sizeof (act));
>     act.sa_handler = signalHandler;
>     sigaction(SIGINT, &act, NULL);
>     sigaction(SIGTERM, &act, NULL);

I gave your program a try.
With this changes it works (at least how I understand your test case).

Task started
Set period: 5s
Task livind: 9.9e-05s
Waiting for join
Signal handler: 41
Signal handler end
Task livind: 0.999s
Task ended

diff --git a/read_intr.cpp b/read_intr.cpp
index 722f69c..1c5ef53 100644
--- a/read_intr.cpp
+++ b/read_intr.cpp
@@ -21,14 +21,10 @@ static pthread_t task;
 static int timer_fd;
 static bool end = false;

-void signalHandler(int signal) {
+void signalHandler(int signal, siginfo_t *info, void *ctx) {
     int err;
     printf("Signal handler: %d\n", signal);
     end = true;
-    err = pthread_kill(task, SIGINT);
-    if (err != 0) {
-        printf("pthread_kill failed: %d (%s)\n", err, strerror(-err));
-    }
     printf("Signal handler end\n");
 }

@@ -50,9 +46,6 @@ static void *taskHandler(void *cookie) {

     printf("Task started\n");

-    signal(SIGINT, signalHandler);
-    signal(SIGTERM, signalHandler);
-
     // Get current time
     struct timespec start;
     clock_gettime(CLOCK_MONOTONIC, &start);
@@ -97,13 +90,15 @@ static void *taskHandler(void *cookie) {
 int main(int argc, char** argv) {
     unsigned long overruns;
     int err;
+    struct sigaction sa = {0};

     mlockall(MCL_CURRENT | MCL_FUTURE);

     // Setup signal handler
-    signal(SIGINT, signalHandler);
-    signal(SIGTERM, signalHandler);
-
+    sa.sa_flags = 0;
+    sigemptyset(&sa.sa_mask);
+    sa.sa_sigaction = signalHandler;
+    sigaction(SIGRTMIN + 7, &sa, NULL);
     // Get current process ID
     mainTask_pid = getpid();

@@ -140,11 +135,11 @@ int main(int argc, char** argv) {
     usleep(SLEEP / 1000);

     // Call of signal handler
-    err = kill(0, SIGINT);  // THE ONLY ONE WHICH WORKS !!!
+    //err = kill(0, SIGINT);  // THE ONLY ONE WHICH WORKS !!!
     //err = kill(getpid(), SIGINT);
     //err = kill(mainTask_pid, SIGINT);
     //err = pthread_kill(pthread_self(), SIGINT);
-    //err = pthread_kill(task, SIGINT);
+    err = pthread_kill(task, SIGRTMIN + 7);
     if (err != 0) {
         printf("pthread_kill failed: %d (%s)\n", err, strerror(-err));
     }


-- 
Thanks,
//richard


  reply	other threads:[~2020-04-09 18:48 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-07 13:41 rt_task_unblock() POSIX alternative Petr Červenka
2020-04-07 14:59 ` Jan Kiszka
2020-04-07 15:18   ` Petr Červenka
2020-04-07 15:29     ` Jan Kiszka
2020-04-07 15:30     ` Richard Weinberger
2020-04-08  9:44       ` Petr Červenka
2020-04-08 10:06         ` Richard Weinberger
2020-04-08 21:36         ` Richard Weinberger
2020-04-09 15:00           ` Petr Červenka
2020-04-09 16:13             ` Richard Weinberger
2020-04-09 18:10               ` Petr Červenka
2020-04-09 18:48                 ` Richard Weinberger [this message]
2020-04-14  8:16                   ` Petr Červenka
2020-04-14  8:30                     ` Richard Weinberger
2020-04-14  9:10                       ` Petr Červenka
2020-04-14  9:46                         ` Richard Weinberger
2020-04-14 10:07                           ` Jan Kiszka
2020-04-14 10:23                             ` Richard Weinberger
2020-04-14 10:28                               ` Jan Kiszka
2020-04-14 10:41                                 ` Richard Weinberger
2020-04-14 10:43                                   ` Jan Kiszka
2020-04-14 10:56                                     ` Richard Weinberger
2020-04-14 11:01                                       ` Jan Kiszka
2020-04-14 11:05                                         ` Richard Weinberger
2020-04-14 11:30                                           ` Jan Kiszka
2020-04-14 10:39                             ` Petr Červenka

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAFLxGvxuZw57FvaAQEAxseamoPhHdKX7wfZoaZxKskgeXa4V9g@mail.gmail.com \
    --to=richard.weinberger@gmail.com \
    --cc=grugh@centrum.cz \
    --cc=jan.kiszka@siemens.com \
    --cc=xenomai@xenomai.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.