Hello. I'm trying to implement a lock-free pointer storage with safe memory reclamation. That is, whenever a writer tries to replace an old pointer with new one, it waits until all readers are done with old pointer, so that old pointed memory can be released safely.
To verify the code I'm checking it with Relacy race detector. Here it is: https://gist.github.com/brugeman/30070d4c309a17f21597 I compile it this way: g++-4.8 -g -std=c++11 -Wall -Irelacy_2_4 -o smrp_test smrp_test.cpp I face some problems: 1. Even though test passes and relacy does not give any warnings, the same test w/o relacy-related stuff will occasionally fail on this assertion: https://gist.github.com/brugeman/30070d4c309a17f21597#file-smrp_test-cpp-L223 Could anyone please comment on the algorithm in general, and on memory-orderings in particular? Whenever I change all memory orders to seq_cst, I see 20x performance degradation, but see no errors (although they might just have become rarer). 2. If I compile with -O1 or higher, program crashes: *** longjmp causes uninitialized stack frame ***: smrp_test terminated Stack trace: #0 0x00007ffff74be0d5 in __GI_raise (sig=<optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64 #1 0x00007ffff74c183b in __GI_abort () at abort.c:91 #2 0x00007ffff74fb32e in __libc_message (do_abort=2, fmt=0x7ffff7603412 "*** %s ***: %s terminated\n") at ../sysdeps/unix/sysv/linux/libc_fatal.c:201 #3 0x00007ffff7591e57 in __GI___fortify_fail (msg=0x7ffff76033d1 "longjmp causes uninitialized stack frame") at fortify_fail.c:32 #4 0x00007ffff7591dcd in ____longjmp_chk () at ../sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S:90 #5 0x00007ffff7591d33 in __longjmp_chk (env=0x7fffffffd928, val=<optimized out>) at ../setjmp/longjmp.c:40 #6 0x0000000000405daf in switch_to_fiber(fiber_t&, fiber_t&) () at relacy_2_4/relacy/platform.hpp:223 #7 0x000000000040f02a in rl::test_result_e rl::run_test<smrp_test::race_test, rl::random_scheduler<2> >(rl::test_params&, std::ostream&, bool) () at relacy_2_4/relacy/context.hpp:703 #8 0x0000000000410e65 in bool rl::simulate<smrp_test::race_test>(rl::test_params&) () at relacy_2_4/relacy/context.hpp:960 #9 0x00000000004112df in bool rl::simulate<smrp_test::race_test>() () at relacy_2_4/relacy/context.hpp:1014 #10 0x0000000000402658 in main () at smrp_test.cpp:247 Dmitry, could you please comment - is this expected? Should I only run relacy with optimizations turned off? Not that I really need optimization here, just saying in case there's some bug... Thanks! -- Artur -- --- You received this message because you are subscribed to the Google Groups "Scalable Synchronization Algorithms" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/lock-free/ed86f08f-2ca6-4cd3-a6b7-03599356d555%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
