From: Gilles Chanteperdrix <gilles.chanteperdrix@xenomai.org>
To: Andrew Tannenbaum <trb@domain.hid>
Cc: xenomai@xenomai.org
Subject: Re: [Xenomai-help] hang in rtcansend
Date: Thu, 29 Dec 2011 14:13:31 +0100 [thread overview]
Message-ID: <4EFC677B.20500@domain.hid> (raw)
In-Reply-To: <4EFC4E21.3000804@domain.hid>
On 12/29/2011 12:25 PM, Gilles Chanteperdrix wrote:
> On 12/28/2011 08:09 PM, Andrew Tannenbaum wrote:
>> On 12/26/2011 06:04 PM, Gilles Chanteperdrix wrote:
>>> On 12/26/2011 11:56 PM, Gilles Chanteperdrix wrote:
>>>> On 12/22/2011 01:41 AM, Andrew Tannenbaum wrote:
>>>>> Summary: I am having a problem running rtcansend/recv on Xenomai 2.6.0,
>>>>> with the processes hanging in their cleanup code.
>>>>>
>>>>> I had been running Xenomai on an Intel Atom system with a PEAK PCI
>>>>> SJA1000 CAN adapter.
>>>>>
>>>>> I was running Linux 2.5.35.7 with Xenomai 2.5.5.2. I connected a servo
>>>>> and motor to the PEAK adapter, and I was able to talk with it using
>>>>> rtcansend and rtcanrecv.
>>>>>
>>>>> After working on other things for a few months, I need to return to this
>>>>> project, so I downloaded the latest Linux/Xenomai pair, which I think is
>>>>> Linux 2.5.38.8 and Xenomai 2.6.0.
>>>>>
>>>>> I was able to compile these (using the Debian build advice, generating
>>>>> .deb files for Linux and Xenomai, which I install with dpkg -i). I used
>>>>> a Linux .config derived from my older build.
>>>>>
>>>>> With both the new and old installs, I am able to run xeno-test and get
>>>>> decent latencies and such, though some of the tests fail depending on
>>>>> what I have configured in Realtime/Drivers/Testing Drivers. That is not
>>>>> what I'm asking about.
>>>>>
>>>>>
>>>>>
>>>>> I am having a problem running rtcansend/recv on Xenomai 2.6.0:
>>>>>
>>>>> I can run rtcanconfig and it sets up my rtcan0 properly so I can see and
>>>>> configure the servo. The data in /proc/rtcan looks ok.
>>>>>
>>>>> But when I try to talk with the servo using rtcansend, the rtcansend
>>>>> process fails during the close phase, it looks like this:
>>>>>
>>>>> $ rtcansend rtcan0 -v -i 0x0 0x82 0x1
>>>>> interface rtcan0
>>>>> s=0, ifr_name=rtcan0
>>>>> <0x000> [2] 82 01
>>>>> Cleaning up...
>>>>> ^CSignal 2 received
>>>>> Cleaning up...
>>>>> $
>>>>>
>>>>> So it hangs after the first "Cleaning up..." and I hit Control-C and
>>>>> then it catches the ^C and exits. The code at the bottom of
>>>>
>>>> After various attempts, the bug happens when the main thread exits with
>>>> pthread_exit while other threads exist in the process. It was already
>>>> there in 2.5.6 at least, but we did not see it with rtcansend because
>>>> there was no other thread than the main thread, while in 2.6.0, there is
>>>> now the rt_print thread running.
>>>>
>>>
>>> And it is in fact a linux/glibc behaviour. A test program compiled
>>> without xenomai exhibits the same behaviour. Here is the test program,
>>> simplified to the max:
>>>
>>> #include <pthread.h>
>>> #include <sys/mman.h>
>>> #include <time.h>
>>>
>>> void *loop(void *cookie)
>>> {
>>> struct timespec ts;
>>>
>>> ts.tv_sec = 0;
>>> ts.tv_nsec = 100000000;
>>>
>>> pthread_detach(pthread_self());
>>>
>>> for(;;)
>>> nanosleep(&ts, NULL);
>>> }
>>>
>>> int main(void)
>>> {
>>> pthread_t tid;
>>>
>>> mlockall(MCL_CURRENT | MCL_FUTURE);
>>>
>>> pthread_create(&tid, NULL, loop, NULL);
>>>
>>> pthread_exit(NULL);
>>> }
>>>
>>> So, rtcansend should call exit.
>>>
>>
>> Gilles,
>>
>> Thank you for your help, it explains and resolves my immediate needs. I
>> am not sure I understand the underlying problem, and I have more
>> questions about it.
>>
>> Re the new loose private rt_print pthread, I am not comfortable with the
>> suggestion to call exit() explicitly (instead of pthread_exit() or
>> rt_task_delete()). Asking the user to call exit() instead of
>> rt_task_delete() is not intuitive.
>>
>> In your simple example case, a simple solution would be to call
>> pthread_cancel(tid) before pthread_exit(). I understand that in a
>> Xenomai program using rt_print, the user isn't really handling the
>> rt_print thread. If rt_task_delete() doesn't mean process exit, the
>> question gets more difficult.
>>
>> Can the rt_print pthread be cleaned up automatically? atexit()?
>> use-count in rt_task_delete()? If not, should rt_print be started and
>> stopped explicitly by the user?
>>
>> I'm wondering about old programs that may hang when they are ported from
>> Xenomai pre-2.6 to post-2.6.
>
> Here is a patch which only spawns the rt_print thread if the user calls
> rt_print_auto_init(1), or rt_print_init(). Then if you have called these
> services, you are expected to call rt_print_cleanup() to cancel the
> rt_print thread, before calling rt_task_delete().
It is a proposition. What do you think?
--
Gilles.
next prev parent reply other threads:[~2011-12-29 13:13 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-12-22 0:41 [Xenomai-help] hang in rtcansend Andrew Tannenbaum
2011-12-22 9:48 ` Gilles Chanteperdrix
2011-12-22 13:33 ` Willy Lambert
2011-12-22 15:36 ` Gilles Chanteperdrix
2011-12-22 15:47 ` Willy Lambert
2011-12-22 18:59 ` Andrew Tannenbaum
2011-12-26 22:56 ` Gilles Chanteperdrix
2011-12-26 23:04 ` Gilles Chanteperdrix
2011-12-28 19:09 ` Andrew Tannenbaum
2011-12-28 20:50 ` Gilles Chanteperdrix
2011-12-29 11:25 ` Gilles Chanteperdrix
2011-12-29 13:13 ` Gilles Chanteperdrix [this message]
2011-12-29 15:18 ` Andrew Tannenbaum
2011-12-29 15:34 ` Gilles Chanteperdrix
2012-01-03 23:47 ` Andrew Tannenbaum
2012-01-10 17:50 ` Andrew Tannenbaum
2012-01-10 18:11 ` Gilles Chanteperdrix
2012-01-11 16:24 ` Andrew Tannenbaum
2012-01-16 23:19 ` [Xenomai-help] problem with Debian Xenomai build, was " Andrew Tannenbaum
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=4EFC677B.20500@domain.hid \
--to=gilles.chanteperdrix@xenomai.org \
--cc=trb@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.