libcamera
v0.3.2+116-83c5ad0f
Supporting cameras in Linux since 2019
|
Synchronization primitive to manage resources. More...
Public Member Functions | |
Fence (UniqueFD fd) | |
Create a Fence. More... | |
bool | isValid () const |
Check if a Fence is valid. More... | |
const UniqueFD & | fd () const |
Retrieve a constant reference to the file descriptor. More... | |
UniqueFD | release () |
Release the ownership of the file descriptor. More... | |
Synchronization primitive to manage resources.
The Fence class models a synchronization primitive that can be used by applications to explicitly synchronize resource usage, and can be shared by multiple processes.
Fences are most commonly used in association with frame buffers. A FrameBuffer can be associated with a Fence so that the library can wait for the Fence to be signalled before allowing the camera device to actually access the memory area described by the FrameBuffer.
By using a fence, applications can then synchronize between frame buffer consumers and producers, as for example a display device and a camera, to guarantee that a new data transfers only happen once the existing frames have been displayed.
A Fence can be realized by different event notification primitives, the most common of which is represented by waiting for read events to happen on a kernel sync file. This is currently the only mechanism supported by libcamera, but others can be implemented by extending or subclassing this class and implementing opportune handling in the core library.
The Fence class is a thin abstraction around a UniqueFD which simply allows to access it as a const reference or to move its ownership to the caller.
The usage of the Fence class allows to abstract the underlying synchronization mechanism in use and implement an interface towards other library components that will not change when new synchronization primitives will be added as fences.
A Fence is constructed with a UniqueFD whose ownership is moved in the Fence. A FrameBuffer can be associated with a Fence by passing it to the Request::addBuffer() function, which will move the Fence into the FrameBuffer itself. Once a Request is queued to the Camera, a preparation phase guarantees that before actually applying the Request to the hardware, all the valid fences of the frame buffers in a Request are correctly signalled. Once a Fence has completed, the library will release the FrameBuffer fence so that application won't be allowed to access it.
An optional timeout can be started while waiting for a fence to complete. If waiting on a Fence fails for whatever reason, the FrameBuffer's fence is not reset and is made available to application for them to handle it, by releasing the Fence to correctly close the underlying UniqueFD.
A failure in waiting for a Fence to complete will result in the Request to complete in failed state.
libcamera::Fence::Fence | ( | UniqueFD | fd | ) |
|
inline |
Retrieve a constant reference to the file descriptor.
|
inline |
|
inline |
Release the ownership of the file descriptor.
Release the ownership of the wrapped file descriptor by returning it to the caller.