Module: xenomai-jki
Branch: for-upstream
Commit: 95278926edc559d48b1b178e6b01f91c019fd53c
URL:    
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=95278926edc559d48b1b178e6b01f91c019fd53c

Author: Jan Kiszka <jan.kis...@siemens.com>
Date:   Mon Mar  1 17:44:30 2010 +0100

RTDM: Avoid calling cleanup_instance with held spin lock

It's cleaner to check for close_lock_count under spin lock from within
cleanup_instance than calling it with the lock held. This changes no
semantics of the involved functions.

Signed-off-by: Jan Kiszka <jan.kis...@siemens.com>

---

 ksrc/skins/rtdm/core.c |   45 +++++++++++++++++++++++----------------------
 1 files changed, 23 insertions(+), 22 deletions(-)

diff --git a/ksrc/skins/rtdm/core.c b/ksrc/skins/rtdm/core.c
index 3bc13f1..8677c47 100644
--- a/ksrc/skins/rtdm/core.c
+++ b/ksrc/skins/rtdm/core.c
@@ -167,11 +167,19 @@ static int create_instance(struct rtdm_device *device,
        return 0;
 }
 
-/* call with rt_fildes_lock acquired - will release it */
-static void cleanup_instance(struct rtdm_device *device,
-                            struct rtdm_dev_context *context,
-                            struct rtdm_fildes *fildes, int nrt_mem, spl_t s)
+static int cleanup_instance(struct rtdm_device *device,
+                           struct rtdm_dev_context *context,
+                           struct rtdm_fildes *fildes, int nrt_mem)
 {
+       spl_t s;
+
+       xnlock_get_irqsave(&rt_fildes_lock, s);
+
+       if (unlikely(atomic_read(&context->close_lock_count) > 1)) {
+               xnlock_put_irqrestore(&rt_fildes_lock, s);
+               return -EAGAIN;
+       }
+
        if (fildes) {
                clear_bit((fildes - fildes_table), used_fildes);
                fildes->context = NULL;
@@ -192,6 +200,8 @@ static void cleanup_instance(struct rtdm_device *device,
        }
 
        rtdm_dereference_device(device);
+
+       return 0;
 }
 
 int __rt_dev_open(rtdm_user_info_t *user_info, const char *path, int oflag)
@@ -199,7 +209,6 @@ int __rt_dev_open(rtdm_user_info_t *user_info, const char 
*path, int oflag)
        struct rtdm_device *device;
        struct rtdm_fildes *fildes;
        struct rtdm_dev_context *context;
-       spl_t s;
        int ret;
        int nrt_mode = !rtdm_in_rt_context();
 
@@ -236,8 +245,7 @@ int __rt_dev_open(rtdm_user_info_t *user_info, const char 
*path, int oflag)
        return context->fd;
 
 cleanup_out:
-       xnlock_get_irqsave(&rt_fildes_lock, s);
-       cleanup_instance(device, context, fildes, nrt_mode, s);
+       cleanup_instance(device, context, fildes, nrt_mode);
 
 err_out:
        return ret;
@@ -251,7 +259,6 @@ int __rt_dev_socket(rtdm_user_info_t *user_info, int 
protocol_family,
        struct rtdm_device *device;
        struct rtdm_fildes *fildes;
        struct rtdm_dev_context *context;
-       spl_t s;
        int ret;
        int nrt_mode = !rtdm_in_rt_context();
 
@@ -289,8 +296,7 @@ int __rt_dev_socket(rtdm_user_info_t *user_info, int 
protocol_family,
        return context->fd;
 
 cleanup_out:
-       xnlock_get_irqsave(&rt_fildes_lock, s);
-       cleanup_instance(device, context, fildes, nrt_mode, s);
+       cleanup_instance(device, context, fildes, nrt_mode);
 
 err_out:
        return ret;
@@ -348,24 +354,19 @@ again:
        } else if (unlikely(ret < 0))
                goto unlock_out;
 
-       xnlock_get_irqsave(&rt_fildes_lock, s);
+       ret = cleanup_instance(context->device, context, &fildes_table[fd],
+                              test_bit(RTDM_CREATED_IN_NRT,
+                              &context->context_flags));
+       if (ret < 0) {
+               rtdm_context_unlock(context);
 
-       if (unlikely(atomic_read(&context->close_lock_count) > 1)) {
-               xnlock_put_irqrestore(&rt_fildes_lock, s);
+               if (!nrt_mode)
+                       goto err_out;
 
-               if (!nrt_mode) {
-                       ret = -EAGAIN;
-                       goto unlock_out;
-               }
-               rtdm_context_unlock(context);
                msleep(CLOSURE_RETRY_PERIOD);
                goto again;
        }
 
-       cleanup_instance(context->device, context, &fildes_table[fd],
-                        test_bit(RTDM_CREATED_IN_NRT, &context->context_flags),
-                        s);
-
        trace_mark(xn_rtdm, fd_closed, "fd %d", fd);
 
        return ret;


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

Reply via email to