mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-24 17:15:07 +03:00
libcamera: camera: Ensure deletion via deleteLater()
Object::deleteLater() ensures that the deletion of the Object takes place in a thread it is bound to. Deleting the Object in a different thread is a violation according to the libcamera threading model. On hot-unplug of a currently streaming camera, the last reference of Camera when dropped from the application thread (for e.g. QCam's thread), the destructor is then called from this thread. This is not allowed by the libcamera threading model. Camera is meant to be deleted in the thread it is bound to - in this case the CameraManager's thread. Signed-off-by: Umang Jain <email@uajain.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
9c5f821396
commit
f2df5abe5d
3 changed files with 8 additions and 3 deletions
|
@ -13,6 +13,7 @@
|
|||
#include <string>
|
||||
|
||||
#include <libcamera/controls.h>
|
||||
#include <libcamera/object.h>
|
||||
#include <libcamera/request.h>
|
||||
#include <libcamera/signal.h>
|
||||
#include <libcamera/stream.h>
|
||||
|
@ -66,7 +67,7 @@ protected:
|
|||
std::vector<StreamConfiguration> config_;
|
||||
};
|
||||
|
||||
class Camera final : public std::enable_shared_from_this<Camera>
|
||||
class Camera final : public Object, public std::enable_shared_from_this<Camera>
|
||||
{
|
||||
public:
|
||||
static std::shared_ptr<Camera> create(PipelineHandler *pipe,
|
||||
|
|
|
@ -464,7 +464,7 @@ std::shared_ptr<Camera> Camera::create(PipelineHandler *pipe,
|
|||
struct Deleter : std::default_delete<Camera> {
|
||||
void operator()(Camera *camera)
|
||||
{
|
||||
delete camera;
|
||||
camera->deleteLater();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -164,9 +164,13 @@ void CameraManager::Private::cleanup()
|
|||
|
||||
/*
|
||||
* Release all references to cameras to ensure they all get destroyed
|
||||
* before the device enumerator deletes the media devices.
|
||||
* before the device enumerator deletes the media devices. Cameras are
|
||||
* destroyed via Object::deleteLater() API, hence we need to explicitly
|
||||
* process deletion requests from the thread's message queue as the event
|
||||
* loop is not in action here.
|
||||
*/
|
||||
cameras_.clear();
|
||||
dispatchMessages(Message::Type::DeferredDelete);
|
||||
|
||||
enumerator_.reset(nullptr);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue