1 // Copyright 2009-2021 Intel Corporation 2 // SPDX-License-Identifier: Apache-2.0 3 4 #include "alloc.h" 5 #include "../../common/sys/thread.h" 6 7 namespace embree 8 { 9 __thread FastAllocator::ThreadLocal2* FastAllocator::thread_local_allocator2 = nullptr; 10 SpinLock FastAllocator::s_thread_local_allocators_lock; 11 std::vector<std::unique_ptr<FastAllocator::ThreadLocal2>> FastAllocator::s_thread_local_allocators; 12 13 struct fast_allocator_regression_test : public RegressionTest 14 { 15 BarrierSys barrier; 16 std::atomic<size_t> numFailed; 17 std::unique_ptr<FastAllocator> alloc; 18 fast_allocator_regression_testembree::fast_allocator_regression_test19 fast_allocator_regression_test() 20 : RegressionTest("fast_allocator_regression_test"), numFailed(0) 21 { 22 registerRegressionTest(this); 23 } 24 thread_allocembree::fast_allocator_regression_test25 static void thread_alloc(fast_allocator_regression_test* This) 26 { 27 FastAllocator::CachedAllocator threadalloc = This->alloc->getCachedAllocator(); 28 29 size_t* ptrs[1000]; 30 for (size_t j=0; j<1000; j++) 31 { 32 This->barrier.wait(); 33 for (size_t i=0; i<1000; i++) { 34 ptrs[i] = (size_t*) threadalloc.malloc0(sizeof(size_t)+(i%32)); 35 *ptrs[i] = size_t(threadalloc.talloc0) + i; 36 } 37 for (size_t i=0; i<1000; i++) { 38 if (*ptrs[i] != size_t(threadalloc.talloc0) + i) 39 This->numFailed++; 40 } 41 This->barrier.wait(); 42 } 43 } 44 runembree::fast_allocator_regression_test45 bool run () 46 { 47 alloc = make_unique(new FastAllocator(nullptr,false)); 48 numFailed.store(0); 49 50 size_t numThreads = getNumberOfLogicalThreads(); 51 barrier.init(numThreads+1); 52 53 /* create threads */ 54 std::vector<thread_t> threads; 55 for (size_t i=0; i<numThreads; i++) 56 threads.push_back(createThread((thread_func)thread_alloc,this)); 57 58 /* run test */ 59 for (size_t i=0; i<1000; i++) 60 { 61 alloc->reset(); 62 barrier.wait(); 63 barrier.wait(); 64 } 65 66 /* destroy threads */ 67 for (size_t i=0; i<numThreads; i++) 68 join(threads[i]); 69 70 alloc = nullptr; 71 72 return numFailed == 0; 73 } 74 }; 75 76 fast_allocator_regression_test fast_allocator_regression; 77 } 78 79 80