string device_dir;
string temp_str;
+ pthread_mutex_init(&plock, NULL);
type = device_type_param;
id = device_id_param;
if (direntry_param != NULL) {
}
W1Device::~W1Device() {
+ log_debug("started\n");
save_and_clean_cache();
- delete(reader);
+ if (reader != NULL) {
+ delete(reader);
+ reader = NULL;
+ }
}
string W1Device::get_name() {
if (name.empty() == true) {
cfg = DeviceConfig::get_device_config(id);
if (cfg != NULL) {
- name = cfg->get_cfg_value(DEVICE_CONFIG_VALUE_KEY__NAME);
+ name = cfg->get_config_value(DEVICE_CONFIG_VALUE_KEY__NAME);
delete(cfg);
}
}
name = name_param;
cfg = DeviceConfig::get_device_config(id);
if (cfg != NULL) {
- cfg->set_cfg_value(DEVICE_CONFIG_VALUE_KEY__NAME, name_param);
+ cfg->set_config_value(DEVICE_CONFIG_VALUE_KEY__NAME, name_param);
delete(cfg);
}
}
if (data != NULL) {
text = data->to_string();
cout << text << endl;
+ delete(data);
}
else {
type = get_type();
ret_val = new Data(vect, get_unit());
cache(ret_val);
delete(vect);
+ log_debug("%s returning new data\n", id.c_str());
}
else {
- // read old data already saved
+ // read old already saved data
+ log_debug("%s returning old saved data\n", id.c_str());
ret_val = reader->get_latest_data();
}
return ret_val;
}
-void W1Device::cache(Data *data) {
- // TODO: add mutex for memory_cache
+void W1Device::cache(Data *new_data) {
+ Data *data;
+ int dec_precision;
+
+ data = new_data->clone();
+ pthread_mutex_lock(&plock);
memory_cache.push_back(data);
if (memory_cache.size() > 5) {
- save_and_clean_cache();
+ dec_precision = get_data_decimal_precision();
+ StoreDay::save(id, &memory_cache, dec_precision);
+ while(memory_cache.empty() == false) {
+ data = memory_cache.back();
+ memory_cache.pop_back();
+ delete(data);
+ }
}
+ pthread_mutex_unlock(&plock);
}
void W1Device::save_and_clean_cache() {
- list<Data *>::iterator iter;
- Data *data;
- int dec_precision;
+ Data *data;
+ int dec_precision;
dec_precision = get_data_decimal_precision();
+ pthread_mutex_lock(&plock);
+ log_debug("memory cache size: %d\n", memory_cache.size());
StoreDay::save(id, &memory_cache, dec_precision);
- for(iter = memory_cache.begin(); iter != memory_cache.end(); iter++) {
- data = (Data *)*iter;
+ while(memory_cache.empty() == false) {
+ data = memory_cache.back();
+ memory_cache.pop_back();
delete(data);
}
- memory_cache.clear();
+ pthread_mutex_unlock(&plock);
}
-DataReader *W1Device::get_device_data() {
+const DataReader *W1Device::get_device_data() {
return reader;
}