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