layers: Fix object tracker memory leak
authorMike Schuchardt <mikes@lunarg.com>
Tue, 13 Dec 2016 21:04:57 +0000 (14:04 -0700)
committerMike Schuchardt <mikes@lunarg.com>
Wed, 14 Dec 2016 20:01:42 +0000 (13:01 -0700)
Upon repeated calls, GetDisplayPlaneSupportedDisplaysKHR will call
CreateObject multiple times with the same VkDisplayKHR handle.  Add a
check in CreateObject for an existing tracking object before allocating
a new one.

Change-Id: I50f634fbe8b7e69edbfeb4e6f0c050b7fccaa6e4

layers/object_tracker.cpp

index 0f2a2d6..fc68e12 100644 (file)
@@ -263,17 +263,20 @@ static void CreateObject(T1 dispatchable_object, T2 object, VkDebugReportObjectT
     auto object_handle = handle_value(object);
     bool custom_allocator = pAllocator != nullptr;
 
-    log_msg(instance_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type, object_handle,
-            __LINE__, OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
-            object_name[object_type], object_handle);
+    if (!instance_data->object_map[object_type].count(object_handle)) {
+        log_msg(instance_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type, object_handle, __LINE__,
+                OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
+                object_name[object_type], object_handle);
 
-    OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
-    pNewObjNode->object_type = object_type;
-    pNewObjNode->status = custom_allocator ? OBJSTATUS_CUSTOM_ALLOCATOR : OBJSTATUS_NONE;
-    pNewObjNode->handle = object_handle;
-    instance_data->object_map[object_type][object_handle] = pNewObjNode;
-    instance_data->num_objects[object_type]++;
-    instance_data->num_total_objects++;
+        OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
+        pNewObjNode->object_type = object_type;
+        pNewObjNode->status = custom_allocator ? OBJSTATUS_CUSTOM_ALLOCATOR : OBJSTATUS_NONE;
+        pNewObjNode->handle = object_handle;
+
+        instance_data->object_map[object_type][object_handle] = pNewObjNode;
+        instance_data->num_objects[object_type]++;
+        instance_data->num_total_objects++;
+    }
 }
 
 template <typename T1, typename T2>