[libcamera-devel,00/18] Object & Thread enhancements
mbox series

Message ID 20190812124642.24287-1-laurent.pinchart@ideasonboard.com
Headers show
Series
  • Object & Thread enhancements
Related show

Message

Laurent Pinchart Aug. 12, 2019, 12:46 p.m. UTC
Hello everybody,

This patch series extends the Object and Thread implementations in
libcamera to improve thread affinity handling.

This first patch is a simple cleanup.

Object instances are associated with a thread, and the thread affinity
can be changed with Object::moveToThread(). This moves pending messages
for the object to the message queue of the new thread. Patch 02/18 fixes
a bug in the implementation that forgot to wake up the event loop of the
new thread, and patch 03/18 fixes a bug that prevented dispatching
message to the main thread.

The next three patches split the slot-related classes from signal.h
(04/18), decouple them from the signal implementation (05/18) and use
them to add a new asynchronous method invocation mechanism for the
Object class (06/18). Patch 07/18 then adds a message to notify Object
instances of thread move. The next two patches are new tests for those
APIs.

Patches 10/18 to 12/18 bind CameraManager, EventNotifier and Timer
instances to threads by inheriting from the Object class. The
EventNotifier and Timer classes now support being moved to a different
thread with proper operation with the new thread's event loop. The next
two patches add new tests for those operations.

Patch 15/18 adds a parent-child hierarchy in the Object class, to
simplify moving objects to threads. Patch 16/18 supports this by adding
a parent argument to the constructor of various classes. Patch 17/18
extends the object test to cover the parent-child relationships, and
patch 18/18 shows how they can simplify code.

Laurent Pinchart (18):
  libcamera: object: Make message() method protected
  libcamera: thread: Wake up target thread when moving objects
  libcamera: thread: Support dispatching messages to main thread
  libcamera: signal: Split Slot implementation to reusable classes
  libcamera: bound_method: Decouple from Signal implementation
  libcamera: object: Add an asynchronous method invocation method
  libcamera: object: Notify objects of thread move
  test: Add Object::invokeMethod() test
  test: Add Object class thread affinity test
  libcamera: camera_manager: Bind CameraManager to threads
  libcamera: event_notifier: Bind event notifiers to threads
  libcamera: timer: Bind timers to threads
  test: Add EventNotifier thread move test
  test: Add Timer thread move test
  libcamera: object: Create parent-child relationships
  libcamera: Add parent argument to constructors of Object-derived
    classes
  test: object: Extend object test to verify parent-child relationships
  test: Simplify tests with parent-child relationships

 Documentation/Doxyfile.in               |  10 +-
 include/libcamera/bound_method.h        | 130 +++++++++++++++++++
 include/libcamera/camera_manager.h      |   4 +-
 include/libcamera/event_notifier.h      |  10 +-
 include/libcamera/meson.build           |   1 +
 include/libcamera/object.h              |  32 ++++-
 include/libcamera/signal.h              | 151 +++-------------------
 include/libcamera/timer.h               |  13 +-
 src/libcamera/bound_method.cpp          |  27 ++++
 src/libcamera/camera_manager.cpp        |   4 +-
 src/libcamera/event_dispatcher_poll.cpp |   3 +
 src/libcamera/event_notifier.cpp        |  22 +++-
 src/libcamera/include/message.h         |  22 ++--
 src/libcamera/include/thread.h          |   5 +-
 src/libcamera/meson.build               |   1 +
 src/libcamera/message.cpp               |  50 ++++++--
 src/libcamera/object.cpp                | 120 +++++++++++++++---
 src/libcamera/signal.cpp                |  23 ----
 src/libcamera/thread.cpp                |  26 +++-
 src/libcamera/timer.cpp                 |  33 ++++-
 test/event-thread.cpp                   | 106 ++++++++++++++++
 test/meson.build                        |   4 +
 test/object-invoke.cpp                  | 137 ++++++++++++++++++++
 test/object.cpp                         | 158 ++++++++++++++++++++++++
 test/timer-thread.cpp                   |  72 +++++++++++
 25 files changed, 948 insertions(+), 216 deletions(-)
 create mode 100644 include/libcamera/bound_method.h
 create mode 100644 src/libcamera/bound_method.cpp
 create mode 100644 test/event-thread.cpp
 create mode 100644 test/object-invoke.cpp
 create mode 100644 test/object.cpp
 create mode 100644 test/timer-thread.cpp

Comments

Jacopo Mondi Aug. 15, 2019, 9:59 a.m. UTC | #1
Hi Laurent,

I had only few minor comments and some naive questions on the series,
so please feel free to attach my R-b tag to all patches here, if
relevant.

Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>

Thanks
   j

On Mon, Aug 12, 2019 at 03:46:24PM +0300, Laurent Pinchart wrote:
> Hello everybody,
>
> This patch series extends the Object and Thread implementations in
> libcamera to improve thread affinity handling.
>
> This first patch is a simple cleanup.
>
> Object instances are associated with a thread, and the thread affinity
> can be changed with Object::moveToThread(). This moves pending messages
> for the object to the message queue of the new thread. Patch 02/18 fixes
> a bug in the implementation that forgot to wake up the event loop of the
> new thread, and patch 03/18 fixes a bug that prevented dispatching
> message to the main thread.
>
> The next three patches split the slot-related classes from signal.h
> (04/18), decouple them from the signal implementation (05/18) and use
> them to add a new asynchronous method invocation mechanism for the
> Object class (06/18). Patch 07/18 then adds a message to notify Object
> instances of thread move. The next two patches are new tests for those
> APIs.
>
> Patches 10/18 to 12/18 bind CameraManager, EventNotifier and Timer
> instances to threads by inheriting from the Object class. The
> EventNotifier and Timer classes now support being moved to a different
> thread with proper operation with the new thread's event loop. The next
> two patches add new tests for those operations.
>
> Patch 15/18 adds a parent-child hierarchy in the Object class, to
> simplify moving objects to threads. Patch 16/18 supports this by adding
> a parent argument to the constructor of various classes. Patch 17/18
> extends the object test to cover the parent-child relationships, and
> patch 18/18 shows how they can simplify code.
>
> Laurent Pinchart (18):
>   libcamera: object: Make message() method protected
>   libcamera: thread: Wake up target thread when moving objects
>   libcamera: thread: Support dispatching messages to main thread
>   libcamera: signal: Split Slot implementation to reusable classes
>   libcamera: bound_method: Decouple from Signal implementation
>   libcamera: object: Add an asynchronous method invocation method
>   libcamera: object: Notify objects of thread move
>   test: Add Object::invokeMethod() test
>   test: Add Object class thread affinity test
>   libcamera: camera_manager: Bind CameraManager to threads
>   libcamera: event_notifier: Bind event notifiers to threads
>   libcamera: timer: Bind timers to threads
>   test: Add EventNotifier thread move test
>   test: Add Timer thread move test
>   libcamera: object: Create parent-child relationships
>   libcamera: Add parent argument to constructors of Object-derived
>     classes
>   test: object: Extend object test to verify parent-child relationships
>   test: Simplify tests with parent-child relationships
>
>  Documentation/Doxyfile.in               |  10 +-
>  include/libcamera/bound_method.h        | 130 +++++++++++++++++++
>  include/libcamera/camera_manager.h      |   4 +-
>  include/libcamera/event_notifier.h      |  10 +-
>  include/libcamera/meson.build           |   1 +
>  include/libcamera/object.h              |  32 ++++-
>  include/libcamera/signal.h              | 151 +++-------------------
>  include/libcamera/timer.h               |  13 +-
>  src/libcamera/bound_method.cpp          |  27 ++++
>  src/libcamera/camera_manager.cpp        |   4 +-
>  src/libcamera/event_dispatcher_poll.cpp |   3 +
>  src/libcamera/event_notifier.cpp        |  22 +++-
>  src/libcamera/include/message.h         |  22 ++--
>  src/libcamera/include/thread.h          |   5 +-
>  src/libcamera/meson.build               |   1 +
>  src/libcamera/message.cpp               |  50 ++++++--
>  src/libcamera/object.cpp                | 120 +++++++++++++++---
>  src/libcamera/signal.cpp                |  23 ----
>  src/libcamera/thread.cpp                |  26 +++-
>  src/libcamera/timer.cpp                 |  33 ++++-
>  test/event-thread.cpp                   | 106 ++++++++++++++++
>  test/meson.build                        |   4 +
>  test/object-invoke.cpp                  | 137 ++++++++++++++++++++
>  test/object.cpp                         | 158 ++++++++++++++++++++++++
>  test/timer-thread.cpp                   |  72 +++++++++++
>  25 files changed, 948 insertions(+), 216 deletions(-)
>  create mode 100644 include/libcamera/bound_method.h
>  create mode 100644 src/libcamera/bound_method.cpp
>  create mode 100644 test/event-thread.cpp
>  create mode 100644 test/object-invoke.cpp
>  create mode 100644 test/object.cpp
>  create mode 100644 test/timer-thread.cpp
>
> --
> Regards,
>
> Laurent Pinchart
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel@lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel