Add memory APIs with implicit memory allocation 39/164339/4 submit/tizen/20180109.094207
authorAlexander Aksenov <a.aksenov@samsung.com>
Mon, 18 Dec 2017 18:34:46 +0000 (21:34 +0300)
committerDmitry Kovalenko <d.kovalenko@samsung.com>
Thu, 21 Dec 2017 14:55:21 +0000 (14:55 +0000)
Change-Id: I30e75fee13888ad4599705c5f99cf0da1352a8a6
Signed-off-by: Alexander Aksenov <a.aksenov@samsung.com>
probe_memory/api_names.txt
probe_memory/libdamemalloc.c
probe_memory/memory_probes_list.h

index 73bf8b1..f604adf 100644 (file)
@@ -38,6 +38,12 @@ realloc@*;          realloc;          4
 calloc@*;           calloc;           4
 posix_memalign@*;   posix_memalign;   4
 strdup@*;           strdup;           4
+strndup@*;          strndup;          4
+wcsdup@*;           wcsdup;           4
+asprintf@*;         asprintf;         4
+vasprintf@*;        vasprintf;        4
+memalign@*;         memalign;         4
+valloc@*;           valloc;           4
 
 
 #filename libdamemalloc.c
@@ -49,4 +55,9 @@ realloc@*;          realloc;          1
 calloc@*;           calloc;           1
 posix_memalign@*;   posix_memalign;   1
 strdup@*;           strdup;           1
-
+strndup@*;          strndup;          1
+wcsdup@*;           wcsdup;           1
+asprintf@*;         asprintf;         1
+vasprintf@*;        vasprintf;        1
+memalign@*;         memalign;         1
+valloc@*;           valloc;           1
index a0cc91b..153aeb9 100755 (executable)
@@ -331,3 +331,190 @@ HANDLER_WRAPPERS(memory_feature, char *, strdup, const char*, s)
 
        return pret;
 }
+
+HANDLER_WRAPPERS(memory_feature, char *, strndup, const char *, str, size_t, n)
+{
+       static void *(*strndupp)(const char *, size_t);
+       size_t size = 0;
+       DECLARE_VARIABLE_STANDARD;
+       char *pret;
+
+       strndupp = (void *)PROBE_GET_FUNC(probe_data);
+
+       PRE_PROBEBLOCK();
+
+       pret = (*strndupp)(str, n);
+
+       if (pret) {
+               size = strnlen(pret, n) + 1; /* +1 for terminate \0 */
+               add_memory_hash(pret, size, MEMTYPE_ALLOC,
+                               PROBE_GET_CALL_TYPE(probe_data));
+       }
+
+       POST_PACK_PROBEBLOCK_BEGIN();
+
+       PREPARE_LOCAL_BUF();
+       PACK_COMMON_BEGIN(MSG_PROBE_MEMORY, API_ID_strndup, "pn", str, n);
+       PACK_COMMON_END('p', pret, newerrno, probe_data);
+       PACK_MEMORY((uint64_t)size, MEMORY_API_ALLOC, pret);
+       FLUSH_LOCAL_BUF();
+
+       POST_PACK_PROBEBLOCK_END();
+
+       return pret;
+}
+
+HANDLER_WRAPPERS(memory_feature, wchar_t *, wcsdup, const wchar_t *, str)
+{
+       static wchar_t *(*wcsdupp)(const wchar_t *);
+       size_t size = 0;
+       DECLARE_VARIABLE_STANDARD;
+       wchar_t *pret;
+
+       wcsdupp = (void *)PROBE_GET_FUNC(probe_data);
+
+       PRE_PROBEBLOCK();
+
+       pret = (*wcsdupp)(str);
+
+       if (pret) {
+               /* +1 for terminate \0 */
+               size = (wcslen(pret) + 1) * sizeof(*pret);
+               add_memory_hash(pret, size, MEMTYPE_ALLOC,
+                               PROBE_GET_CALL_TYPE(probe_data));
+       }
+
+       POST_PACK_PROBEBLOCK_BEGIN();
+
+       PREPARE_LOCAL_BUF();
+       PACK_COMMON_BEGIN(MSG_PROBE_MEMORY, API_ID_wcsdup, "p", str);
+       PACK_COMMON_END('p', pret, newerrno, probe_data);
+       PACK_MEMORY((uint64_t)size, MEMORY_API_ALLOC, pret);
+       FLUSH_LOCAL_BUF();
+
+       POST_PACK_PROBEBLOCK_END();
+
+       return pret;
+}
+
+HANDLER_WRAPPERS_VAR(memory_feature, fmt, int, asprintf, char **, strp,
+                    const char *, fmt, ...)
+{
+       size_t size = 0;
+       DECLARE_VARIABLE_STANDARD;
+       int pret;
+
+       PRE_PROBEBLOCK();
+
+       pret = vasprintf(strp, fmt, args);
+
+       if (pret != -1) {
+               size = strlen(*strp) + 1; /* +1 for terminate \0 */
+               add_memory_hash(*strp, size, MEMTYPE_ALLOC,
+                               PROBE_GET_CALL_TYPE(probe_data));
+       }
+
+       POST_PACK_PROBEBLOCK_BEGIN();
+
+       PREPARE_LOCAL_BUF();
+       PACK_COMMON_BEGIN(MSG_PROBE_MEMORY, API_ID_asprintf, "pp", strp, fmt);
+       PACK_COMMON_END('d', pret, newerrno, probe_data);
+       PACK_MEMORY((uint64_t)size, MEMORY_API_ALLOC, pret);
+       FLUSH_LOCAL_BUF();
+
+       POST_PACK_PROBEBLOCK_END();
+
+       return pret;
+}
+
+HANDLER_WRAPPERS(memory_feature, int, vasprintf, char **, strp,
+                const char *, fmt, va_list, valist)
+{
+       static int(*vasprintfp)(char **, const char *, va_list);
+       size_t size = 0;
+       DECLARE_VARIABLE_STANDARD;
+       int pret;
+
+       vasprintfp = (void *)PROBE_GET_FUNC(probe_data);
+
+       PRE_PROBEBLOCK();
+       pret = (*vasprintfp)(strp, fmt, valist);
+
+       if (pret != -1) {
+               size = strlen(*strp) + 1; /* +1 for terminate \0 */
+               add_memory_hash(*strp, size, MEMTYPE_ALLOC,
+                               PROBE_GET_CALL_TYPE(probe_data));
+       }
+
+       POST_PACK_PROBEBLOCK_BEGIN();
+
+       PREPARE_LOCAL_BUF();
+       PACK_COMMON_BEGIN(MSG_PROBE_MEMORY, API_ID_vasprintf, "pp", strp, fmt);
+       PACK_COMMON_END('d', pret, newerrno, probe_data);
+       PACK_MEMORY((uint64_t)size, MEMORY_API_ALLOC, pret);
+       FLUSH_LOCAL_BUF();
+
+       POST_PACK_PROBEBLOCK_END();
+
+       return pret;
+}
+
+HANDLER_WRAPPERS(memory_feature, void *, memalign, size_t, boundary,
+                size_t, size)
+{
+       static void *(*memalignp)(size_t, size_t);
+       DECLARE_VARIABLE_STANDARD;
+       void *pret;
+
+       memalignp = (void *)PROBE_GET_FUNC(probe_data);
+
+       PRE_PROBEBLOCK();
+
+       pret = (*memalignp)(boundary, size);
+
+       if (pret)
+               add_memory_hash(pret, size, MEMTYPE_ALLOC,
+                               PROBE_GET_CALL_TYPE(probe_data));
+
+       POST_PACK_PROBEBLOCK_BEGIN();
+
+       PREPARE_LOCAL_BUF();
+       PACK_COMMON_BEGIN(MSG_PROBE_MEMORY, API_ID_memalign,
+                         "xx", boundary, size);
+       PACK_COMMON_END('p', pret, newerrno, probe_data);
+       PACK_MEMORY(size, MEMORY_API_ALLOC, pret);
+       FLUSH_LOCAL_BUF();
+
+       POST_PACK_PROBEBLOCK_END();
+
+       return pret;
+}
+
+HANDLER_WRAPPERS(memory_feature, void *, valloc, size_t, size)
+{
+       static void *(*vallocp)(size_t);
+       DECLARE_VARIABLE_STANDARD;
+       void *pret;
+
+       vallocp = (void *)PROBE_GET_FUNC(probe_data);
+
+       PRE_PROBEBLOCK();
+
+       pret = (*vallocp)(size);
+
+       if (pret)
+               add_memory_hash(pret, size, MEMTYPE_ALLOC,
+                               PROBE_GET_CALL_TYPE(probe_data));
+
+       POST_PACK_PROBEBLOCK_BEGIN();
+
+       PREPARE_LOCAL_BUF();
+       PACK_COMMON_BEGIN(MSG_PROBE_MEMORY, API_ID_valloc, "x", size);
+       PACK_COMMON_END('p', pret, newerrno, probe_data);
+       PACK_MEMORY(size, MEMORY_API_ALLOC, pret);
+       FLUSH_LOCAL_BUF();
+
+       POST_PACK_PROBEBLOCK_END();
+
+       return pret;
+}
index 286b42d..591c4d4 100644 (file)
        X(PROBE_NAME(memcmp), memcmp, GT_TARGET_PROBE) \
        X(PROBE_NAME(memcpy), memcpy, GT_TARGET_PROBE) \
        X(PROBE_NAME(posix_memalign), posix_memalign, GT_ALWAYS_PROBE) \
-       X(PROBE_NAME(strdup), strdup, GT_ALWAYS_PROBE)
+       X(PROBE_NAME(strdup), strdup, GT_ALWAYS_PROBE) \
+       X(PROBE_NAME(strndup), strndup, GT_ALWAYS_PROBE) \
+       X(PROBE_NAME(wcsdup), wcsdup, GT_ALWAYS_PROBE) \
+       X(PROBE_NAME(asprintf), asprintf, GT_ALWAYS_PROBE) \
+       X(PROBE_NAME(vasprintf), vasprintf, GT_ALWAYS_PROBE) \
+       X(PROBE_NAME(memalign), memalign, GT_ALWAYS_PROBE) \
+       X(PROBE_NAME(valloc), valloc, GT_ALWAYS_PROBE)
 
 /* TODO generate PROBES_LIST with api_names.txt */
 
        X(CONCAT(PROBE_NAME(memcpy), _always), memcpy, GT_ALWAYS_PROBE) \
        X(CONCAT(PROBE_NAME(posix_memalign), _always), posix_memalign, \
          GT_ALWAYS_PROBE) \
-       X(CONCAT(PROBE_NAME(strdup), _always), strdup, GT_ALWAYS_PROBE)
+       X(CONCAT(PROBE_NAME(strdup), _always), strdup, GT_ALWAYS_PROBE) \
+       X(CONCAT(PROBE_NAME(strndup), _always), strndup, GT_ALWAYS_PROBE) \
+       X(CONCAT(PROBE_NAME(wcsdup), _always), wcsdup, GT_ALWAYS_PROBE) \
+       X(CONCAT(PROBE_NAME(asprintf), _always), asprintf, GT_ALWAYS_PROBE) \
+       X(CONCAT(PROBE_NAME(vasprintf), _always), vasprintf, GT_ALWAYS_PROBE) \
+       X(CONCAT(PROBE_NAME(memalign), _always), memalign, GT_ALWAYS_PROBE) \
+       X(CONCAT(PROBE_NAME(valloc), _always), valloc, GT_ALWAYS_PROBE)
 
 /* TODO generate PROBES_LIST with api_names.txt */