]> pilppa.org Git - lib1wire.git/blobdiff - src/W1Device.cc
Memory leak fixes.
[lib1wire.git] / src / W1Device.cc
index f2e85902c0c6e3afa1b75085beda15e5ba27c063..4a83c20b95970f0f352e8d95391910f0827841a5 100644 (file)
@@ -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("W1Device destructor\n");
        save_and_clean_cache();
-       delete(reader);
+       if (reader != NULL) {
+               delete(reader);
+               reader  = NULL;
+       }
 }
 
 string W1Device::get_name() {
@@ -87,6 +92,7 @@ void W1Device::printout() {
        if (data != NULL) {
                text    = data->to_string();
                cout << text << endl;
+               delete(data);
        }
        else {
                type    = get_type();
@@ -127,28 +133,41 @@ Data *W1Device::get_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("save_and_clean_cache(): 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;
 }