From d84f3cb3ee4efafa82aef3525920ce6868096625 Mon Sep 17 00:00:00 2001 From: Andraz Tori Date: Wed, 31 May 2006 19:05:26 +0000 Subject: [PATCH] r811: Small memory managmenet fixes all over the place - adding another method to arraylist for object deletions (free) - usage of this method - some delete / delete[] mismatches... --- cinelerra/audioalsa.C | 1 + cinelerra/batchrender.C | 3 +- cinelerra/fileogg.C | 1 + cinelerra/packagedispatcher.C | 8 ++-- cinelerra/packagerenderer.C | 2 +- cinelerra/packagingengine.C | 1 + cinelerra/preferences.C | 1 + guicast/arraylist.h | 102 +++++++++++++++++++++++++++++++++--------- 8 files changed, 90 insertions(+), 29 deletions(-) diff --git a/cinelerra/audioalsa.C b/cinelerra/audioalsa.C index b9529557..b87bc145 100644 --- a/cinelerra/audioalsa.C +++ b/cinelerra/audioalsa.C @@ -42,6 +42,7 @@ void AudioALSA::list_devices(ArrayList *devices, int pcm_title) #define DEFAULT_DEVICE "default" char *result = new char[strlen(DEFAULT_DEVICE) + 1]; devices->append(result); + devices->set_array_delete(); // since we are allocating by new[] strcpy(result, DEFAULT_DEVICE); while(snd_card_next(&card) >= 0) diff --git a/cinelerra/batchrender.C b/cinelerra/batchrender.C index d930bdde..c8d4a214 100644 --- a/cinelerra/batchrender.C +++ b/cinelerra/batchrender.C @@ -500,8 +500,7 @@ void BatchRenderThread::start_rendering(char *config_path, plugindb); int result = ConfirmSave::test_files(0, &paths); - for (int i = 0; i < paths.total; i++) - free(paths.values[i]); + paths.remove_all_objects(); // Abort on any existing file because it's so hard to set this up. if(result) return; diff --git a/cinelerra/fileogg.C b/cinelerra/fileogg.C index 9c03d020..d77bc332 100644 --- a/cinelerra/fileogg.C +++ b/cinelerra/fileogg.C @@ -2436,6 +2436,7 @@ void PackagingEngineOGG::get_package_paths(ArrayList *path_list) } // We will mux to the the final file at the end! path_list->append(strdup(default_asset->path)); + path_list->set_free(); } int64_t PackagingEngineOGG::get_progress_max() diff --git a/cinelerra/packagedispatcher.C b/cinelerra/packagedispatcher.C index 561a336f..df363ed7 100644 --- a/cinelerra/packagedispatcher.C +++ b/cinelerra/packagedispatcher.C @@ -202,8 +202,7 @@ int PackageDispatcher::create_packages(MWindow *mwindow, ArrayList paths; get_package_paths(&paths); result = ConfirmSave::test_files(mwindow, &paths); - for (int i = 0; i < paths.total; i++) - free(paths.values[i]); + paths.remove_all_objects(); } return result; @@ -214,9 +213,10 @@ void PackageDispatcher::get_package_paths(ArrayList *path_list) if (strategy == SINGLE_PASS_FARM) packaging_engine->get_package_paths(path_list); else - for(int i = 0; i < total_allocated; i++) { - path_list->append(strdup(packages[i]->path)); + for(int i = 0; i < total_allocated; i++) + path_list->append(strdup(packages[i]->path)); + path_list->set_free(); } } diff --git a/cinelerra/packagerenderer.C b/cinelerra/packagerenderer.C index c7923749..2fdde098 100644 --- a/cinelerra/packagerenderer.C +++ b/cinelerra/packagerenderer.C @@ -711,7 +711,7 @@ int PackageRenderer::direct_frame_copy(EDL *edl, temp_output[0] = new VFrame*[1]; temp_output[0][0] = compressed_output; error = file->write_frames(temp_output, 1); - delete temp_output[0]; + delete [] temp_output[0]; delete temp_output; } } diff --git a/cinelerra/packagingengine.C b/cinelerra/packagingengine.C index 64f95e5d..9c94a968 100644 --- a/cinelerra/packagingengine.C +++ b/cinelerra/packagingengine.C @@ -179,6 +179,7 @@ void PackagingEngineDefault::get_package_paths(ArrayList *path_list) { path_list->append(strdup(packages[i]->path)); } + path_list->set_free(); } int64_t PackagingEngineDefault::get_progress_max() diff --git a/cinelerra/preferences.C b/cinelerra/preferences.C index a36099b6..628201b8 100644 --- a/cinelerra/preferences.C +++ b/cinelerra/preferences.C @@ -318,6 +318,7 @@ void Preferences::add_node(char *text, int port, int enabled, float rate) char *new_item = new char[strlen(text) + 1]; strcpy(new_item, text); renderfarm_nodes.append(new_item); + renderfarm_nodes.set_array_delete(); renderfarm_ports.append(port); renderfarm_enabled.append(enabled); renderfarm_rate.append(rate); diff --git a/guicast/arraylist.h b/guicast/arraylist.h index ac7f4d0f..e03932f8 100644 --- a/guicast/arraylist.h +++ b/guicast/arraylist.h @@ -2,11 +2,13 @@ #define ARRAYLIST_H #include +#include // designed for lists of track numbers -#include - +#define ARRAYLIST_REMOVEOBJECT_DELETE 0 +#define ARRAYLIST_REMOVEOBJECT_DELETEARRAY 1 +#define ARRAYLIST_REMOVEOBJECT_FREE 2 template class ArrayList @@ -39,7 +41,9 @@ public: // Remove pointer and objects for each array entry void remove_all_objects(); TYPE last(); + void set_array_delete(); + void set_free(); void sort(); @@ -48,7 +52,7 @@ public: private: int available; - int array_delete; + int removeobject_type; }; template @@ -56,7 +60,7 @@ ArrayList::ArrayList() { total = 0; available = 16; - array_delete = 0; + removeobject_type = ARRAYLIST_REMOVEOBJECT_DELETE; values = new TYPE[available]; } @@ -72,7 +76,15 @@ ArrayList::~ArrayList() template void ArrayList::set_array_delete() { - array_delete = 1; + removeobject_type = ARRAYLIST_REMOVEOBJECT_DELETEARRAY; + +} + +template +void ArrayList::set_free() +{ + removeobject_type = ARRAYLIST_REMOVEOBJECT_FREE; + } @@ -160,10 +172,21 @@ template void ArrayList::remove_object(TYPE value) // remove value from anywhere in list { remove(value); - if (array_delete) - delete [] value; - else - delete value; + switch (removeobject_type) + { + case ARRAYLIST_REMOVEOBJECT_DELETE: + delete value; + break; + case ARRAYLIST_REMOVEOBJECT_DELETEARRAY: + delete [] value; + break; + case ARRAYLIST_REMOVEOBJECT_FREE: + free(value); + break; + default: + printf("Unknown function to use to free array\n"); + break; + } } template @@ -171,10 +194,22 @@ void ArrayList::remove_object_number(int number) { if(number < total) { - if (array_delete) - delete [] values[number]; - else - delete values[number]; + switch (removeobject_type) + { + case ARRAYLIST_REMOVEOBJECT_DELETE: + delete values[number]; + break; + case ARRAYLIST_REMOVEOBJECT_DELETEARRAY: + delete [] values[number]; + break; + case ARRAYLIST_REMOVEOBJECT_FREE: + free(values[number]); + break; + default: + printf("Unknown function to use to free array\n"); + break; + } + remove_number(number); } else @@ -183,14 +218,26 @@ void ArrayList::remove_object_number(int number) template -void ArrayList::remove_object() // remove value from anywhere in list +void ArrayList::remove_object() // remove last object from array { if(total) { - if (array_delete) - delete [] values[total - 1]; - else - delete values[total - 1]; + switch (removeobject_type) + { + case ARRAYLIST_REMOVEOBJECT_DELETE: + delete values[total - 1]; + break; + case ARRAYLIST_REMOVEOBJECT_DELETEARRAY: + delete [] values[total -1]; + break; + case ARRAYLIST_REMOVEOBJECT_FREE: + free(values[total - 1]); + break; + default: + printf("Unknown function to use to free array\n"); + break; + } + remove(); } else @@ -227,10 +274,21 @@ void ArrayList::remove_all_objects() //printf("ArrayList::remove_all_objects 1 %d\n", total); for(int i = 0; i < total; i++) { - if(array_delete) - delete [] values[i]; - else - delete values[i]; + switch (removeobject_type) + { + case ARRAYLIST_REMOVEOBJECT_DELETE: + delete values[i]; + break; + case ARRAYLIST_REMOVEOBJECT_DELETEARRAY: + delete [] values[i]; + break; + case ARRAYLIST_REMOVEOBJECT_FREE: + free(values[i]); + break; + default: + printf("Unknown function to use to free array\n"); + break; + } } total = 0; } -- 2.11.4.GIT