From mboxrd@z Thu Jan 1 00:00:00 1970 Message-ID: <4BB389C6.7040902@domain.hid> Date: Wed, 31 Mar 2010 19:43:34 +0200 From: Jan Kiszka MIME-Version: 1.0 References: <4BB38520.4020603@domain.hid> <4BB3861F.4070303@domain.hid> In-Reply-To: <4BB3861F.4070303@domain.hid> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Subject: Re: [Xenomai-core] syscall restart issue with SIGINFO handlers List-Id: Xenomai life and development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Gilles Chanteperdrix Cc: xenomai-core Gilles Chanteperdrix wrote: > Jan Kiszka wrote: >> Hi Gilles, >> >> here is a case so far uncaught by Xenomai syscall restart code: >> >> #include >> #include >> #include >> #include >> #include >> #include >> #include >> >> RT_MUTEX mutex; >> pthread_t pthread; >> >> void sighand1(int sig) >> { >> printf("signal 1: %d\n", sig); >> } >> >> void sighand2(int sig, siginfo_t *si, void *context) >> { >> printf("signal 2: %d\n", sig); >> } >> >> void thread(void *arg) >> { >> int res1, res2; >> >> pthread = pthread_self(); >> >> res1 = rt_mutex_acquire(&mutex, TM_INFINITE); >> >> res2 = rt_mutex_release(&mutex); >> >> printf("res = %d / %d\n", res1, res2); >> } >> >> int main() >> { >> struct sigaction sa; >> RT_TASK task_main, task; >> >> mlockall(MCL_CURRENT|MCL_FUTURE); >> >> signal(SIGUSR1, sighand1); >> >> sigemptyset(&sa.sa_mask); >> sa.sa_sigaction = sighand2; >> sa.sa_flags = SA_SIGINFO; >> sigaction(SIGUSR2, &sa, NULL); >> >> rt_task_shadow(&task_main, "main", 1, 0); >> >> rt_mutex_create(&mutex, "mutex"); >> rt_mutex_acquire(&mutex, TM_INFINITE); >> >> rt_task_spawn(&task, "thread", 0, 2, 0, thread, 0); >> >> sleep(1); >> pthread_kill(pthread, SIGUSR1); >> >> sleep(1); >> pthread_kill(pthread, SIGUSR2); >> >> rt_mutex_release(&mutex); >> >> rt_task_delete(&task); >> >> return 0; >> } >> >> >> Sending SIGUSR2 will make the blocked thread see -EINTR as result of its >> rt_mutex acquire. Some different path must be taken by libc when >> delivering SA_SIGINFO signals and returning to the application. Can you >> confirm this? > > If you want syscalls to be automatically restarted, you should pass the > SA_RESTART flag to sigaction. It is unrelated to SA_SIGINFO unless I > missed something. Oh, indeed, that works. Should explain the issue in the field, my colleagues likely missed that too. Thanks, Jan -- Siemens AG, Corporate Technology, CT T DE IT 1 Corporate Competence Center Embedded Linux