summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-10-28 05:44:14 +0200
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-10-29 16:44:45 +0200
commit06008b9156b74885aa2382dec9dc8c7854ca6f2e (patch)
treeb9ad44960cab2045a41c58bd20b68e1be9b7ab4d
parent8524e6261175549575d3bf82bcce31cb615a5717 (diff)
libcamera: object: Use bound method activePack() for invokeMethod()
The BoundMethodBase::activatePack() and the internal Object::invokeMethod() are duplicate implementation of the same mechanism. Use the former to replace the latter. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
-rw-r--r--include/libcamera/bound_method.h4
-rw-r--r--include/libcamera/object.h8
-rw-r--r--src/libcamera/bound_method.cpp6
-rw-r--r--src/libcamera/object.cpp7
4 files changed, 9 insertions, 16 deletions
diff --git a/include/libcamera/bound_method.h b/include/libcamera/bound_method.h
index 06c5a3b1..bdeb5469 100644
--- a/include/libcamera/bound_method.h
+++ b/include/libcamera/bound_method.h
@@ -37,7 +37,7 @@ public:
Object *object() const { return object_; }
ConnectionType connectionType() const { return connectionType_; }
- void activatePack(void *pack);
+ void activatePack(void *pack, bool deleteMethod);
virtual void invokePack(void *pack) = 0;
protected:
@@ -109,7 +109,7 @@ public:
void activate(Args... args)
{
if (this->object_)
- BoundMethodBase::activatePack(new PackType{ args... });
+ BoundMethodBase::activatePack(new PackType{ args... }, false);
else
(static_cast<T *>(this->obj_)->*func_)(args...);
}
diff --git a/include/libcamera/object.h b/include/libcamera/object.h
index 3308330a..603a2292 100644
--- a/include/libcamera/object.h
+++ b/include/libcamera/object.h
@@ -33,10 +33,12 @@ public:
void invokeMethod(void (T::*func)(Args...), Args... args)
{
T *obj = static_cast<T *>(this);
- BoundMethodBase *method = new BoundMemberMethod<T, Args...>(obj, this, func);
+ BoundMethodBase *method =
+ new BoundMemberMethod<T, Args...>(obj, this, func,
+ ConnectionTypeQueued);
void *pack = new typename BoundMemberMethod<T, Args...>::PackType{ args... };
- invokeMethod(method, pack);
+ method->activatePack(pack, true);
}
Thread *thread() const { return thread_; }
@@ -53,8 +55,6 @@ private:
friend class BoundMethodBase;
friend class Thread;
- void invokeMethod(BoundMethodBase *method, void *pack);
-
void notifyThreadMove();
void connect(SignalBase *signal);
diff --git a/src/libcamera/bound_method.cpp b/src/libcamera/bound_method.cpp
index 60071736..4c0cd415 100644
--- a/src/libcamera/bound_method.cpp
+++ b/src/libcamera/bound_method.cpp
@@ -48,7 +48,7 @@ namespace libcamera {
* deadlock will occur.
*/
-void BoundMethodBase::activatePack(void *pack)
+void BoundMethodBase::activatePack(void *pack, bool deleteMethod)
{
ConnectionType type = connectionType_;
if (type == ConnectionTypeAuto) {
@@ -66,7 +66,7 @@ void BoundMethodBase::activatePack(void *pack)
case ConnectionTypeQueued: {
std::unique_ptr<Message> msg =
- utils::make_unique<InvokeMessage>(this, pack);
+ utils::make_unique<InvokeMessage>(this, pack, nullptr, deleteMethod);
object_->postMessage(std::move(msg));
break;
}
@@ -75,7 +75,7 @@ void BoundMethodBase::activatePack(void *pack)
Semaphore semaphore;
std::unique_ptr<Message> msg =
- utils::make_unique<InvokeMessage>(this, pack, &semaphore);
+ utils::make_unique<InvokeMessage>(this, pack, &semaphore, deleteMethod);
object_->postMessage(std::move(msg));
semaphore.acquire();
diff --git a/src/libcamera/object.cpp b/src/libcamera/object.cpp
index b0818f9a..509b2eba 100644
--- a/src/libcamera/object.cpp
+++ b/src/libcamera/object.cpp
@@ -153,13 +153,6 @@ void Object::message(Message *msg)
* remains valid until the method is invoked.
*/
-void Object::invokeMethod(BoundMethodBase *method, void *args)
-{
- std::unique_ptr<Message> msg =
- utils::make_unique<InvokeMessage>(method, args, nullptr, true);
- postMessage(std::move(msg));
-}
-
/**
* \fn Object::thread()
* \brief Retrieve the thread the object is bound to