So, basically two lines of work in the air right now.
First, which is making progress, is building every GCC starting with 4.1.2, first on x64, then ARM32, ARM64 and MIPS32. Once done, then building liblfds with every version of GCC on all those platforms, and making sure test passes and then comparing the benchmarks.
Tell ya somethin’ – GCC 6.x.x takes freaking FOREVER to build. Four core i5 with SSD, takes about two hours.
Second, which is not making much progress, is thinking over the SMR design. I’ve been trying to think up a lock-free epoch based design, which would mean not being forced to process generations sequentially – being able where necessary skip generations, until they became releasable – but I think it’s not possible in any obvious way. The information just can’t be obtained, even more so when thinking in terms of memory barriers only, which depend on the atomic op of the data structure operation to publish.
I see very clearly why now hazard pointers are so good, but I don’t just want to use someone else’s idea – but given the limits imposed by hardware capabilities, it is hard to see any other approach.
I’m still waiting for the PINE64 to arrive, which is a blocker for the next release.
I need also to sort out the mysterious performance behaviour of the unbounded/single/single queue and also try to get the elimination layer on the freelist scaling.
I have also been told (and I think it’s true – I knew, really) that casting *away* volatile is undefined behaviour. That sucks, because being able to do so gives me the ability to do single-threaded ops on the data structures (have them after such work with a function call flipping back to thread-safe behaviour).
Maybe I can determine behaviour for GCC and clang, and offer it on those compilers.