61 lines
2.5 KiB
Plaintext
61 lines
2.5 KiB
Plaintext
Relacy Race Detector Todo List:
|
|
|
|
- use indirection and indices for TLS, because on Windows TLS index is DWORD (not DWORD_PTR) (eliminate pointers?)
|
|
+ provide rl::hash_ptr()
|
|
- support for fair timed waits
|
|
+ remove iteration count estimation from full sched -> causes division by 0
|
|
- history: memory allocation before object ctor (new T (...))
|
|
+ code in test::after() affects iteration count with full scheduler -> final and estimated iteration counts are the same
|
|
|
|
- non-deterministic sub-expression calculation:
|
|
foo(bar.load(std::memory_order_acquire), baz.load(std::memory_order_acquire));
|
|
|
|
- post issue:
|
|
can't simulate some modification orders in presence of data-races-type-2 for atomic vars:
|
|
//thread 1
|
|
x.store(1, std::memory_order_relaxed);
|
|
y.store(1, std::memory_order_relaxed);
|
|
//thread 2
|
|
while (y.load(std::memory_order_relaxed) == 0
|
|
{}
|
|
x.store(2, std::memory_order_relaxed);
|
|
-> modification order of 'x' will never be "2, 1"
|
|
|
|
|
|
[CORE]
|
|
- initially run threads one by one
|
|
- initially run some iterations twice, in order to check that unit-test is deterministic
|
|
? add unique identifiers to atomics, vars, mutexes etc (address can be useful too)
|
|
- example catalog (description, used techniques, what error is found)
|
|
- do I need sched() before atomic loads?
|
|
- do I need sched() before mutex unlock?
|
|
- for loads output in history value of which store is loaded
|
|
- detect dead-code
|
|
- output which operations cause data race
|
|
? output happens-before matrix, synchronizes-with matrix etc
|
|
- SEH handler to catch paging faults
|
|
- sched before malloc/free to allow more ABA
|
|
|
|
[PERF]
|
|
- implement performance simulation
|
|
- cacheline transfers
|
|
- atomic rmw operations
|
|
- fences
|
|
|
|
[OTHER]
|
|
- parallelize the run-time for random scheduler
|
|
- parallelize the run-time for tree search scheduler
|
|
- manual control over scheduler
|
|
- persistent checkpointing of scheduler state (to allow "continue")
|
|
- atomic blocks (pdr implementation -> pdr component)
|
|
? state space reductions (sleep sets, dynamic persistent sets)
|
|
? what can I do with serialization points -> user specifies "visible" results
|
|
system checks for linearizablity -> "visible" results equal to some sequential execution
|
|
? save program state inside iteration (save point), continue other iterations from this save point
|
|
? partial order reductions by memorizing happens-before graphs, not program state
|
|
? estimate progress by seeing how many iterations it gets to move 0->1 on some stree level
|
|
? lower bound, upper bound, mean of progress
|
|
|
|
O(X) = (P^(C + 3)) * (N^(P + C + 1)) * (P + C)!
|
|
|