1 | /* Copyright (c) 2002, 2015, Oracle and/or its affiliates. |
2 | Copyright (c) 2012, 2017, MariaDB Corporation. |
3 | |
4 | This program is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by |
6 | the Free Software Foundation; version 2 of the License. |
7 | |
8 | This program is distributed in the hope that it will be useful, |
9 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
11 | GNU General Public License for more details. |
12 | |
13 | You should have received a copy of the GNU General Public License |
14 | along with this program; if not, write to the Free Software |
15 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ |
16 | |
17 | /* guess_malloc_library() deduces, to the best of its ability, |
18 | the currently used malloc library and its version */ |
19 | |
20 | #include <stddef.h> |
21 | #include "my_global.h" |
22 | #include <m_string.h> |
23 | |
24 | typedef const char* (*tc_version_type)(int*, int*, const char**); |
25 | typedef int (*mallctl_type)(const char*, void*, size_t*, void*, size_t); |
26 | |
27 | char *guess_malloc_library() |
28 | { |
29 | tc_version_type tc_version_func; |
30 | mallctl_type mallctl_func; |
31 | #ifndef HAVE_DLOPEN |
32 | return (char*) MALLOC_LIBRARY; |
33 | #else |
34 | static char buf[128]; |
35 | |
36 | if (strcmp(MALLOC_LIBRARY, "system" ) != 0) |
37 | { |
38 | return (char*) MALLOC_LIBRARY; |
39 | } |
40 | |
41 | /* tcmalloc */ |
42 | tc_version_func= (tc_version_type) dlsym(RTLD_DEFAULT, "tc_version" ); |
43 | if (tc_version_func) |
44 | { |
45 | int major, minor; |
46 | const char* ver_str = tc_version_func(&major, &minor, NULL); |
47 | strxnmov(buf, sizeof(buf)-1, "tcmalloc " , ver_str, NULL); |
48 | return buf; |
49 | } |
50 | |
51 | /* jemalloc */ |
52 | mallctl_func= (mallctl_type) dlsym(RTLD_DEFAULT, "mallctl" ); |
53 | if (mallctl_func) |
54 | { |
55 | char *ver; |
56 | size_t len = sizeof(ver); |
57 | mallctl_func("version" , &ver, &len, NULL, 0); |
58 | strxnmov(buf, sizeof(buf)-1, "jemalloc " , ver, NULL); |
59 | return buf; |
60 | } |
61 | |
62 | return (char*) MALLOC_LIBRARY; |
63 | #endif |
64 | } |
65 | |
66 | |