Path: blob/master/thirdparty/embree/kernels/common/vector.h
9905 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#include "default.h"45namespace embree6{7/*! invokes the memory monitor callback */8struct MemoryMonitorInterface {9virtual void memoryMonitor(ssize_t bytes, bool post) = 0;10};1112/*! allocator that performs aligned monitored allocations */13template<typename T, size_t alignment = 64>14struct aligned_monitored_allocator15{16typedef T value_type;17typedef T* pointer;18typedef const T* const_pointer;19typedef T& reference;20typedef const T& const_reference;21typedef std::size_t size_type;22typedef std::ptrdiff_t difference_type;2324__forceinline aligned_monitored_allocator(MemoryMonitorInterface* device)25: device(device), hugepages(false) {}2627__forceinline pointer allocate( size_type n )28{29if (n) {30assert(device);31device->memoryMonitor(n*sizeof(T),false);32}33if (n*sizeof(value_type) >= 14 * PAGE_SIZE_2M)34{35pointer p = (pointer) os_malloc(n*sizeof(value_type),hugepages);36assert(p);37return p;38}39return (pointer) alignedMalloc(n*sizeof(value_type),alignment);40}4142__forceinline void deallocate( pointer p, size_type n )43{44if (p)45{46if (n*sizeof(value_type) >= 14 * PAGE_SIZE_2M)47os_free(p,n*sizeof(value_type),hugepages);48else49alignedFree(p);50}51else assert(n == 0);5253if (n) {54assert(device);55device->memoryMonitor(-ssize_t(n)*sizeof(T),true);56}57}5859__forceinline void construct( pointer p, const_reference val ) {60new (p) T(val);61}6263__forceinline void destroy( pointer p ) {64p->~T();65}6667private:68MemoryMonitorInterface* device;69bool hugepages;70};7172/*! monitored vector */73template<typename T>74using mvector = vector_t<T,aligned_monitored_allocator<T,std::alignment_of<T>::value> >;75}767778