summaryrefslogtreecommitdiff
path: root/src/libcamera/base
diff options
context:
space:
mode:
authorKieran Bingham <kieran.bingham@ideasonboard.com>2021-06-25 02:06:55 +0100
committerKieran Bingham <kieran.bingham@ideasonboard.com>2021-06-25 16:11:10 +0100
commitf9ee72430735f749fb7d8fd4a8fe01ca88dc1f88 (patch)
tree3de5662a1ad584c4e69449fe8b00cdfedae8399c /src/libcamera/base
parentb304bc013ef8022131ef0a146f20c6bad7ac45d5 (diff)
libcamera/base: Move event_notifier to base
Move the event notifier, and associated header updates. Reviewed-by: Hirokazu Honda <hiroh@chromium.org> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Diffstat (limited to 'src/libcamera/base')
-rw-r--r--src/libcamera/base/event_dispatcher_poll.cpp3
-rw-r--r--src/libcamera/base/event_notifier.cpp141
-rw-r--r--src/libcamera/base/meson.build1
3 files changed, 143 insertions, 2 deletions
diff --git a/src/libcamera/base/event_dispatcher_poll.cpp b/src/libcamera/base/event_dispatcher_poll.cpp
index d76ca7fc..5839373a 100644
--- a/src/libcamera/base/event_dispatcher_poll.cpp
+++ b/src/libcamera/base/event_dispatcher_poll.cpp
@@ -16,13 +16,12 @@
#include <sys/eventfd.h>
#include <unistd.h>
+#include <libcamera/base/event_notifier.h>
#include <libcamera/base/log.h>
#include <libcamera/base/thread.h>
#include <libcamera/base/timer.h>
#include <libcamera/base/utils.h>
-#include "libcamera/internal/event_notifier.h"
-
/**
* \file base/event_dispatcher_poll.h
*/
diff --git a/src/libcamera/base/event_notifier.cpp b/src/libcamera/base/event_notifier.cpp
new file mode 100644
index 00000000..fd93c087
--- /dev/null
+++ b/src/libcamera/base/event_notifier.cpp
@@ -0,0 +1,141 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * event_notifier.cpp - File descriptor event notifier
+ */
+
+#include <libcamera/base/event_notifier.h>
+
+#include <libcamera/base/event_dispatcher.h>
+#include <libcamera/base/message.h>
+#include <libcamera/base/thread.h>
+
+#include <libcamera/camera_manager.h>
+
+/**
+ * \file event_notifier.h
+ * \brief File descriptor event notifier
+ */
+
+namespace libcamera {
+
+/**
+ * \class EventNotifier
+ * \brief Notify of activity on a file descriptor
+ *
+ * The EventNotifier models a file descriptor event source that can be
+ * monitored. It is created with the file descriptor to be monitored and the
+ * type of event, and is enabled by default. It will emit the \ref activated
+ * signal whenever an event of the monitored type occurs on the file descriptor.
+ *
+ * Supported type of events are EventNotifier::Read, EventNotifier::Write and
+ * EventNotifier::Exception. The type is specified when constructing the
+ * notifier, and can be retrieved using the type() function. To listen to
+ * multiple event types on the same file descriptor multiple notifiers must be
+ * created.
+ *
+ * The notifier can be disabled with the setEnabled() function. When the notifier
+ * is disabled it ignores events and does not emit the \ref activated signal.
+ * The notifier can then be re-enabled with the setEnabled() function.
+ *
+ * Creating multiple notifiers of the same type for the same file descriptor is
+ * not allowed and results in undefined behaviour.
+ *
+ * Notifier events are detected and dispatched from the
+ * EventDispatcher::processEvents() function.
+ */
+
+/**
+ * \enum EventNotifier::Type
+ * Type of file descriptor event to listen for.
+ * \var EventNotifier::Read
+ * Data is available to be read from the file descriptor
+ * \var EventNotifier::Write
+ * Data can be written to the file descriptor
+ * \var EventNotifier::Exception
+ * An exception has occurred on the file descriptor
+ */
+
+/**
+ * \brief Construct an event notifier with a file descriptor and event type
+ * \param[in] fd The file descriptor to monitor
+ * \param[in] type The event type to monitor
+ * \param[in] parent The parent Object
+ */
+EventNotifier::EventNotifier(int fd, Type type, Object *parent)
+ : Object(parent), fd_(fd), type_(type), enabled_(false)
+{
+ setEnabled(true);
+}
+
+EventNotifier::~EventNotifier()
+{
+ setEnabled(false);
+}
+
+/**
+ * \fn EventNotifier::type()
+ * \brief Retrieve the type of the event being monitored
+ * \return The type of the event
+ */
+
+/**
+ * \fn EventNotifier::fd()
+ * \brief Retrieve the file descriptor being monitored
+ * \return The file descriptor
+ */
+
+/**
+ * \fn EventNotifier::enabled()
+ * \brief Retrieve the notifier state
+ * \return True if the notifier is enabled, or false otherwise
+ * \sa setEnabled()
+ */
+
+/**
+ * \brief Enable or disable the notifier
+ * \param[in] enable True to enable the notifier, false to disable it
+ *
+ * This function enables or disables the notifier. A disabled notifier ignores
+ * events and does not emit the \ref activated signal.
+ *
+ * \context This function is \threadbound.
+ */
+void EventNotifier::setEnabled(bool enable)
+{
+ if (enabled_ == enable)
+ return;
+
+ enabled_ = enable;
+
+ EventDispatcher *dispatcher = thread()->eventDispatcher();
+ if (enable)
+ dispatcher->registerEventNotifier(this);
+ else
+ dispatcher->unregisterEventNotifier(this);
+}
+
+/**
+ * \var EventNotifier::activated
+ * \brief Signal emitted when the event occurs
+ *
+ * This signal is emitted when the event \ref type() occurs on the file
+ * descriptor monitored by the notifier. The notifier pointer is passed as a
+ * parameter.
+ */
+
+void EventNotifier::message(Message *msg)
+{
+ if (msg->type() == Message::ThreadMoveMessage) {
+ if (enabled_) {
+ setEnabled(false);
+ invokeMethod(&EventNotifier::setEnabled,
+ ConnectionTypeQueued, true);
+ }
+ }
+
+ Object::message(msg);
+}
+
+} /* namespace libcamera */
diff --git a/src/libcamera/base/meson.build b/src/libcamera/base/meson.build
index fb8ed79a..a8b04cfc 100644
--- a/src/libcamera/base/meson.build
+++ b/src/libcamera/base/meson.build
@@ -5,6 +5,7 @@ libcamera_base_sources = files([
'bound_method.cpp',
'event_dispatcher.cpp',
'event_dispatcher_poll.cpp',
+ 'event_notifier.cpp',
'file.cpp',
'log.cpp',
'message.cpp',