summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-01-04 04:18:05 +0200
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-01-07 22:29:31 +0200
commitb0135a1522ed4217a8deb7929fdb36276e58161b (patch)
tree2a435222aefe9f9440818626b0add617666270e9 /src
parent621edb2367e81860f6b6e89243ad7cbe3e0b6b7f (diff)
libcamera: bound_method: Manage BoundMethodPack through std::shared_ptr
The bound method arguments pack will need to be accessed by the method invoker in order to retrieve the method return value when using a blocking connection type. We thus can't delete the pack unconditionally in the bound method target thread. We also can't delete it unconditionally in the invoker's thread, as for queued connections the pack will be used in the target thread after the invoker completes. This shows that ownership of the arguments pack is shared between two contexts. As a result, manage it using std::shared_ptr<>. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Diffstat (limited to 'src')
-rw-r--r--src/libcamera/bound_method.cpp5
-rw-r--r--src/libcamera/include/message.h5
-rw-r--r--src/libcamera/message.cpp5
3 files changed, 9 insertions, 6 deletions
diff --git a/src/libcamera/bound_method.cpp b/src/libcamera/bound_method.cpp
index 45c76577..82339b7e 100644
--- a/src/libcamera/bound_method.cpp
+++ b/src/libcamera/bound_method.cpp
@@ -48,7 +48,8 @@ namespace libcamera {
* deadlock will occur.
*/
-void BoundMethodBase::activatePack(void *pack, bool deleteMethod)
+void BoundMethodBase::activatePack(std::shared_ptr<BoundMethodPackBase> pack,
+ bool deleteMethod)
{
ConnectionType type = connectionType_;
if (type == ConnectionTypeAuto) {
@@ -61,7 +62,7 @@ void BoundMethodBase::activatePack(void *pack, bool deleteMethod)
switch (type) {
case ConnectionTypeDirect:
default:
- invokePack(pack);
+ invokePack(pack.get());
if (deleteMethod)
delete this;
break;
diff --git a/src/libcamera/include/message.h b/src/libcamera/include/message.h
index 311755cc..8e8b013d 100644
--- a/src/libcamera/include/message.h
+++ b/src/libcamera/include/message.h
@@ -48,7 +48,8 @@ private:
class InvokeMessage : public Message
{
public:
- InvokeMessage(BoundMethodBase *method, void *pack,
+ InvokeMessage(BoundMethodBase *method,
+ std::shared_ptr<BoundMethodPackBase> pack,
Semaphore *semaphore = nullptr,
bool deleteMethod = false);
~InvokeMessage();
@@ -59,7 +60,7 @@ public:
private:
BoundMethodBase *method_;
- void *pack_;
+ std::shared_ptr<BoundMethodPackBase> pack_;
Semaphore *semaphore_;
bool deleteMethod_;
};
diff --git a/src/libcamera/message.cpp b/src/libcamera/message.cpp
index c35bb33d..77f2bdd5 100644
--- a/src/libcamera/message.cpp
+++ b/src/libcamera/message.cpp
@@ -123,7 +123,8 @@ Message::Type Message::registerMessageType()
* \param[in] deleteMethod True to delete the \a method when the message is
* destroyed
*/
-InvokeMessage::InvokeMessage(BoundMethodBase *method, void *pack,
+InvokeMessage::InvokeMessage(BoundMethodBase *method,
+ std::shared_ptr<BoundMethodPackBase> pack,
Semaphore *semaphore, bool deleteMethod)
: Message(Message::InvokeMessage), method_(method), pack_(pack),
semaphore_(semaphore), deleteMethod_(deleteMethod)
@@ -148,7 +149,7 @@ InvokeMessage::~InvokeMessage()
*/
void InvokeMessage::invoke()
{
- method_->invokePack(pack_);
+ method_->invokePack(pack_.get());
}
/**