summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo@jmondi.org>2019-10-27 02:45:17 +0200
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-10-29 16:44:46 +0200
commitfb1a5c0416ebd516a5ef01ba76deed1b602828ba (patch)
tree58a18ff78d6179a3deedb74750aca2214fce7d39
parent06008b9156b74885aa2382dec9dc8c7854ca6f2e (diff)
libcamera: object: Add connection type parameter to invokeMethod()
Allow specifying a different connection type than ConnectionTypeQueued for Object::invokeMethod(). Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
-rw-r--r--include/libcamera/object.h5
-rw-r--r--src/android/camera_proxy.cpp3
-rw-r--r--src/libcamera/event_notifier.cpp3
-rw-r--r--src/libcamera/object.cpp9
-rw-r--r--src/libcamera/timer.cpp3
-rw-r--r--test/object-invoke.cpp14
6 files changed, 21 insertions, 16 deletions
diff --git a/include/libcamera/object.h b/include/libcamera/object.h
index 603a2292..91b56596 100644
--- a/include/libcamera/object.h
+++ b/include/libcamera/object.h
@@ -30,12 +30,11 @@ public:
void postMessage(std::unique_ptr<Message> msg);
template<typename T, typename... Args, typename std::enable_if<std::is_base_of<Object, T>::value>::type * = nullptr>
- void invokeMethod(void (T::*func)(Args...), Args... args)
+ void invokeMethod(void (T::*func)(Args...), ConnectionType type, Args... args)
{
T *obj = static_cast<T *>(this);
BoundMethodBase *method =
- new BoundMemberMethod<T, Args...>(obj, this, func,
- ConnectionTypeQueued);
+ new BoundMemberMethod<T, Args...>(obj, this, func, type);
void *pack = new typename BoundMemberMethod<T, Args...>::PackType{ args... };
method->activatePack(pack, true);
diff --git a/src/android/camera_proxy.cpp b/src/android/camera_proxy.cpp
index 4f5c0a02..43e1e1c3 100644
--- a/src/android/camera_proxy.cpp
+++ b/src/android/camera_proxy.cpp
@@ -187,6 +187,7 @@ int CameraProxy::processCaptureRequest(camera3_capture_request_t *request)
void CameraProxy::threadRpcCall(ThreadRpc &rpcRequest)
{
- cameraDevice_->invokeMethod(&CameraDevice::call, &rpcRequest);
+ cameraDevice_->invokeMethod(&CameraDevice::call, ConnectionTypeQueued,
+ &rpcRequest);
rpcRequest.waitDelivery();
}
diff --git a/src/libcamera/event_notifier.cpp b/src/libcamera/event_notifier.cpp
index 687969b0..4326b0b4 100644
--- a/src/libcamera/event_notifier.cpp
+++ b/src/libcamera/event_notifier.cpp
@@ -128,7 +128,8 @@ void EventNotifier::message(Message *msg)
if (msg->type() == Message::ThreadMoveMessage) {
if (enabled_) {
setEnabled(false);
- invokeMethod(&EventNotifier::setEnabled, true);
+ invokeMethod(&EventNotifier::setEnabled,
+ ConnectionTypeQueued, true);
}
}
diff --git a/src/libcamera/object.cpp b/src/libcamera/object.cpp
index 509b2eba..db2c6f68 100644
--- a/src/libcamera/object.cpp
+++ b/src/libcamera/object.cpp
@@ -139,14 +139,15 @@ void Object::message(Message *msg)
}
/**
- * \fn void Object::invokeMethod(void (T::*func)(Args...), Args... args)
+ * \fn void Object::invokeMethod()
* \brief Invoke a method asynchronously on an Object instance
* \param[in] func The object method to invoke
+ * \param[in] type Connection type for method invocation
* \param[in] args The method arguments
*
- * This method invokes the member method \a func when control returns to the
- * event loop of the object's thread. The method is executed in the object's
- * thread with arguments \a args.
+ * This method invokes the member method \a func with arguments \a args, based
+ * on the connection \a type. Depending on the type, the method will be called
+ * synchronously in the same thread or asynchronously in the object's thread.
*
* Arguments \a args passed by value or reference are copied, while pointers
* are passed untouched. The caller shall ensure that any pointer argument
diff --git a/src/libcamera/timer.cpp b/src/libcamera/timer.cpp
index ddb20954..4c688832 100644
--- a/src/libcamera/timer.cpp
+++ b/src/libcamera/timer.cpp
@@ -170,7 +170,8 @@ void Timer::message(Message *msg)
if (msg->type() == Message::ThreadMoveMessage) {
if (isRunning()) {
unregisterTimer();
- invokeMethod(&Timer::registerTimer);
+ invokeMethod(&Timer::registerTimer,
+ ConnectionTypeQueued);
}
}
diff --git a/test/object-invoke.cpp b/test/object-invoke.cpp
index 37a27440..f6ae2604 100644
--- a/test/object-invoke.cpp
+++ b/test/object-invoke.cpp
@@ -64,10 +64,11 @@ protected:
InvokedObject object;
/*
- * Test that method invocation in the same thread goes through
- * the event dispatcher.
+ * Test that queued method invocation in the same thread goes
+ * through the event dispatcher.
*/
- object.invokeMethod(&InvokedObject::method, 42);
+ object.invokeMethod(&InvokedObject::method,
+ ConnectionTypeQueued, 42);
if (object.status() != InvokedObject::NoCall) {
cerr << "Method not invoked asynchronously" << endl;
@@ -93,15 +94,16 @@ protected:
}
/*
- * Move the object to a thread and verify that the method is
- * delivered in the correct thread.
+ * Move the object to a thread and verify that auto method
+ * invocation is delivered in the correct thread.
*/
object.reset();
object.moveToThread(&thread_);
thread_.start();
- object.invokeMethod(&InvokedObject::method, 42);
+ object.invokeMethod(&InvokedObject::method,
+ ConnectionTypeAuto, 42);
this_thread::sleep_for(chrono::milliseconds(100));
switch (object.status()) {