X-Git-Url: http://pilppa.org/gitweb/?a=blobdiff_plain;f=src%2FW1Device.cc;h=0ee589845d75ba9ae0ecdddb142cded40c3beebf;hb=22f0b4dd0b81bce75ac7a842a72ca86eec02f7bc;hp=f2e85902c0c6e3afa1b75085beda15e5ba27c063;hpb=557fe3a639d7bd6fd146fdc9d573cf53bb2adff0;p=lib1wire.git diff --git a/src/W1Device.cc b/src/W1Device.cc index f2e8590..0ee5898 100644 --- a/src/W1Device.cc +++ b/src/W1Device.cc @@ -29,6 +29,7 @@ W1Device::W1Device(string device_id_param, string device_dir; string temp_str; + pthread_mutex_init(&plock, NULL); type = device_type_param; id = device_id_param; if (direntry_param != NULL) { @@ -47,8 +48,12 @@ W1Device::W1Device(string device_id_param, } W1Device::~W1Device() { + log_debug("started\n"); save_and_clean_cache(); - delete(reader); + if (reader != NULL) { + delete(reader); + reader = NULL; + } } string W1Device::get_name() { @@ -57,7 +62,7 @@ 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); } } @@ -71,7 +76,7 @@ void W1Device::set_name(string name_param) { 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); } } @@ -87,6 +92,7 @@ void W1Device::printout() { if (data != NULL) { text = data->to_string(); cout << text << endl; + delete(data); } else { type = get_type(); @@ -108,47 +114,60 @@ Data *W1Device::get_data() { Data *ret_val; vector *vect; - log_debug("get_data() started\n"); ret_val = NULL; vect = get_raw_data(); if (vect != NULL) { - log_debug("get_data() got raw data\n"); ret_val = new Data(vect, get_unit()); cache(ret_val); delete(vect); - log_debug("get_data() got raw data done\n"); + log_debug("%s returning new data\n", id.c_str()); } else { - log_debug("get_data() try to read old already saved data\n"); - // 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(); - log_debug("get_data() try to read old already saved data done\n"); } 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::iterator iter; - Data *data; - int dec_precision; + Data *data; + int dec_precision; dec_precision = get_data_decimal_precision(); + pthread_mutex_lock(&plock); + /* needs to be casted to long unsigned int value is "unsigned int" in some + toolchains and that would otherwise cause an warning/error + */ + log_debug("memory cache size: %lu\n", (long unsigned int)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; }