Make sure resource records are deleted as most specific type

* Don't need to use a virtual destructor as the information is already
  in the templated resource manager
This commit is contained in:
baldurk
2015-10-29 01:16:15 +01:00
parent 63e0cc3f39
commit 25c5de8c85
2 changed files with 11 additions and 1 deletions
+1 -1
View File
@@ -95,7 +95,7 @@ void ResourceRecord::Delete(ResourceRecordHandler *mgr)
if(ResID != ResourceId())
mgr->RemoveResourceRecord(ResID);
delete this;
mgr->DestroyResourceRecord(this);
}
}
+10
View File
@@ -61,6 +61,8 @@ namespace ResourceIDGen
void SetReplayResourceIDs();
};
struct ResourceRecord;
class ResourceRecordHandler
{
public:
@@ -68,6 +70,7 @@ class ResourceRecordHandler
virtual void MarkPendingDirty(ResourceId id) = 0;
virtual void RemoveResourceRecord(ResourceId id) = 0;
virtual void MarkResourceFrameReferenced(ResourceId id, FrameRefType refType) = 0;
virtual void DestroyResourceRecord(ResourceRecord *record) = 0;
};
// This is a generic resource record, that APIs can inherit from and use.
@@ -324,6 +327,7 @@ class ResourceManager : public ResourceRecordHandler
bool HasResourceRecord(ResourceId id);
RecordType *AddResourceRecord(ResourceId id);
inline void RemoveResourceRecord(ResourceId id);
void DestroyResourceRecord(ResourceRecord *record);
// while capturing or replaying, resources and their live IDs
void AddCurrentResource(ResourceId id, WrappedResourceType res);
@@ -1096,6 +1100,12 @@ void ResourceManager<WrappedResourceType, RealResourceType, RecordType>::RemoveR
m_ResourceRecords.erase(id);
}
template<typename WrappedResourceType, typename RealResourceType, typename RecordType>
void ResourceManager<WrappedResourceType, RealResourceType, RecordType>::DestroyResourceRecord(ResourceRecord *record)
{
delete (RecordType *)record;
}
template<typename WrappedResourceType, typename RealResourceType, typename RecordType>
bool ResourceManager<WrappedResourceType, RealResourceType, RecordType>::AddWrapper(WrappedResourceType wrap, RealResourceType real)
{