diff --git a/pclsync/ppathstatus.c b/pclsync/ppathstatus.c index f0a914a..854b331 100644 --- a/pclsync/ppathstatus.c +++ b/pclsync/ppathstatus.c @@ -135,6 +135,7 @@ static psync_tree *folder_tasks = PSYNC_TREE_EMPTY; static void sync_data_free(sync_data_t *sd); static void load_sync_tasks(); +static void free_folder_tasks_node(folder_tasks_t *ft); static inline int psync_crypto_is_error(const void *ptr) { return (uintptr_t)ptr <= PSYNC_CRYPTO_MAX_ERROR; @@ -162,7 +163,7 @@ void ppathstatus_init() { psync_list_add_tail(&parent_cache_lru, &parent_cache_entries[i].list_lru); psync_list_add_tail(&cache_free, &parent_cache_entries[i].list_hash); } - ptree_for_each_element_call_safe(folder_tasks, folder_tasks_t, tree, free); + ptree_for_each_element_call_safe(folder_tasks, folder_tasks_t, tree, free_folder_tasks_node); folder_tasks = PSYNC_TREE_EMPTY; ptree_for_each_element_call_safe(sync_data, sync_data_t, tree, sync_data_free); @@ -301,6 +302,12 @@ static void free_folder_tasks(folder_tasks_t *ft) { pmem_free(PMEM_SUBSYS_OTHER, ft); } +/* Free a folder_tasks_t node allocated via pmem_malloc. Used as the callback + * for ptree_for_each_element_call_safe when bulk-freeing a tree. */ +static void free_folder_tasks_node(folder_tasks_t *ft) { + pmem_free(PMEM_SUBSYS_OTHER, ft); +} + static psync_folderid_t get_parent_folder(psync_folderid_t folderid) { psync_sql_res *res; psync_uint_row row; @@ -447,7 +454,7 @@ void ppathstatus_fldr_deleted(psync_folderid_t folderid) { } static void sync_data_free(sync_data_t *sd) { - ptree_for_each_element_call_safe(sd->folder_tasks, folder_tasks_t, tree, free); + ptree_for_each_element_call_safe(sd->folder_tasks, folder_tasks_t, tree, free_folder_tasks_node); pmem_free(PMEM_SUBSYS_OTHER, sd); } diff --git a/pclsync/psyncer.c b/pclsync/psyncer.c index c4d1ca7..e914cdf 100644 --- a/pclsync/psyncer.c +++ b/pclsync/psyncer.c @@ -67,6 +67,12 @@ static psync_tree *psync_new_sd_folder(psync_folderid_t folderid) { return &f->tree; } +/* Free a synced_down_folder node allocated via pmem_malloc. Used as the + * callback for ptree_for_each_element_call_safe when bulk-freeing the tree. */ +static void free_synced_down_folder(synced_down_folder *f) { + pmem_free(PMEM_SUBSYS_OTHER, f); +} + static void psync_add_folder_to_downloadlist_locked(psync_folderid_t folderid) { synced_down_folder *f; if (!synced_down_folders) { @@ -127,7 +133,7 @@ void psyncer_dl_queue_del(psync_folderid_t folderid) { void psyncer_dl_queue_clear() { pthread_mutex_lock(&sync_down_mutex); - ptree_for_each_element_call_safe(synced_down_folders, synced_down_folder, tree, free); + ptree_for_each_element_call_safe(synced_down_folders, synced_down_folder, tree, free_synced_down_folder); synced_down_folders = PSYNC_TREE_EMPTY; pthread_mutex_unlock(&sync_down_mutex); }