X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Flib%2Fnet%2Fdip%2FDisseminatorP.nc;h=b7b67a9f8a6663f5c462dd4c11271e05c788ff5a;hb=7d26c9416bd4638c8a25469579bd39c852da7317;hp=b3c2ed1b824de43aa4242c90c2e1aa243bf2a1de;hpb=d4004c0977484ccaf409f5a78c7ede4e7767b788;p=tinyos-2.x.git diff --git a/tos/lib/net/dip/DisseminatorP.nc b/tos/lib/net/dip/DisseminatorP.nc index b3c2ed1b..b7b67a9f 100644 --- a/tos/lib/net/dip/DisseminatorP.nc +++ b/tos/lib/net/dip/DisseminatorP.nc @@ -57,11 +57,11 @@ generic module DisseminatorP(typedef t, dip_key_t key) { } implementation { dip_data_t valueCache; - + task void signalNewData() { signal AppDisseminationValue.changed(); } - + command error_t Init.init() { call DipHelp.registerKey(key); return SUCCESS; @@ -77,6 +77,8 @@ implementation { command void AppDisseminationValue.set( const t* val ) { memcpy( &valueCache, val, sizeof(t) ); + // must signal here instead of posting task to prevent race condition + signal AppDisseminationValue.changed(); } command void AppDisseminationUpdate.change( t* newVal ) { @@ -85,6 +87,7 @@ implementation { /* DipLogicC doesn't care what the data actually is, it just wants the key, so we cast it recklessly */ call DipDisseminationUpdate.change((dip_data_t*)newVal); + post signalNewData(); } command const dip_data_t* DataDisseminationValue.get() { @@ -95,7 +98,7 @@ implementation { command void DataDisseminationUpdate.change( dip_data_t* newVal ) { memcpy( &valueCache, newVal, sizeof(dip_data_t) ); - //post signalNewData(); + // don't post the task, this came from the network signal AppDisseminationValue.changed(); }