summaryrefslogtreecommitdiff
path: root/plugins/Updater/allocations.h
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/Updater/allocations.h')
-rw-r--r--plugins/Updater/allocations.h72
1 files changed, 72 insertions, 0 deletions
diff --git a/plugins/Updater/allocations.h b/plugins/Updater/allocations.h
new file mode 100644
index 0000000000..842d7daf01
--- /dev/null
+++ b/plugins/Updater/allocations.h
@@ -0,0 +1,72 @@
+#ifndef _ALLOCATION_INC
+#define _ALLOCATION_INC
+
+// store allocated memory pointers for deallocation when shutting down
+class Allocations {
+public:
+ Allocations(): head(0) {}
+ virtual ~Allocations() { free_all(); }
+
+ void push_back(void *pt) { Node *n = new Node; n->value = pt; n->next = head; head = n;}
+
+protected:
+
+ class Node {
+ public:
+ void *value;
+ Node *next;
+ };
+
+ Node *head;
+
+ void free_all() {
+ Node *current;
+ while(head) {
+ current = head;
+ head = head->next;
+ free(current->value);
+ delete current;
+ }
+ }
+};
+
+extern Allocations allocations;
+
+__inline static void *safe_alloc(size_t bytes) {
+ if(bytes == 0) return 0;
+ void *ret = malloc(bytes);
+ allocations.push_back(ret);
+ return ret;
+}
+
+__inline static char *safe_strdup(const char *s) {
+ if(!s) return 0;
+ char *ret = _strdup(s);
+ allocations.push_back(ret);
+ return ret;
+}
+
+__inline static wchar_t *safe_wstrdup(const wchar_t *s) {
+ if(!s) return 0;
+ wchar_t *ret = _wcsdup(s);
+ allocations.push_back(ret);
+ return ret;
+}
+
+#ifdef _UNICODE
+#define safe_tstrdup(x) safe_wstrdup(x)
+#else
+#define sage_tstrdup(x) safe_strdup(x)
+#endif
+
+__inline static BYTE *safe_bytedup(BYTE *bytes, int size) {
+ if(!bytes || size == 0) return 0;
+
+ BYTE *ret = (BYTE *)malloc(size + 1);
+ memcpy(ret, bytes, size);
+ *(ret + size) = 0;
+ allocations.push_back(ret);
+ return ret;
+}
+
+#endif