]> oss.titaniummirror.com Git - tinyos-2.x.git/commitdiff
Use SystemCallC to pass control to the TinyOS thread
authorliang_mike <liang_mike>
Tue, 10 Feb 2009 03:42:45 +0000 (03:42 +0000)
committerliang_mike <liang_mike>
Tue, 10 Feb 2009 03:42:45 +0000 (03:42 +0000)
tos/lib/tosthreads/lib/net/BlockingCollectionControlC.nc
tos/lib/tosthreads/lib/net/BlockingCollectionControlP.nc

index e7b2182260dc26d879d8e06400ed53aeb809fb7a..4a775542d70e067c5e9bd0c4bb139e16a21fb9c2 100644 (file)
@@ -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;
 }
index b2d920af885872a2b0cd6f5c3d248abe90f9ccd8..1bb62b19fe4d89e9570613f3da4141515c561539 100644 (file)
 
 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();
   }
 }