1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 /* SPDX-License-Identifier: LGPL-2.1-or-later */ /* * Copyright (C) 2019, Collabora Ltd. * Author: Nicolas Dufresne <nicolas.dufresne@collabora.com> * * gstlibcamera.c - GStreamer plugin */ #include "gstlibcameraprovider.h" #include "gstlibcamerasrc.h" static gboolean plugin_init(GstPlugin *plugin) { if (!gst_element_register(plugin, "libcamerasrc", GST_RANK_PRIMARY, GST_TYPE_LIBCAMERA_SRC) || !gst_device_provider_register(plugin, "libcameraprovider", GST_RANK_PRIMARY, GST_TYPE_LIBCAMERA_PROVIDER)) return FALSE; return TRUE; } GST_PLUGIN_DEFINE(GST_VERSION_MAJOR, GST_VERSION_MINOR/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Copyright (C) 2024, Ideas on Board Oy * * timer-fail.cpp - Threaded timer failure test */ #include <chrono> #include <iostream> #include <libcamera/base/event_dispatcher.h> #include <libcamera/base/object.h> #include <libcamera/base/thread.h> #include <libcamera/base/timer.h> #include "test.h" using namespace libcamera; using namespace std; using namespace std::chrono_literals; class TimeoutHandler : public Object { public: TimeoutHandler() : timer_(this), timeout_(false) { timer_.timeout.connect(this, &TimeoutHandler::timeoutHandler); } void start() { timer_.start(100ms); } bool timeout() const { return timeout_; } private: void timeoutHandler() { timeout_ = true; } Timer timer_; bool timeout_; }; class TimerFailTest : public Test { protected: int init() { thread_.start(); timeout_ = new TimeoutHandler(); timeout_->moveToThread(&thread_); return TestPass; } int run() { /* * Test that the forbidden operation of starting the timer from * another thread results in a failure. We need to interrupt the * event dispatcher to make sure we don't succeed simply because * the event dispatcher hasn't noticed the timer restart. */ timeout_->start(); thread_.eventDispatcher()->interrupt(); this_thread::sleep_for(chrono::milliseconds(200)); /* * The wrong start() call should result in an assertion in debug * builds, and a timeout in release builds. The test is * therefore marked in meson.build as expected to fail. We need * to return TestPass in the unexpected (usually known as * "fail") case, and TestFail otherwise. */ if (timeout_->timeout()) { cout << "Timer start from wrong thread succeeded unexpectedly" << endl; return TestPass; } return TestFail; } void cleanup() { /* * Object class instances must be destroyed from the thread * they live in. */ timeout_->deleteLater(); thread_.exit(0); thread_.wait(); } private: TimeoutHandler *timeout_; Thread thread_; }; TEST_REGISTER(TimerFailTest)