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

Author: Philippe Gerum <r...@xenomai.org>
Date:   Sun Jul 19 21:45:35 2009 +0200

testsuite: allow multiple switchtest instances to run concurrently

---

 ksrc/drivers/testing/switchtest.c |   42 +++++++++++++++++++-----------------
 1 files changed, 22 insertions(+), 20 deletions(-)

diff --git a/ksrc/drivers/testing/switchtest.c 
b/ksrc/drivers/testing/switchtest.c
index 529d809..9ae84db 100644
--- a/ksrc/drivers/testing/switchtest.c
+++ b/ksrc/drivers/testing/switchtest.c
@@ -31,6 +31,9 @@ typedef struct rtswitch_context {
 
        unsigned failed;
        struct rttst_swtest_error error;
+
+       rtswitch_task_t *utask;
+       rtdm_nrtsig_t wake_utask;
 } rtswitch_context_t;
 
 static unsigned int start_index;
@@ -41,9 +44,6 @@ MODULE_PARM_DESC(start_index, "First device instance number 
to be used");
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("gilles.chanteperd...@laposte.net");
 
-static rtswitch_task_t *rtswitch_utask[NR_CPUS];
-static rtdm_nrtsig_t rtswitch_wake_utask;
-
 static void handle_ktask_error(rtswitch_context_t *ctx, unsigned fp_val)
 {
        rtswitch_task_t *cur = &ctx->tasks[ctx->error.last_switch.to];
@@ -63,8 +63,8 @@ static void handle_ktask_error(rtswitch_context_t *ctx, 
unsigned fp_val)
                        /* Unblock it. */
                        switch(task->base.flags & RTSWITCH_RT) {
                        case RTSWITCH_NRT:
-                               rtswitch_utask[ctx->cpu] = task;
-                               rtdm_nrtsig_pend(&rtswitch_wake_utask);
+                               ctx->utask = task;
+                               rtdm_nrtsig_pend(&ctx->wake_utask);
                                break;
 
                        case RTSWITCH_RT:
@@ -108,8 +108,8 @@ static void timed_wake_up(rtdm_timer_t *timer)
 
        switch (task->base.flags & RTSWITCH_RT) {
        case RTSWITCH_NRT:
-               rtswitch_utask[ctx->cpu] = task;
-               rtdm_nrtsig_pend(&rtswitch_wake_utask);
+               ctx->utask = task;
+               rtdm_nrtsig_pend(&ctx->wake_utask);
                break;
 
        case RTSWITCH_RT:
@@ -149,8 +149,8 @@ static int rtswitch_to_rt(rtswitch_context_t *ctx,
        } else
                switch (to->base.flags & RTSWITCH_RT) {
                case RTSWITCH_NRT:
-                       rtswitch_utask[ctx->cpu] = to;
-                       rtdm_nrtsig_pend(&rtswitch_wake_utask);
+                       ctx->utask = to;
+                       rtdm_nrtsig_pend(&ctx->wake_utask);
                        xnpod_lock_sched();
                        break;
 
@@ -350,6 +350,7 @@ static int rtswitch_register_task(rtswitch_context_t *ctx,
        t = &ctx->tasks[arg->index];
        ctx->next_index++;
        t->base = *arg;
+       t->last_switch = 0;
        sema_init(&t->nrt_synch, 0);
        rtdm_event_init(&t->rt_synch, 0);
 
@@ -481,11 +482,18 @@ static int rtswitch_create_ktask(rtswitch_context_t *ctx,
        return err;
 }
 
+static void rtswitch_utask_waker(rtdm_nrtsig_t sig, void *arg)
+{
+       rtswitch_context_t *ctx = (rtswitch_context_t *)arg;
+       up(&ctx->utask->nrt_synch);
+}
+
 static int rtswitch_open(struct rtdm_dev_context *context,
                         rtdm_user_info_t *user_info,
                         int oflags)
 {
        rtswitch_context_t *ctx = (rtswitch_context_t *) context->dev_private;
+       int err;
 
        ctx->tasks = NULL;
        ctx->tasks_count = ctx->next_index = ctx->cpu = ctx->switches_count = 0;
@@ -494,6 +502,10 @@ static int rtswitch_open(struct rtdm_dev_context *context,
        ctx->error.last_switch.from = ctx->error.last_switch.to = -1;
        ctx->pause_us = 0;
 
+       err = rtdm_nrtsig_init(&ctx->wake_utask, rtswitch_utask_waker, ctx);
+       if (err)
+               return err;
+
        rtdm_timer_init(&ctx->wake_up_delay, timed_wake_up, "switchtest timer");
 
        return 0;
@@ -518,6 +530,7 @@ static int rtswitch_close(struct rtdm_dev_context *context,
                kfree(ctx->tasks);
        }
        rtdm_timer_destroy(&ctx->wake_up_delay);
+       rtdm_nrtsig_destroy(&ctx->wake_utask);
 
        return 0;
 }
@@ -716,20 +729,10 @@ static struct rtdm_device device = {
        proc_name: device.device_name,
 };
 
-void rtswitch_utask_waker(rtdm_nrtsig_t sig, void *arg)
-{
-       up(&rtswitch_utask[xnarch_current_cpu()]->nrt_synch);
-}
-
 int __init __switchtest_init(void)
 {
        int err;
 
-       err = rtdm_nrtsig_init(&rtswitch_wake_utask,
-                              rtswitch_utask_waker, NULL);
-       if (err)
-               return err;
-
        do {
                snprintf(device.device_name, RTDM_MAX_DEVNAME_LEN, "rttest%d",
                         start_index);
@@ -744,7 +747,6 @@ int __init __switchtest_init(void)
 void __switchtest_exit(void)
 {
        rtdm_dev_unregister(&device, 1000);
-       rtdm_nrtsig_destroy(&rtswitch_wake_utask);
 }
 
 module_init(__switchtest_init);


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

Reply via email to