All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Gai <pj@domain.hid>
To: xenomai@xenomai.org
Subject: [Xenomai-help] Xenomai 2.0.1 - Posix Skin - implementing a periodic thread
Date: Tue, 13 Dec 2005 18:57:12 +0100	[thread overview]
Message-ID: <439F0B78.2000002@domain.hid> (raw)

[-- Attachment #1: Type: text/plain, Size: 645 bytes --]

Dear all,

here is another small demo... this time of a periodic thread in POSIX.

It works under Xenomai, but it fails under Posix Real-Time.

The reason of the failure is the SIGUSR1 not being blocked by the main 
thread. If in main() the comments below the note "// REMOVE THE COMMENTS 
BELOW" are removed, then the signal is masked also in the main(), and as 
a result the POSIX version works.

The question I have is if the behavior in Xenomai (that is, not failing 
like the POSIX counterpart) is correct or not...

bye

Paolo

-- 
Evidence S.R.L. - Paolo Gai, CEO
http://www.evidence.eu.com   Tel: +39 0587 274823   Fax: +39 0587 291904


[-- Attachment #2: ex_periodic.c --]
[-- Type: text/x-csrc, Size: 2214 bytes --]

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <errno.h>
#include <signal.h>
#include <unistd.h>
#include <pthread.h>

void abort_perror(const char *msg)
{
  perror(msg);
  exit(1);
}


void *my_periodic_thread (void *cookie)
{
  struct itimerspec its;
  struct sigevent sig;
  sigset_t blocked;
  siginfo_t si;
  timer_t mytimer;
  int i;

  /* create a timer that will be used to periodically send a signal */
  sig.sigev_notify = SIGEV_SIGNAL;
  sig.sigev_signo = SIGUSR1;
  sig.sigev_value.sival_ptr = &sig;
  if(timer_create(CLOCK_REALTIME, &sig, &mytimer))
    abort_perror("timer_create");

  /* block the signal used by the timer */
  sigemptyset(&blocked);
  sigaddset(&blocked, SIGUSR1);
  pthread_sigmask(SIG_BLOCK, &blocked, NULL);

  /* set the periodic timer */
  its.it_value.tv_sec = 0;
  its.it_value.tv_nsec = 40000000; /* 40 ms */
  its.it_interval.tv_sec = 0;
  its.it_interval.tv_nsec = 20000000; /* 20 ms */;
  if(timer_settime(mytimer, 0, &its, NULL))
    abort_perror("timer_settime");

  printf("periodic thread started...\n");

  for (i=0; i<40; i++) {
    while (sigwaitinfo(&blocked, &si) == -1 && errno == EINTR);

    /* The thread body */
    printf("%d\n",i);
  }

  printf("...periodic thread end!\n");
  
  timer_delete(mytimer);
  return NULL;
}

int main()
{
  pthread_t mythread;
  pthread_attr_t myattr;
  struct sched_param myparam;
  void *returnvalue;
  sigset_t blocked;

  /* block the signal used by the timer */
  // REMOVE THE COMMENTS BELOW
  //  sigemptyset(&blocked);
  //  sigaddset(&blocked, SIGUSR1);
  //  pthread_sigmask(SIG_BLOCK, &blocked, NULL);

  /* initializes the thread attribute */
  pthread_attr_init(&myattr);
  pthread_attr_setinheritsched(&myattr, PTHREAD_EXPLICIT_SCHED);
  pthread_attr_setschedpolicy(&myattr, SCHED_FIFO);
  myparam.sched_priority = 3;
  pthread_attr_setschedparam(&myattr, &myparam);

  printf("starting a periodic thread...\n");

  if (pthread_create(&mythread, &myattr, my_periodic_thread, NULL))
    abort_perror("pthread_create");

  pthread_attr_destroy(&myattr);

  /* wait the end of the thread we just created */
  pthread_join(mythread, &returnvalue);

  printf("ending main...\n");

  return 0;
}


             reply	other threads:[~2005-12-13 17:57 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-12-13 17:57 Paolo Gai [this message]
2005-12-13 18:22 ` [Xenomai-help] Xenomai 2.0.1 - Posix Skin - implementing a periodic thread Jan Kiszka
2005-12-13 20:27 ` Gilles Chanteperdrix

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=439F0B78.2000002@domain.hid \
    --to=pj@domain.hid \
    --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.