ralloc: Hook up C++ destructors to ralloc when necessary.
This patch makes sure that class destructors are called as they should be when a C++ object allocated by ralloc is released. Based on a previous patch by Kenneth Graunke, but it doesn't exhibit the ~0.8% performance regression in shader compilation times because we now use the HAS_TRIVIAL_DESTRUCTOR() macro to detect the typical case where the indirect function call can be avoided because the object's destructor doesn't need to do anything. Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
@@ -415,15 +415,29 @@ bool ralloc_vasprintf_append(char **str, const char *fmt, va_list args);
|
||||
* which is more idiomatic in C++ than calling ralloc.
|
||||
*/
|
||||
#define DECLARE_RALLOC_CXX_OPERATORS(TYPE) \
|
||||
private: \
|
||||
static void _ralloc_destructor(void *p) \
|
||||
{ \
|
||||
reinterpret_cast<TYPE *>(p)->~TYPE(); \
|
||||
} \
|
||||
public: \
|
||||
static void* operator new(size_t size, void *mem_ctx) \
|
||||
{ \
|
||||
void *p = ralloc_size(mem_ctx, size); \
|
||||
assert(p != NULL); \
|
||||
if (!HAS_TRIVIAL_DESTRUCTOR(TYPE)) \
|
||||
ralloc_set_destructor(p, _ralloc_destructor); \
|
||||
return p; \
|
||||
} \
|
||||
\
|
||||
static void operator delete(void *p) \
|
||||
{ \
|
||||
/* The object's destructor is guaranteed to have already been \
|
||||
* called by the delete operator at this point -- Make sure it's \
|
||||
* not called again. \
|
||||
*/ \
|
||||
if (!HAS_TRIVIAL_DESTRUCTOR(TYPE)) \
|
||||
ralloc_set_destructor(p, NULL); \
|
||||
ralloc_free(p); \
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user