From 13ab290504db523b7f121e22ce4f7e6491c8ebeb Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sun, 3 Aug 2003 18:37:21 +0000 Subject: [PATCH] Fixed a potential memory leak. If any operation prior to the addition of the job queue to the manager failed, it wouldn't be deleted. Now the job generator deletes it by default and must be told via DetachJobQueue() to not do that. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@4222 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../disk_device_manager/KDiskDeviceJobGenerator.cpp | 10 ++++++++++ .../core/disk_device_manager/KDiskDeviceJobGenerator.h | 2 ++ .../disk_device_manager/ddm_userland_interface.cpp | 4 +++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/kernel/core/disk_device_manager/KDiskDeviceJobGenerator.cpp b/src/kernel/core/disk_device_manager/KDiskDeviceJobGenerator.cpp index 79ba397eed..0e97251ca7 100644 --- a/src/kernel/core/disk_device_manager/KDiskDeviceJobGenerator.cpp +++ b/src/kernel/core/disk_device_manager/KDiskDeviceJobGenerator.cpp @@ -45,6 +45,7 @@ KDiskDeviceJobGenerator::~KDiskDeviceJobGenerator() { delete[] fMoveInfos; delete[] fPartitionIDs; + delete fJobQueue; } // JobFactory @@ -68,6 +69,15 @@ KDiskDeviceJobGenerator::JobQueue() const return fJobQueue; } +// DetachJobQueue +KDiskDeviceJobQueue * +KDiskDeviceJobGenerator::DetachJobQueue() +{ + KDiskDeviceJobQueue *jobQueue = fJobQueue; + fJobQueue = NULL; + return jobQueue; +} + // GenerateJobs status_t KDiskDeviceJobGenerator::GenerateJobs() diff --git a/src/kernel/core/disk_device_manager/KDiskDeviceJobGenerator.h b/src/kernel/core/disk_device_manager/KDiskDeviceJobGenerator.h index 9202f05f2a..3338a646f8 100644 --- a/src/kernel/core/disk_device_manager/KDiskDeviceJobGenerator.h +++ b/src/kernel/core/disk_device_manager/KDiskDeviceJobGenerator.h @@ -27,6 +27,8 @@ public: KDiskDevice *Device() const; KDiskDeviceJobQueue *JobQueue() const; + KDiskDeviceJobQueue *DetachJobQueue(); + status_t GenerateJobs(); private: diff --git a/src/kernel/core/disk_device_manager/ddm_userland_interface.cpp b/src/kernel/core/disk_device_manager/ddm_userland_interface.cpp index ea52580b74..5f954e227e 100644 --- a/src/kernel/core/disk_device_manager/ddm_userland_interface.cpp +++ b/src/kernel/core/disk_device_manager/ddm_userland_interface.cpp @@ -1230,7 +1230,9 @@ _kern_commit_disk_device_modifications(partition_id deviceID, port_id port, // add the jobs to the manager if (ManagerLocker locker2 = manager) { error = manager->AddJobQueue(generator.JobQueue()); - if (error != B_OK) + if (error == B_OK) + generator.DetachJobQueue(); + else return error; } else return B_ERROR;