brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.8 KiB · 0b28f86 Raw
86 lines · c
1//===-- sanitizer_allocator.h -----------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// Specialized memory allocator for ThreadSanitizer, MemorySanitizer, etc.10//11//===----------------------------------------------------------------------===//12 13#ifndef SANITIZER_ALLOCATOR_H14#define SANITIZER_ALLOCATOR_H15 16#include "sanitizer_common.h"17#include "sanitizer_flat_map.h"18#include "sanitizer_internal_defs.h"19#include "sanitizer_lfstack.h"20#include "sanitizer_libc.h"21#include "sanitizer_list.h"22#include "sanitizer_local_address_space_view.h"23#include "sanitizer_mutex.h"24#include "sanitizer_procmaps.h"25#include "sanitizer_type_traits.h"26 27namespace __sanitizer {28 29// Allows the tools to name their allocations appropriately.30extern const char *PrimaryAllocatorName;31extern const char *SecondaryAllocatorName;32 33// Since flags are immutable and allocator behavior can be changed at runtime34// (unit tests or ASan on Android are some examples), allocator_may_return_null35// flag value is cached here and can be altered later.36bool AllocatorMayReturnNull();37void SetAllocatorMayReturnNull(bool may_return_null);38 39// Returns true if allocator detected OOM condition. Can be used to avoid memory40// hungry operations.41bool IsAllocatorOutOfMemory();42// Should be called by a particular allocator when OOM is detected.43void SetAllocatorOutOfMemory();44 45void PrintHintAllocatorCannotReturnNull();46 47// Callback type for iterating over chunks.48typedef void (*ForEachChunkCallback)(uptr chunk, void *arg);49 50inline u32 Rand(u32 *state) {  // ANSI C linear congruential PRNG.51  return (*state = *state * 1103515245 + 12345) >> 16;52}53 54inline u32 RandN(u32 *state, u32 n) { return Rand(state) % n; }  // [0, n)55 56template<typename T>57inline void RandomShuffle(T *a, u32 n, u32 *rand_state) {58  if (n <= 1) return;59  u32 state = *rand_state;60  for (u32 i = n - 1; i > 0; i--)61    Swap(a[i], a[RandN(&state, i + 1)]);62  *rand_state = state;63}64 65struct NoOpMapUnmapCallback {66  void OnMap(uptr p, uptr size) const {}67  void OnMapSecondary(uptr p, uptr size, uptr user_begin,68                      uptr user_size) const {}69  void OnUnmap(uptr p, uptr size) const {}70};71 72#include "sanitizer_allocator_size_class_map.h"73#include "sanitizer_allocator_stats.h"74#include "sanitizer_allocator_primary64.h"75#include "sanitizer_allocator_primary32.h"76#include "sanitizer_allocator_local_cache.h"77#include "sanitizer_allocator_secondary.h"78#include "sanitizer_allocator_combined.h"79 80bool IsRssLimitExceeded();81void SetRssLimitExceeded(bool limit_exceeded);82 83} // namespace __sanitizer84 85#endif // SANITIZER_ALLOCATOR_H86