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