Deskflow 1.22.0.197
Keyboard and mouse sharing utility
Loading...
Searching...
No Matches
ArchMultithreadPosix.h
Go to the documentation of this file.
1/*
2 * Deskflow -- mouse and keyboard sharing utility
3 * SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd.
4 * SPDX-FileCopyrightText: (C) 2002 Chris Schoeneman
5 * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
6 */
7
8#pragma once
9
11
12#include <list>
13#include <mutex>
14#include <pthread.h>
15
16#define ARCH_MULTITHREAD ArchMultithreadPosix
17
19{
20public:
21 pthread_cond_t m_cond;
22};
23
25{
26public:
27 pthread_mutex_t m_mutex;
28};
29
32{
33public:
37 ~ArchMultithreadPosix() override;
38
41
43
44
46
48
50
52
54
56
57 // IArchMultithread overrides
58 ArchCond newCondVar() override;
59 void closeCondVar(ArchCond) override;
60 void signalCondVar(ArchCond) override;
61 void broadcastCondVar(ArchCond) override;
62 bool waitCondVar(ArchCond, ArchMutex, double timeout) override;
63 ArchMutex newMutex() override;
64 void closeMutex(ArchMutex) override;
65 void lockMutex(ArchMutex) override;
66 void unlockMutex(ArchMutex) override;
67 ArchThread newThread(ThreadFunc, void *) final;
70 void closeThread(ArchThread) final;
71 void cancelThread(ArchThread) override;
72 void setPriorityOfThread(ArchThread, int n) override;
73 void testCancelThread() override;
74 bool wait(ArchThread, double timeout) override;
75 bool isSameThread(ArchThread, ArchThread) override;
76 bool isExitedThread(ArchThread) override;
77 void *getResultOfThread(ArchThread) override;
79 void setSignalHandler(ThreadSignal, SignalFunc, void *) override;
80 void raiseSignal(ThreadSignal) override;
81
82private:
83 void startSignalHandler();
84
85 ArchThreadImpl *find(pthread_t thread);
86 ArchThreadImpl *findNoRef(pthread_t thread);
87 void insert(ArchThreadImpl *thread);
88 void erase(const ArchThreadImpl *thread);
89
90 void refThread(ArchThreadImpl *rep);
91 void testCancelThreadImpl(ArchThreadImpl *rep);
92
93 void doThreadFunc(ArchThread thread);
94 static void *threadFunc(void *vrep);
95 static void threadCancel(int);
96 static void *threadSignalHandler(void *vrep);
97
98 using ThreadList = std::list<ArchThread>;
99
100 static ArchMultithreadPosix *s_instance;
101
102 bool m_newThreadCalled = false;
103
104 std::mutex m_threadMutex;
105 ArchThread m_mainThread;
106 ThreadList m_threadList;
107 ThreadID m_nextID = 0;
108
109 pthread_t m_signalThread;
110 SignalFunc m_signalFunc[static_cast<int>(ThreadSignal::MaxSignals)];
111 void *m_signalUserData[static_cast<int>(ThreadSignal::MaxSignals)];
112};
static fd_set FAR fd_set FAR fd_set FAR const struct timeval FAR * timeout
Definition ArchNetworkWinsock.cpp:39
ArchThreadImpl * ArchThread
Opaque thread type. An opaque type representing a thread.
Definition IArchMultithread.h:53
ArchMutexImpl * ArchMutex
Opaque mutex type. An opaque type representing a mutex.
Definition IArchMultithread.h:39
ArchCondImpl * ArchCond
Opaque condition variable type. An opaque type representing a condition variable.
Definition IArchMultithread.h:25
Internal condition variable data. An architecture dependent type holding the necessary data for a con...
Definition ArchMultithreadPosix.h:19
pthread_cond_t m_cond
Definition ArchMultithreadPosix.h:21
~ArchMultithreadPosix() override
Definition ArchMultithreadPosix.cpp:101
void * getNetworkDataForThread(ArchThread)
Definition ArchMultithreadPosix.cpp:114
void closeThread(ArchThread) final
Release a thread reference.
Definition ArchMultithreadPosix.cpp:328
void broadcastCondVar(ArchCond) override
Broadcast a condition variable.
Definition ArchMultithreadPosix.cpp:149
ArchMultithreadPosix & operator=(ArchMultithreadPosix const &)=delete
void setPriorityOfThread(ArchThread, int n) override
Change thread priority.
Definition ArchMultithreadPosix.cpp:378
void * getResultOfThread(ArchThread) override
Returns the exit code of a thread.
Definition ArchMultithreadPosix.cpp:459
bool wait(ArchThread, double timeout) override
Wait for a thread to exit.
Definition ArchMultithreadPosix.cpp:397
void cancelThread(ArchThread) override
Force a thread to exit.
Definition ArchMultithreadPosix.cpp:357
ArchMultithreadPosix & operator=(ArchMultithreadPosix &&)=delete
ArchMultithreadPosix(ArchMultithreadPosix &&)=delete
void closeMutex(ArchMutex) override
Destroy a mutex.
Definition ArchMultithreadPosix.cpp:219
bool isSameThread(ArchThread, ArchThread) override
Compare threads.
Definition ArchMultithreadPosix.cpp:448
ArchCond newCondVar() override
Create a condition variable.
Definition ArchMultithreadPosix.cpp:125
ArchMultithreadPosix()
Definition ArchMultithreadPosix.cpp:57
void closeCondVar(ArchCond) override
Destroy a condition variable.
Definition ArchMultithreadPosix.cpp:134
void testCancelThread() override
Cancellation point.
Definition ArchMultithreadPosix.cpp:385
ArchThread newThread(ThreadFunc, void *) final
Start a new thread.
Definition ArchMultithreadPosix.cpp:271
void lockMutex(ArchMutex) override
Lock a mutex.
Definition ArchMultithreadPosix.cpp:227
ArchThread newCurrentThread() override
Get a reference to the calling thread.
Definition ArchMultithreadPosix.cpp:320
void unlockMutex(ArchMutex) override
Unlock a mutex.
Definition ArchMultithreadPosix.cpp:250
bool waitCondVar(ArchCond, ArchMutex, double timeout) override
Wait on a condition variable.
Definition ArchMultithreadPosix.cpp:156
bool isExitedThread(ArchThread) override
Test if thread exited.
Definition ArchMultithreadPosix.cpp:453
ArchMutex newMutex() override
Create a recursive mutex.
Definition ArchMultithreadPosix.cpp:208
void setNetworkDataForCurrentThread(void *)
Definition ArchMultithreadPosix.cpp:107
void raiseSignal(ThreadSignal) override
Invoke the signal handler.
Definition ArchMultithreadPosix.cpp:478
ThreadID getIDOfThread(ArchThread) override
Returns an ID for a thread.
Definition ArchMultithreadPosix.cpp:465
void signalCondVar(ArchCond) override
Signal a condition variable.
Definition ArchMultithreadPosix.cpp:142
ArchThread copyThread(ArchThread) override
Copy a thread object.
Definition ArchMultithreadPosix.cpp:351
static ArchMultithreadPosix * getInstance()
Definition ArchMultithreadPosix.cpp:120
ArchMultithreadPosix(ArchMultithreadPosix const &)=delete
void setSignalHandler(ThreadSignal, SignalFunc, void *) override
Set the interrupt handler.
Definition ArchMultithreadPosix.cpp:470
Internal mutex data. An architecture dependent type holding the necessary data for a mutex.
Definition ArchMultithreadPosix.h:25
pthread_mutex_t m_mutex
Definition ArchMultithreadPosix.h:27
Internal thread data. An architecture dependent type holding the necessary data for a thread.
Definition ArchMultithreadPosix.cpp:34
Interface for architecture dependent multithreading.
Definition IArchMultithread.h:61
void *(*)(void *) ThreadFunc
Type of thread entry point.
Definition IArchMultithread.h:64
unsigned int ThreadID
Type of thread identifier.
Definition IArchMultithread.h:66
void(*)(ThreadSignal, void *userData) SignalFunc
Type of signal handler function.
Definition IArchMultithread.h:81
ThreadSignal
Types of signals.
Definition IArchMultithread.h:73
@ MaxSignals
Number of differnt signals.
Definition IArchMultithread.h:78