From 1a81ad6e619bb7803f151a2f4d025366e7e73604 Mon Sep 17 00:00:00 2001 From: liang_mike Date: Tue, 10 Feb 2009 03:42:45 +0000 Subject: [PATCH] Use SystemCallC to pass control to the TinyOS thread --- .../lib/net/BlockingCollectionControlC.nc | 8 +++- .../lib/net/BlockingCollectionControlP.nc | 45 +++++++++++++++++-- 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/tos/lib/tosthreads/lib/net/BlockingCollectionControlC.nc b/tos/lib/tosthreads/lib/net/BlockingCollectionControlC.nc index e7b21822..4a775542 100644 --- a/tos/lib/tosthreads/lib/net/BlockingCollectionControlC.nc +++ b/tos/lib/tosthreads/lib/net/BlockingCollectionControlC.nc @@ -32,11 +32,15 @@ configuration BlockingCollectionControlC { } implementation { - components BlockingCollectionControlP, - CollectionC as Collector; + components CollectionC as Collector, + SystemCallC, + MutexC, + BlockingCollectionControlP; RoutingControl = BlockingCollectionControlP.BlockingStdControl; RootControl = Collector; BlockingCollectionControlP.RoutingControl -> Collector.StdControl; + BlockingCollectionControlP.SystemCall -> SystemCallC; + BlockingCollectionControlP.Mutex -> MutexC; } diff --git a/tos/lib/tosthreads/lib/net/BlockingCollectionControlP.nc b/tos/lib/tosthreads/lib/net/BlockingCollectionControlP.nc index b2d920af..1bb62b19 100644 --- a/tos/lib/tosthreads/lib/net/BlockingCollectionControlP.nc +++ b/tos/lib/tosthreads/lib/net/BlockingCollectionControlP.nc @@ -26,22 +26,59 @@ module BlockingCollectionControlP { provides { - interface BlockingStdControl; + interface BlockingStdControl; + interface Init; } uses { interface StdControl as RoutingControl; + interface SystemCall; + interface Mutex; } } implementation { - command error_t BlockingStdControl.start() + typedef struct params { + error_t error; + } params_t; + + syscall_t* start_call = NULL; + mutex_t my_mutex; + + command error_t Init.init() { - return call RoutingControl.start(); + call Mutex.init(&my_mutex); + return SUCCESS; } - command error_t BlockingStdControl.stop() + void startTask(syscall_t* s) { + params_t* p = s->params; + p->error = call RoutingControl.start(); + call SystemCall.finish(s); + } + + command error_t BlockingStdControl.start() + { + syscall_t s; + params_t p; + + call Mutex.lock(&my_mutex); + if (start_call == NULL) { + start_call = &s; + call SystemCall.start(&startTask, &s, INVALID_ID, &p); + start_call = NULL; + } else { + p.error = EBUSY; + } + + atomic { + call Mutex.unlock(&my_mutex); + return p.error; + } + } + + command error_t BlockingStdControl.stop() { return call RoutingControl.stop(); } } -- 2.39.2