On Mon, 2010-09-06 at 01:34 -0700, Bob Feretich wrote:
> OK, I've implemented rt_event_bind() the way you indicated and I get a 
> good return code.
> 
> But, now after several minutes of good operation, a rt_event_wait() in a 
> tight loop produces a return code of  -14 (EFAULT).
> 
> rt_event_wait (&event_structure,...)
> 
> According to the documentation, rt_event_wait() doesn't produce that 
> error code. This was my original error and it is what made me explore 
> the user-task representation of the RT_EVENT structure.
> What is the return code trying to tell me?
> 
> I'm guessing a kernel copy of the RT_EVENT is being trashed. The below 
> question assumes this is correct.
> I have two tasks involved. A rt-kernel-task that created and signals the 
> event; and a rt-user-task that binds, waits upon, and clears the event.
> Is there one instance of the RT_EVENT that is accessed by both tasks, or 
> does each task have their own instance?
> If there is only one instance, then I can monitor for corruption in the 
> kernel task. If there are two instances, then how do I monitor the user 
> tasks instance?

There is a single instance in kernel space, hence the handle from
user-space to reach it. This said, the only way your code can get
-EFAULT is by passing a wrong address for the event or return mask, or
maybe due to a stack overflow. A kernel data corruption would likely not
lead to -EFAULT. The issue is more likely in your application.

> 
> Regards,
> Bob Feretich
> 
> On 9/5/2010 9:56 PM, Philippe Gerum wrote:
> > On Sun, 2010-09-05 at 15:38 -0700, Bob Feretich wrote:
> >> I am confused about the operation of the Native rt_event_bind()
> >> function and I have not found any example of its use.
> >>
> >> The documentation states...
> >> int rt_event_bind (RT_EVENT * event, const char * name, RTIME timeout)
> >> Parameters:
> >> ...
> >> event The address of an event flag group descriptor retrieved by the
> >> operation. Contents of
> >> this memory is undefined upon failure.
> >> ...
> >>
> >> Is the user-space task supposed to provide memory for the RT_EVENT, ...
> >> example:
> >> RT_EVENT event_structure;
> >> ...
> >> rt_event_bind (&event_structure,...)
> > This way.
> >
> >> Or, does the user-space program just provide a pointer variable to
> >> retain the event structure provided to it by the function?
> >> example:
> >> RT_EVENT *event_pointer;
> >> ...
> >> rt_event_bind (event_pointer,...)
> >>
> >> Neither seems to work correctly, the former only allocates a word of 
> >> memory.
> >> printf("sizeof(event_structure)=%d", sizeof(event_structure) );
> >> Prints 4. This seems too small.
> >>
> > It is correct; the only thing you should care about is the return code.
> > To keep the API consistent between kernel and user-space usages, both
> > require the address of a RT_EVENT event struct to be given, but this
> > struct is defined differently. In the user-space case, RT_EVENT is a
> > placeholder containing a handle to the actual struct in kernel space
> > (that handle is not a pointer, so you should not infer anything from its
> > value).
> >
> >> The latter fails with an error code -14 (EFAULT).
> >>
> >> Regards,
> >> Bob Feretich
> >>
> >>
> >> _______________________________________________
> >> Xenomai-help mailing list
> >> [email protected]
> >> https://mail.gna.org/listinfo/xenomai-help

-- 
Philippe.



_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help

Reply via email to