15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Copyright (c) 2008, Google Inc.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * modification, are permitted provided that the following conditions are
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * met:
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in the documentation and/or other materials provided with the
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distribution.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * contributors may be used to endorse or promote products derived from
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * this software without specific prior written permission.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * --
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Author: Craig Silverstein
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * C shims for the C++ malloc_hook.h.  See malloc_hook.h for details
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * on how to use these.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef _MALLOC_HOOK_C_H_
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _MALLOC_HOOK_C_H_
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stddef.h>
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/types.h>
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Annoying stuff for windows; makes sure clients can import these functions */
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PERFTOOLS_DLL_DECL
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef _WIN32
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   define PERFTOOLS_DLL_DECL  __declspec(dllimport)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   define PERFTOOLS_DLL_DECL
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef __cplusplus
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern "C" {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Get the current stack trace.  Try to skip all routines up to and
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and including the caller of MallocHook::Invoke*.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use "skip_count" (similarly to GetStackTrace from stacktrace.h)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * as a hint about how many routines to skip if better information
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is not available.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MallocHook_GetCallerStackTrace(void** result, int max_depth,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   int skip_count);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The MallocHook_{Add,Remove}*Hook functions return 1 on success and 0 on
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * failure.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void (*MallocHook_NewHook)(const void* ptr, size_t size);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MallocHook_AddNewHook(MallocHook_NewHook hook);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MallocHook_RemoveNewHook(MallocHook_NewHook hook);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void (*MallocHook_DeleteHook)(const void* ptr);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MallocHook_AddDeleteHook(MallocHook_DeleteHook hook);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MallocHook_RemoveDeleteHook(MallocHook_DeleteHook hook);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void (*MallocHook_PreMmapHook)(const void *start,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       size_t size,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int protection,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int flags,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int fd,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       off_t offset);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MallocHook_AddPreMmapHook(MallocHook_PreMmapHook hook);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MallocHook_RemovePreMmapHook(MallocHook_PreMmapHook hook);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void (*MallocHook_MmapHook)(const void* result,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const void* start,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    size_t size,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int protection,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int flags,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int fd,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    off_t offset);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MallocHook_AddMmapHook(MallocHook_MmapHook hook);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MallocHook_RemoveMmapHook(MallocHook_MmapHook hook);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int (*MallocHook_MmapReplacement)(const void* start,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          size_t size,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          int protection,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          int flags,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          int fd,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          off_t offset,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          void** result);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MallocHook_SetMmapReplacement(MallocHook_MmapReplacement hook);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MallocHook_RemoveMmapReplacement(MallocHook_MmapReplacement hook);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void (*MallocHook_MunmapHook)(const void* ptr, size_t size);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MallocHook_AddMunmapHook(MallocHook_MunmapHook hook);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MallocHook_RemoveMunmapHook(MallocHook_MunmapHook hook);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int (*MallocHook_MunmapReplacement)(const void* ptr,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            size_t size,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            int* result);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MallocHook_SetMunmapReplacement(MallocHook_MunmapReplacement hook);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MallocHook_RemoveMunmapReplacement(MallocHook_MunmapReplacement hook);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void (*MallocHook_MremapHook)(const void* result,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const void* old_addr,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      size_t old_size,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      size_t new_size,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int flags,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const void* new_addr);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MallocHook_AddMremapHook(MallocHook_MremapHook hook);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MallocHook_RemoveMremapHook(MallocHook_MremapHook hook);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void (*MallocHook_PreSbrkHook)(ptrdiff_t increment);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MallocHook_AddPreSbrkHook(MallocHook_PreSbrkHook hook);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MallocHook_RemovePreSbrkHook(MallocHook_PreSbrkHook hook);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void (*MallocHook_SbrkHook)(const void* result, ptrdiff_t increment);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MallocHook_AddSbrkHook(MallocHook_SbrkHook hook);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MallocHook_RemoveSbrkHook(MallocHook_SbrkHook hook);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The following are DEPRECATED. */
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MallocHook_NewHook MallocHook_SetNewHook(MallocHook_NewHook hook);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MallocHook_DeleteHook MallocHook_SetDeleteHook(MallocHook_DeleteHook hook);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MallocHook_PreMmapHook MallocHook_SetPreMmapHook(MallocHook_PreMmapHook hook);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MallocHook_MmapHook MallocHook_SetMmapHook(MallocHook_MmapHook hook);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MallocHook_MunmapHook MallocHook_SetMunmapHook(MallocHook_MunmapHook hook);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MallocHook_MremapHook MallocHook_SetMremapHook(MallocHook_MremapHook hook);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MallocHook_PreSbrkHook MallocHook_SetPreSbrkHook(MallocHook_PreSbrkHook hook);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PERFTOOLS_DLL_DECL
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MallocHook_SbrkHook MallocHook_SetSbrkHook(MallocHook_SbrkHook hook);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* End of DEPRECATED functions. */
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef __cplusplus
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}   // extern "C"
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* _MALLOC_HOOK_C_H_ */
174