This replaces Mutex and MutexLocker with our own defined classes. The classes are annotated by clang thread safety annotations. So we can add annotation to code where the classes are used. v4l2 code needs to be annotated, which violates Mutex capability. Signed-off-by: Hirokazu Honda <hiroh@chromium.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
74 lines
1.3 KiB
C++
74 lines
1.3 KiB
C++
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
/*
|
|
* Copyright (C) 2019, Google Inc.
|
|
*
|
|
* thread.h - Thread support
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <memory>
|
|
#include <sys/types.h>
|
|
#include <thread>
|
|
|
|
#include <libcamera/base/private.h>
|
|
|
|
#include <libcamera/base/message.h>
|
|
#include <libcamera/base/mutex.h>
|
|
#include <libcamera/base/signal.h>
|
|
#include <libcamera/base/utils.h>
|
|
|
|
namespace libcamera {
|
|
|
|
class EventDispatcher;
|
|
class Message;
|
|
class Object;
|
|
class ThreadData;
|
|
class ThreadMain;
|
|
|
|
class Thread
|
|
{
|
|
public:
|
|
Thread();
|
|
virtual ~Thread();
|
|
|
|
void start();
|
|
void exit(int code = 0);
|
|
bool wait(utils::duration duration = utils::duration::max());
|
|
|
|
bool isRunning();
|
|
|
|
Signal<> finished;
|
|
|
|
static Thread *current();
|
|
static pid_t currentId();
|
|
|
|
EventDispatcher *eventDispatcher();
|
|
|
|
void dispatchMessages(Message::Type type = Message::Type::None);
|
|
|
|
protected:
|
|
int exec();
|
|
virtual void run();
|
|
|
|
private:
|
|
void startThread();
|
|
void finishThread();
|
|
|
|
void postMessage(std::unique_ptr<Message> msg, Object *receiver);
|
|
void removeMessages(Object *receiver);
|
|
|
|
friend class Object;
|
|
friend class ThreadData;
|
|
friend class ThreadMain;
|
|
|
|
void moveObject(Object *object);
|
|
void moveObject(Object *object, ThreadData *currentData,
|
|
ThreadData *targetData);
|
|
|
|
std::thread thread_;
|
|
ThreadData *data_;
|
|
};
|
|
|
|
} /* namespace libcamera */
|