Module: xenomai-gch
Branch: for-2.4
Commit: a473a11f6d717b7bd098ce8cbc0ef6e329dbffb5
URL:    
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=a473a11f6d717b7bd098ce8cbc0ef6e329dbffb5

Author: Peter Soetens <pe...@thesourceworks.com>
Date:   Thu Oct  1 15:57:54 2009 +0200

nucleus: move posix selector in nucleus for every skin to use.

This patch makes the select implementation in syscall.c independent of the
posix skin.

---

 include/nucleus/thread.h   |    4 ++++
 ksrc/nucleus/pod.c         |   12 ++++++++++++
 ksrc/nucleus/thread.c      |    3 +++
 ksrc/skins/posix/syscall.c |    4 ++--
 ksrc/skins/posix/thread.c  |    7 -------
 ksrc/skins/posix/thread.h  |    4 ----
 6 files changed, 21 insertions(+), 13 deletions(-)

diff --git a/include/nucleus/thread.h b/include/nucleus/thread.h
index 3eefb53..b651bd8 100644
--- a/include/nucleus/thread.h
+++ b/include/nucleus/thread.h
@@ -142,6 +142,7 @@ struct xnthread;
 struct xnsched;
 struct xnsynch;
 struct xnrpi;
+struct xnselector;
 
 typedef struct xnthrops {
 
@@ -207,6 +208,9 @@ typedef struct xnthread {
        xnstat_exectime_t account; /* Execution time accounting entity */
        xnstat_exectime_t lastperiod; /* Interval marker for execution time 
reports */
     } stat;
+#ifdef CONFIG_XENO_OPT_SELECT
+    struct xnselector *selector;    /* For select. */
+#endif /* CONFIG_XENO_OPT_SELECT */
 
     int errcode;               /* Local errno */
 
diff --git a/ksrc/nucleus/pod.c b/ksrc/nucleus/pod.c
index 9348ce1..bee6a04 100644
--- a/ksrc/nucleus/pod.c
+++ b/ksrc/nucleus/pod.c
@@ -41,6 +41,7 @@
 #include <nucleus/registry.h>
 #include <nucleus/module.h>
 #include <nucleus/stat.h>
+#include <nucleus/select.h>
 #include <asm/xenomai/bits/pod.h>
 
 /* debug support */
@@ -1204,6 +1205,15 @@ void xnpod_delete_thread(xnthread_t *thread)
        xntimer_destroy(&thread->rtimer);
        xntimer_destroy(&thread->ptimer);
 
+#ifdef CONFIG_XENO_OPT_SELECT
+       if (thread->selector) {
+               xnselector_destroy(thread->selector);
+               xnheap_schedule_free(&kheap, thread->selector, 
+                                    (xnholder_t *)thread->selector);
+               thread->selector = NULL;
+       }
+#endif /* CONFIG_XENO_OPT_SELECT */
+
        if (xnthread_test_state(thread, XNPEND))
                xnsynch_forget_sleeper(thread);
 
@@ -1283,6 +1293,8 @@ void xnpod_abort_thread(xnthread_t *thread)
        if (!xnpod_current_p(thread))
                xnpod_suspend_thread(thread, XNDORMANT, XN_INFINITE, 
XN_RELATIVE, NULL);
        xnpod_delete_thread(thread);
+       /* FIXME: in case thread has a selector, the xnfree(selector)
+          happens with nklock locked. */
        xnlock_put_irqrestore(&nklock, s);
 }
 
diff --git a/ksrc/nucleus/thread.c b/ksrc/nucleus/thread.c
index 5fceaec..0969c90 100644
--- a/ksrc/nucleus/thread.c
+++ b/ksrc/nucleus/thread.c
@@ -123,6 +123,9 @@ int xnthread_init(xnthread_t *thread,
        initph(&thread->xlink);
        thread->rpi = NULL;
 #endif /* CONFIG_XENO_OPT_PRIOCPL */
+#ifdef CONFIG_XENO_OPT_SELECT
+       thread->selector = NULL;
+#endif /* CONFIG_XENO_OPT_SELECT */
        initpq(&thread->claimq);
 
        xnarch_init_display_context(thread);
diff --git a/ksrc/skins/posix/syscall.c b/ksrc/skins/posix/syscall.c
index f8c79d9..6427d40 100644
--- a/ksrc/skins/posix/syscall.c
+++ b/ksrc/skins/posix/syscall.c
@@ -2370,11 +2370,11 @@ static int __select(struct task_struct *curr, struct 
pt_regs *regs)
        xntmode_t mode = XN_RELATIVE;
        struct xnselector *selector;
        struct timeval tv;
-       pthread_t thread;
+       xnthread_t *thread;
        int i, err, nfds;
        size_t fds_size;
 
-       thread = pse51_current_thread();
+       thread = xnpod_current_thread();
        if (!thread)
                return -EPERM;
 
diff --git a/ksrc/skins/posix/thread.c b/ksrc/skins/posix/thread.c
index ad4aaa5..6e89625 100644
--- a/ksrc/skins/posix/thread.c
+++ b/ksrc/skins/posix/thread.c
@@ -78,12 +78,6 @@ static void thread_delete_hook(xnthread_t *xnthread)
        pse51_mark_deleted(thread);
        pse51_signal_cleanup_thread(thread);
        pse51_timer_cleanup_thread(thread);
-#ifdef CONFIG_XENO_OPT_POSIX_SELECT
-       if (thread->selector) {
-               xnselector_destroy(thread->selector);
-               thread->selector = NULL;
-       }
-#endif /* CONFIG_XENO_OPT_POSIX_SELECT */
 
        switch (thread_getdetachstate(thread)) {
        case PTHREAD_CREATE_DETACHED:
@@ -216,7 +210,6 @@ int pthread_create(pthread_t *tid,
        pse51_signal_init_thread(thread, cur);
        pse51_tsd_init_thread(thread);
        pse51_timer_init_thread(thread);
-       thread->selector = NULL;
 
        if (thread->attr.policy == SCHED_RR) {
                xnthread_time_slice(&thread->threadbase) = pse51_time_slice;
diff --git a/ksrc/skins/posix/thread.h b/ksrc/skins/posix/thread.h
index 33b14fd..fc8c6fe 100644
--- a/ksrc/skins/posix/thread.h
+++ b/ksrc/skins/posix/thread.h
@@ -21,7 +21,6 @@
 #define _POSIX_THREAD_H
 
 #include <posix/internal.h>
-#include <nucleus/select.h>
 
 typedef unsigned long long pse51_sigset_t;
 
@@ -91,9 +90,6 @@ struct pse51_thread {
     /* For timers. */
     xnqueue_t timersq;
     
-    /* For select. */
-    struct xnselector *selector;
-
 #ifdef CONFIG_XENO_OPT_PERVASIVE
     struct pse51_hkey hkey;
 #endif /* CONFIG_XENO_OPT_PERVASIVE */


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

Reply via email to