Anders Blomdell wrote:
> When RTDM is exposed to code like this:
> 
>   device1 = rt_dev_open("some_device", O_RDWR);
>   device2 = rt_dev_open("some_device", O_RDWR);
> 
> I get a SEGFAULT, which I attribute to a missing assignment to
> context_ptr in the case when the device is already busy, the lack of
> this assignment leads to a segfault in cleanup_instance.
> 
> 
> --- xenomai-2.1-rc2/ksrc/skins/rtdm/core.c~     2006-01-07
> 18:08:34.000000000 +0100
> +++ xenomai-2.1-rc2/ksrc/skins/rtdm/core.c      2006-01-27
> 11:14:43.000000000 +0100
> @@ -136,6 +136,8 @@
> 
>          if (context->device) {
>              xnlock_put_irqrestore(&rt_dev_lock, s);
> +
> +            *context_ptr = NULL;
>              return -EBUSY;
>          }
>          context->device = device;
> 

Yep, correct. Don't know, I must have smoked something while trying to
fix this bug some weeks ago. Thanks for reporting and also providing a
patch.

I just gave it another try, also re-organising the involved function
create_instance() slightly. Please checkout latest SVN or try the
following patch and let me know if this works now, really.

Thanks again,
Jan


Index: core.c
===================================================================
--- core.c      (revision 475)
+++ core.c      (working copy)
@@ -116,13 +116,13 @@
     spl_t                   s;


+    *context_ptr = NULL;
+
     xnlock_get_irqsave(&rt_fildes_lock, s);

     *fildes_ptr = fildes = free_fildes;
-    if (!fildes) {
+    if (unlikely(!fildes)) {
         xnlock_put_irqrestore(&rt_fildes_lock, s);
-
-        *context_ptr = NULL;
         return -ENFILE;
     }
     free_fildes = fildes->next;
@@ -134,15 +134,13 @@
     if (context) {
         xnlock_get_irqsave(&rt_dev_lock, s);

-        if (context->device) {
+        if (unlikely(context->device)) {
             xnlock_put_irqrestore(&rt_dev_lock, s);
             return -EBUSY;
         }
         context->device = device;

         xnlock_put_irqrestore(&rt_dev_lock, s);
-
-        *context_ptr = context;
     } else {
         if (nrt_mem)
             context = kmalloc(sizeof(struct rtdm_dev_context) +
@@ -150,13 +148,14 @@
         else
             context = xnmalloc(sizeof(struct rtdm_dev_context) +
                                device->context_size);
-        *context_ptr = context;
-        if (!context)
+        if (unlikely(!context))
             return -ENOMEM;

         context->device = device;
     }

+    *context_ptr = context;
+
     context->fd  = get_fd(fildes);
     context->ops = &device->ops;
     atomic_set(&context->close_lock_count, 0);


Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core

Reply via email to