zhangzengfei
2022-07-20 c90c3e794bdd95127d0c34ff1d9e8759d18a0445
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
/******************************************************************************
* FILE:    MyThread.h
* Description:    
*    Critical Section, AutoLock mutex and thread controler Class.
*
* Modified Code History
* Mark    Date        By            Modification Reason
*******************************************************************************
* 01    2007-1-29    songxw    Initial creation.
******************************************************************************/
 
#ifndef __MYTHREAD_H__
#define __MYTHREAD_H__
 
using namespace std;
 
#include <pthread.h>
 
//Class for critical section
class CCritSec
{
public:
    CCritSec()
    {
        pthread_mutex_init(&m_CritSec, NULL);
    }
    
    ~CCritSec()
    {
        pthread_mutex_destroy(&m_CritSec);
    }
    
    void Lock()
    {
        pthread_mutex_lock(&m_CritSec);
    }
    
    void Unlock()
    {
        pthread_mutex_unlock(&m_CritSec);
    }
    int TryLock()
    {
        return pthread_mutex_trylock(&m_CritSec);
    }
private:
    //make copy constructor and assignment operator inaccessible
    CCritSec(const CCritSec &refCritSec);
    CCritSec &operator =(const CCritSec &refCritSec);
    
    pthread_mutex_t m_CritSec;
};
 
// locks a critical section, and unlocks it automatically
// when the lock goes out of scope
class CAutoLock
{
public:
    CAutoLock(CCritSec *pLock)
    {
        m_pLock = pLock;
        m_pLock->Lock();
    }
    
    ~CAutoLock()
    {
        m_pLock->Unlock();
    }
 
private:
    //make copy constructor and assignment operator inaccessible
    CAutoLock(const CAutoLock &refAutoLock);
    CAutoLock &operator =(const CAutoLock &refAutoLock);
 
    CCritSec *m_pLock;
};
class CAutoTryLock
{
public:
    CAutoTryLock(CCritSec *pLock)
    {
        m_pLock = pLock;
    }
    bool TryLock(){ 
        if(m_pLock->TryLock())
        {
            isLock = false;
        }else
            isLock = true;
        return isLock;
    }
    ~CAutoTryLock()
    {
        if(isLock)
            m_pLock->Unlock();
    }
 
private:
    bool isLock;
    //make copy constructor and assignment operator inaccessible
    CAutoTryLock(const CAutoTryLock &refAutoLock);
    CAutoTryLock &operator =(const CAutoTryLock &refAutoLock);
 
    CCritSec *m_pLock;
};
class CAutoBoolSet
{
public:
    CAutoBoolSet(bool* pFlag)
    {
        pVal = pFlag;
        *pVal = true;
    }
    
    ~CAutoBoolSet(void)
    {
        *pVal = false;
    }
    
private:
    bool* pVal;
};
 
#define THREAD_PRIORITY_NORMAL            0            //Note: linux priority: -128 ~ +128
#define THREAD_STACK_SIZE                (32 * 1024)
#define THREAD_PRIORITY_TIME_CRITICAL    15
 
//Class for control thread
class CMyThread  
{
public:
    CMyThread();
    virtual ~CMyThread();
 
    //user callable functions
    int StartThread(int policy = SCHED_FIFO, int Priority = THREAD_PRIORITY_NORMAL, int StackSize = 327680);
    int StopThread(unsigned long timeout = 1000);
    int KillThread();                                //kill the thread immediately, not implemented yet
    bool ThreadStatus(){
        CAutoLock lock(&m_StatusLock);
        bool status = m_bThreadStarted;
        return status;
    };
    void SetThreadStatus(bool status){
        CAutoLock lock(&m_StatusLock);
        m_bThreadStarted = status;
    };
    pthread_t GetThreadID(void) {return m_nThreadID;}
    
protected:
    virtual int ThreadProc() = 0;                    //Main Worker thread function, override
    int CheckStopEvent();
    int SetStopEvent()
    {
        CAutoLock l(&m_EventLock);
        m_hStop = 1;
        return 0;
    }
    bool m_bError;
 
private:
    CCritSec m_EventLock;
    int m_hStop;
    int GetStopEvent()
    {
        CAutoLock l(&m_EventLock);
        return m_hStop;
    }
    
    int ResetStopEvent() { CAutoLock l(&m_EventLock); m_hStop=0; return 0; }
 
private:
    static void *ThreadEntryPoint(void * pParam);     // call this->ThreadProc()
    
    pthread_t    m_nThreadID;
    bool        m_bThreadStarted;
    CCritSec    m_APILock;  // lock for the API calls
    CCritSec    m_StatusLock;
};
 
#endif    //#ifndef __MYTHREAD_H__