}
implementation {
dip_data_t valueCache;
-
+
task void signalNewData() {
signal AppDisseminationValue.changed();
}
-
+
command error_t Init.init() {
call DipHelp.registerKey(key);
return SUCCESS;
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 ) {
/* 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() {
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();
}