Big waves.
This function wraps the operation of getting a stimframe from
the SpMcRingBuffer, and then eventually assigning it a
SimultaneityStamp. For now we just always pass in the first
stim frame and we don't get any simulstamps.
Its callOriginalCallback() automatically calls
allowNextStimulusFrame() to ensure that it doesn't deadlock future
timeslices.
This method takes an input assembly buffer and selects which
OpenCL kernels need to be executed on that buffer to transform
the input data into the eventual output StimulusFrame for the
current timeslice period.
We implemented the feature to fill unassembled slots w/dummy header
values for the livox pcloud header.
We also fixed a bug where io uring was writing into the last slot
only because we were using the same iovec for every SQE.
We call stop() inside the assembleFrameReq3, so when it returns,
the eventfdDesc should be destroyed. Don't allow a possibly stale
eventfdDesc obj to permit us to re-arm the eventfdDesc read_some
call.
This is in preparation for re-using StagingBuffer to also serve
as the collation buffer that we'll use as the intermediate stage
for producing the final output mesh.
Invoke it instimFrameProductionTimesliceInd.
Also, we discovered:
* stream_descriptor::release() doesn't fully release all metadata
from the fd it was assigned. This suggests that we should go
through the codebase and do: release()=>reset() whenever we
wish to release().
* We've confirmed that spinlocks can be used to prevent race
conditions between stop() and handler methods.
StagingBuffer:
We now allocate memory with mmap(MAP_ANONYMOUS) so that we can be
sure it can be pinned with io_uring_register_buffers(). This
ensures that if DMA is possible, it should be usable.
IoUringAssemblyEngine:
We now register an eventfd with io_uring so that we can listen
for CQEs with boost::asio.