Module: xenomai-head
Branch: master
Commit: 6a020f5a89955a42f1e03621ae6c63a587e9c75c
URL:    
http://git.xenomai.org/?p=xenomai-head.git;a=commit;h=6a020f5a89955a42f1e03621ae6c63a587e9c75c

Author: Philippe Gerum <r...@xenomai.org>
Date:   Sat Aug 28 13:04:45 2010 +0200

nucleus, posix: use fast APC scheduling call

---

 ksrc/nucleus/pipe.c     |   16 ++++++++--------
 ksrc/nucleus/registry.c |    4 ++--
 ksrc/nucleus/select.c   |    3 +--
 ksrc/nucleus/shadow.c   |    4 ++--
 ksrc/skins/posix/apc.c  |    3 +--
 5 files changed, 14 insertions(+), 16 deletions(-)

diff --git a/ksrc/nucleus/pipe.c b/ksrc/nucleus/pipe.c
index b0fd80c..b8abd56 100644
--- a/ksrc/nucleus/pipe.c
+++ b/ksrc/nucleus/pipe.c
@@ -215,9 +215,9 @@ static void xnpipe_wakeup_proc(void *cookie)
        xnlock_put_irqrestore(&nklock, s);
 }
 
-static inline void xnpipe_schedule_request(void)
+static inline void xnpipe_schedule_request(void) /* hw IRQs off */
 {
-       rthal_apc_schedule(xnpipe_wakeup_apc);
+       __rthal_apc_schedule(xnpipe_wakeup_apc);
 }
 
 static inline ssize_t xnpipe_flush_bufq(void (*fn)(void *buf, void *xstate),
@@ -347,11 +347,11 @@ int xnpipe_connect(int minor, struct xnpipe_operations 
*ops, void *xstate)
                }
        }
 
-       xnlock_put_irqrestore(&nklock, s);
-
        if (need_sched)
                xnpipe_schedule_request();
 
+       xnlock_put_irqrestore(&nklock, s);
+
        return minor;
 }
 EXPORT_SYMBOL_GPL(xnpipe_connect);
@@ -416,11 +416,11 @@ cleanup:
                xnpipe_minor_free(minor);
        }
 
-       xnlock_put_irqrestore(&nklock, s);
-
        if (need_sched)
                xnpipe_schedule_request();
 
+       xnlock_put_irqrestore(&nklock, s);
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(xnpipe_disconnect);
@@ -475,11 +475,11 @@ ssize_t xnpipe_send(int minor, struct xnpipe_mh *mh, 
size_t size, int flags)
                need_sched = 1;
        }
 
-       xnlock_put_irqrestore(&nklock, s);
-
        if (need_sched)
                xnpipe_schedule_request();
 
+       xnlock_put_irqrestore(&nklock, s);
+
        return (ssize_t) size;
 }
 EXPORT_SYMBOL_GPL(xnpipe_send);
diff --git a/ksrc/nucleus/registry.c b/ksrc/nucleus/registry.c
index 7dc7cf0..6977132 100644
--- a/ksrc/nucleus/registry.c
+++ b/ksrc/nucleus/registry.c
@@ -405,7 +405,7 @@ static inline void registry_proc_export(xnobject_t *object, 
xnpnode_t *pnode)
        object->pnode = pnode;
        removeq(&registry_obj_busyq, &object->link);
        appendq(&registry_obj_procq, &object->link);
-       rthal_apc_schedule(registry_proc_apc);
+       __rthal_apc_schedule(registry_proc_apc);
 }
 
 static inline void registry_proc_unexport(xnobject_t *object)
@@ -413,7 +413,7 @@ static inline void registry_proc_unexport(xnobject_t 
*object)
        if (object->proc != XNOBJECT_PROC_RESERVED1) {
                removeq(&registry_obj_busyq, &object->link);
                appendq(&registry_obj_procq, &object->link);
-               rthal_apc_schedule(registry_proc_apc);
+               __rthal_apc_schedule(registry_proc_apc);
        } else {
                /* Unexporting before the lower stage has had a chance to
                   export. Move back the object to the busyq just like if no
diff --git a/ksrc/nucleus/select.c b/ksrc/nucleus/select.c
index 656671d..6ba59cd 100644
--- a/ksrc/nucleus/select.c
+++ b/ksrc/nucleus/select.c
@@ -405,9 +405,8 @@ void xnselector_destroy(struct xnselector *selector)
        inith(&selector->destroy_link);
        xnlock_get_irqsave(&nklock, s);
        appendq(&xnselectors, &selector->destroy_link);
+       __rthal_apc_schedule(xnselect_apc);
        xnlock_put_irqrestore(&nklock, s);
-
-       rthal_apc_schedule(xnselect_apc);
 }
 EXPORT_SYMBOL_GPL(xnselector_destroy);
 
diff --git a/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c
index c15e6e1..fe1ba64 100644
--- a/ksrc/nucleus/shadow.c
+++ b/ksrc/nucleus/shadow.c
@@ -895,9 +895,9 @@ static void schedule_linux_call(int type, struct 
task_struct *p, int arg)
        rq->req[reqnum].task = p;
        rq->req[reqnum].arg = arg;
 
-       splexit(s);
+       __rthal_apc_schedule(lostage_apc);
 
-       rthal_apc_schedule(lostage_apc);
+       splexit(s);
 }
 
 static inline int normalize_priority(int prio)
diff --git a/ksrc/skins/posix/apc.c b/ksrc/skins/posix/apc.c
index 9092d5d..176687e 100644
--- a/ksrc/skins/posix/apc.c
+++ b/ksrc/skins/posix/apc.c
@@ -47,9 +47,8 @@ void pse51_schedule_lostage(int request, void *arg, size_t 
size)
        rq->req[reqnum].arg = arg;
        rq->req[reqnum].size = size;
        rq->in = (reqnum + 1) & (PSE51_LO_MAX_REQUESTS - 1);
+       __rthal_apc_schedule(pse51_lostage_apc);
        splexit(s);
-
-       rthal_apc_schedule(pse51_lostage_apc);
 }
 
 static void pse51_lostage_handle_request(void *cookie)


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

Reply via email to