summaryrefslogtreecommitdiffstats
path: root/runtime/alloc.h
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/alloc.h')
-rw-r--r--runtime/alloc.h71
1 files changed, 71 insertions, 0 deletions
diff --git a/runtime/alloc.h b/runtime/alloc.h
new file mode 100644
index 00000000..13bd6766
--- /dev/null
+++ b/runtime/alloc.h
@@ -0,0 +1,71 @@
+enum errorcode { ERR_NONE=0, ERR_NO_MEM };
+enum errorcode _stp_error = ERR_NONE;
+
+/** Allocates memory within a probe.
+ * This is used for small allocations from within a running
+ * probe where the process cannot sleep.
+ * @param len Number of bytes to allocate.
+ * @return a valid pointer on success or NULL on failure.
+ * @bug Currently uses kmalloc (GFP_ATOMIC).
+ */
+
+inline void *_stp_alloc(size_t len)
+{
+ void *ptr = kmalloc(len, GFP_ATOMIC);
+ if (ptr == NULL)
+ _stp_error = ERR_NO_MEM;
+ return ptr;
+}
+
+/** Allocates and clears memory within a probe.
+ * This is used for small allocations from within a running
+ * probe where the process cannot sleep.
+ * @param len Number of bytes to allocate.
+ * @return a valid pointer on success or NULL on failure.
+ * @bug Currently uses kmalloc (GFP_ATOMIC).
+ */
+
+inline void *_stp_calloc(size_t len)
+{
+ void *ptr = _stp_alloc(len);
+ if (ptr)
+ memset(ptr, 0, len);
+ return ptr;
+}
+
+/** Allocates and clears memory outside a probe.
+ * This is typically used in the module initialization to
+ * allocate new maps, lists, etc.
+ * @param len Number of bytes to allocate.
+ * @return a valid pointer on success or NULL on failure.
+ */
+
+inline void *_stp_valloc(size_t len)
+{
+ void *ptr = vmalloc(len);
+ if (ptr)
+ memset(ptr, 0, len);
+ else
+ _stp_error = ERR_NO_MEM;
+ return ptr;
+}
+
+/** Frees memory allocated by _stp_alloc or _stp_calloc.
+ * @param ptr pointer to memory to free
+ */
+
+inline void _stp_free(void *ptr)
+{
+ if (ptr)
+ kfree(ptr);
+}
+
+/** Frees memory allocated by _stp_valloc.
+ * @param ptr pointer to memory to free
+ */
+
+inline void _stp_vfree(void *ptr)
+{
+ if (ptr)
+ vfree(ptr);
+}