summaryrefslogtreecommitdiffstats
path: root/runtime/alloc.c
diff options
context:
space:
mode:
authorhunt <hunt>2005-03-29 18:07:58 +0000
committerhunt <hunt>2005-03-29 18:07:58 +0000
commite32551b18f4560056d2d482f5e1505b1b98fa82a (patch)
tree4e9e07a9b46a4fd5dea27732571cbb04c0ef5dee /runtime/alloc.c
parent13b35bb112459702e7371ecc89d7deb789818a86 (diff)
downloadsystemtap-steved-e32551b18f4560056d2d482f5e1505b1b98fa82a.tar.gz
systemtap-steved-e32551b18f4560056d2d482f5e1505b1b98fa82a.tar.xz
systemtap-steved-e32551b18f4560056d2d482f5e1505b1b98fa82a.zip
*** empty log message ***
Diffstat (limited to 'runtime/alloc.c')
-rw-r--r--runtime/alloc.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/runtime/alloc.c b/runtime/alloc.c
new file mode 100644
index 00000000..9b348b27
--- /dev/null
+++ b/runtime/alloc.c
@@ -0,0 +1,93 @@
+#ifndef _ALLOC_C_
+#define _ALLOC_C_
+
+/* -*- linux-c -*- */
+/** @file alloc.c
+ * @brief Memory functions.
+ */
+/** @addtogroup alloc Memory Functions
+ * Basic malloc/calloc/free functions. These will be changed so
+ * that memory allocation errors will call a handler. The default will
+ * send a signal to the user-space daemon that will trigger the module to
+ * be unloaded.
+ * @todo Need error handling for memory allocations
+ * @todo Some of these currently use kmalloc (GFP_ATOMIC) for
+ * small allocations. This should be evaluated for performance
+ * and stability.
+ * @{
+ */
+
+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).
+ */
+
+void *_stp_alloc(size_t len)
+{
+ void *ptr = kmalloc(len, GFP_ATOMIC);
+ if (unlikely(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).
+ */
+
+void *_stp_calloc(size_t len)
+{
+ void *ptr = _stp_alloc(len);
+ if (likely(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.
+ */
+
+void *_stp_valloc(size_t len)
+{
+ void *ptr = vmalloc(len);
+ if (likely(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
+ */
+
+void _stp_free(void *ptr)
+{
+ if (likely(ptr))
+ kfree(ptr);
+}
+
+/** Frees memory allocated by _stp_valloc.
+ * @param ptr pointer to memory to free
+ */
+
+void _stp_vfree(void *ptr)
+{
+ if (likely(ptr))
+ vfree(ptr);
+}
+
+/** @} */
+#endif /* _ALLOC_C_ */