summaryrefslogtreecommitdiff
path: root/src/misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/misc.c')
-rw-r--r--src/misc.c107
1 files changed, 107 insertions, 0 deletions
diff --git a/src/misc.c b/src/misc.c
new file mode 100644
index 0000000..5ea67cd
--- /dev/null
+++ b/src/misc.c
@@ -0,0 +1,107 @@
+//
+// AUTHOR
+// N. Nielsen
+//
+// VERSION
+// 0.7
+//
+// LICENSE
+// This software is in the public domain.
+//
+// The software is provided "as is", without warranty of any kind,
+// express or implied, including but not limited to the warranties
+// of merchantability, fitness for a particular purpose, and
+// noninfringement. In no event shall the author(s) be liable for any
+// claim, damages, or other liability, whether in an action of
+// contract, tort, or otherwise, arising from, out of, or in connection
+// with the software or the use or other dealings in the software.
+//
+// SUPPORT
+// Send bug reports to: <nielsen@memberwebs.com>
+//
+
+
+#include "memref.h"
+#include "malloc.h"
+#include "assert.h"
+
+// WARNING!! Not thread safe or very efficient for large
+// amounts of memory allocations
+
+const size_t kRefSig = 0x1F2F3F4F;
+
+void* _refalloc_dbg(size_t sz)
+{
+ // Allocate extra counter value before memory
+ size_t* pMem = (size_t*)malloc(sz * sizeof(size_t) * 2);
+
+ if(pMem)
+ {
+ pMem[0] = kRefSig;
+ pMem[1] = 1;
+ return pMem + 2;
+ }
+
+ return pMem;
+}
+
+void* _refalloc(size_t sz)
+{
+ // Allocate extra counter value before memory
+ size_t* pMem = (size_t*)malloc(sz * sizeof(size_t) * 1);
+
+ if(pMem)
+ {
+ pMem[0] = 1;
+ return pMem + 1;
+ }
+
+ return pMem;
+}
+
+void* _refadd_dbg(void* pBuff)
+{
+ if(pBuff)
+ {
+ // Increment the counter value
+ size_t* pMem = (size_t*)pBuff - 2;
+ assert(pMem[0] = kRefSig);
+ pMem[1]++;
+ }
+
+ return pBuff;
+}
+
+void* _refadd(void* pBuff)
+{
+ if(pBuff)
+ // Increment the counter value
+ ((size_t*)pBuff)[-1]++;
+
+ return pBuff;
+}
+
+void _refrelease_dbg(void* pBuff)
+{
+ if(pBuff)
+ {
+ // Decrement the counter value
+ size_t* pMem = (size_t*)pBuff - 2;
+ assert(pMem[0] = kRefSig);
+
+ if(!--pMem[1])
+ free(pMem);
+ }
+}
+
+void _refrelease(void* pBuff)
+{
+ if(pBuff)
+ {
+ // Decrement the counter value
+ size_t* pMem = (size_t*)pBuff - 1;
+
+ if(!--pMem[0])
+ free(pMem);
+ }
+} \ No newline at end of file