summaryrefslogtreecommitdiffstats
path: root/src/Runtime/Source/system/Qt3DSMemory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Runtime/Source/system/Qt3DSMemory.cpp')
-rw-r--r--src/Runtime/Source/system/Qt3DSMemory.cpp137
1 files changed, 137 insertions, 0 deletions
diff --git a/src/Runtime/Source/system/Qt3DSMemory.cpp b/src/Runtime/Source/system/Qt3DSMemory.cpp
new file mode 100644
index 00000000..17fa5c86
--- /dev/null
+++ b/src/Runtime/Source/system/Qt3DSMemory.cpp
@@ -0,0 +1,137 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "SystemPrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSMemory.h"
+
+//==============================================================================
+// OS level memory routines
+//==============================================================================
+Q3DStudio::CMemory::TMalloc Q3DStudio::CMemory::s_Malloc = NULL;
+Q3DStudio::CMemory::TRealloc Q3DStudio::CMemory::s_Realloc = NULL;
+Q3DStudio::CMemory::TFree Q3DStudio::CMemory::s_Free = NULL;
+
+//==============================================================================
+/**
+ * Overrides basic memory allocation/deallocation routines
+ * @param inMalloc memory allocation routine
+ * @param inFree memory deallocation routine
+ * @param inRealloc memory reallocation routine
+ */
+void Q3DStudio::CMemory::SetMemoryFunctions(const TMalloc inMalloc, const TFree inFree,
+ const TRealloc inRealloc)
+{
+ s_Malloc = inMalloc;
+ s_Realloc = inRealloc;
+ s_Free = inFree;
+}
+
+static Q3DStudio::CMemoryManager *s_globalManager = nullptr;
+static Q3DStudio::CMemoryHeap *s_globalHeap = nullptr;
+
+//==============================================================================
+/**
+ * Boot up the pooled memory manager and return it.
+ * @note The manager has to be initialized before use:
+ * GetMemoryManager( ).Initialize( "GlobalManager", g_ChunkSize, g_ChunkCount );
+ * @return Q3DStudio::CMemoryManager reference to the global object
+ */
+Q3DStudio::CMemoryManager &GetMemoryManager()
+{
+ if (!s_globalManager)
+ s_globalManager = new Q3DStudio::CMemoryManager;
+ return *s_globalManager;
+}
+
+//==============================================================================
+/**
+ * Return a reference to the global heap object.
+ * @return Q3DStudio::CMemoryHeap reference to the global object
+ */
+Q3DStudio::CMemoryHeap &GetMemoryHeap()
+{
+ if (!s_globalHeap)
+ s_globalHeap = new Q3DStudio::CMemoryHeap;
+ return *s_globalHeap;
+}
+
+//==============================================================================
+// Q3DStudio_new operator prototypes (5 args)
+//==============================================================================
+void *operator new(size_t inReportedSize, size_t inOfficialSize, const char *inType,
+ const char *inFile, int inLine)
+{
+ Q3DStudio_UNREFERENCED_PARAMETER(inReportedSize);
+ Q3DStudio_ASSERT(inReportedSize == inOfficialSize);
+
+ return Q3DStudio_HANDLER_NEW.Allocate(static_cast<const Q3DStudio::INT32>(inOfficialSize),
+ inType, inFile, inLine);
+}
+
+//==============================================================================
+/**
+ * Override 'operator delete' in order to track memory usage.
+ *
+ * So what's the use of the overloaded delete with special arguments? There is
+ * actually one case in which it will be called--when an exception is thrown
+ * during object construction. As you might recall, there is a contract implicit
+ * in the language that if an exception happens during the construction of an object,
+ * the memory for this object will be automatically deallocated. It so happens
+ * that during object's construction the compiler is still aware of which version
+ * of operator new was called to allocate memory. It is therefore able to generate
+ * a call to the corresponding version of delete, in case an exception is thrown.
+ * After the successful completion of construction, this information is no longer
+ * available and the compiler has no means to guess which version of global delete
+ * is appropriate for a given object.
+ */
+void operator delete(void *inReportedAddress, size_t inOfficialSize, const char *, const char *,
+ int)
+{
+ Q3DStudio_HANDLER_NEW.Free(inReportedAddress,
+ static_cast<const Q3DStudio::INT32>(inOfficialSize));
+}
+
+//==============================================================================
+// Q3DStudio_virtual_new operators (4 args)
+//==============================================================================
+void *operator new(size_t inReportedSize, const char *inType, const char *inFile, int inLine)
+{
+ return Q3DStudio::CMemoryFilter::Allocate(static_cast<Q3DStudio::INT32>(inReportedSize), inType,
+ inFile, inLine, false);
+}
+
+void operator delete(void *inReportedAddress, const char *, const char *, int)
+{
+ Q3DStudio::CMemoryFilter::Free(inReportedAddress);
+}