1 /** 2 Module used to efficiently store simple data from many threads. 3 May be used for validation multithreated algorithms. 4 Ex. multithreated executes 1000 jobs, each jobs adds to sink unique number. 5 After execution if in this sink are all 1000 numbers and all are unique everything was ok. 6 */ 7 8 module mutils.job_manager.debug_sink; 9 10 11 import std.experimental.allocator; 12 import std.experimental.allocator.mallocator; 13 14 import mutils.container_shared.shared_vector; 15 import mutils.job_manager.utils; 16 17 18 19 import mutils.container.vector; 20 21 class DebugSink{ 22 alias T=int; 23 24 25 alias DataVector=Vector!T; 26 static DataVector vector; 27 28 alias DataDataVector=LockedVector!(DataVector*); 29 __gshared DataDataVector allData; 30 31 32 static void initialize(){ 33 //vector=Mallocator.instance.make!DataVector; 34 allData.add(&vector); 35 } 36 37 static void deinitialize(){ 38 allData.removeElement(&vector); 39 //Mallocator.instance.dispose(vector); 40 } 41 42 43 static void initializeShared(){ 44 allData=Mallocator.instance.make!DataDataVector; 45 } 46 47 static void deinitializeShared(){ 48 Mallocator.instance.dispose(allData); 49 } 50 51 static void add(T obj){ 52 vector~=obj; 53 } 54 55 static void reset(){ 56 foreach(ref arr;allData){ 57 arr.reset(); 58 } 59 } 60 61 static auto getAll(){ 62 return allData; 63 } 64 65 static verifyUnique(int expectedNum){ 66 import std.algorithm; 67 import std.array; 68 auto all=DebugSink.getAll()[]; 69 auto oneRange=all.map!((a) => (*a)[]).joiner; 70 int[] allocated=oneRange.array; 71 allocated.sort(); 72 assertM(allocated.length,expectedNum); 73 allocated= allocated[0..allocated.length-allocated.uniq().copy(allocated).length]; 74 assertM(allocated.length,expectedNum); 75 } 76 } 77 78