Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen Bakker <jeroen@blender.org>2021-03-24 13:56:58 +0300
committerJeroen Bakker <jeroen@blender.org>2021-03-24 13:57:04 +0300
commit26b45448abf05dc709678cb821201b0721a51d76 (patch)
tree9acb173b1bf0deae7a43977543c64fbeb24ea888 /source/blender/compositor/intern/COM_WorkScheduler.cc
parent715c7462969e6075859f44a64bb4eb68d056345b (diff)
Fix: Memory Leak When Using Compositor.
When using the compositor inlined static vectors could allocate memory. This memory wasn't freed. This patch would make them inline again.
Diffstat (limited to 'source/blender/compositor/intern/COM_WorkScheduler.cc')
-rw-r--r--source/blender/compositor/intern/COM_WorkScheduler.cc10
1 files changed, 6 insertions, 4 deletions
diff --git a/source/blender/compositor/intern/COM_WorkScheduler.cc b/source/blender/compositor/intern/COM_WorkScheduler.cc
index 2bc3ff936b1..56956b9d097 100644
--- a/source/blender/compositor/intern/COM_WorkScheduler.cc
+++ b/source/blender/compositor/intern/COM_WorkScheduler.cc
@@ -284,12 +284,13 @@ static void opencl_deinitialize()
{
/* Deinitialize OpenCL GPU's. */
if (g_work_scheduler.opencl.initialized) {
- Device *device;
while (!g_work_scheduler.opencl.devices.is_empty()) {
- device = g_work_scheduler.opencl.devices.pop_last();
+ Device *device = g_work_scheduler.opencl.devices.pop_last();
device->deinitialize();
delete device;
}
+ g_work_scheduler.opencl.devices.clear_and_make_inline();
+
if (g_work_scheduler.opencl.program) {
clReleaseProgram(g_work_scheduler.opencl.program);
g_work_scheduler.opencl.program = nullptr;
@@ -397,12 +398,13 @@ static void threading_model_queue_deinitialize()
{
/* deinitialize CPU threads */
if (g_work_scheduler.queue.initialized) {
- Device *device;
while (!g_work_scheduler.queue.devices.is_empty()) {
- device = g_work_scheduler.queue.devices.pop_last();
+ Device *device = g_work_scheduler.queue.devices.pop_last();
device->deinitialize();
delete device;
}
+ g_work_scheduler.queue.devices.clear_and_make_inline();
+
BLI_thread_local_delete(g_thread_device);
g_work_scheduler.queue.initialized = false;
}