forked from u-n-k-n-o-w-n/BonDriverProxy_Linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTsQueue.h
More file actions
134 lines (121 loc) · 1.93 KB
/
TsQueue.h
File metadata and controls
134 lines (121 loc) · 1.93 KB
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
#ifndef __TSQUEUE_H__
#define __TSQUEUE_H__
struct TS_DATA {
#ifdef __BONDRIVER_PROXY_H__
BYTE *pbBufHead;
#endif
BYTE *pbBuf;
DWORD dwSize;
TS_DATA(void)
{
#ifdef __BONDRIVER_PROXY_H__
pbBufHead = NULL;
#endif
pbBuf = NULL;
dwSize = 0;
}
~TS_DATA(void)
{
#ifdef __BONDRIVER_PROXY_H__
delete[] pbBufHead;
#else
delete[] pbBuf;
#endif
}
};
class cRawTSFifo : protected std::queue<TS_DATA *> {
protected:
const size_t m_fifoSize;
cCriticalSection m_Lock;
cEvent m_Event;
public:
cRawTSFifo(pthread_cond_t &c, pthread_mutex_t &m) : m_fifoSize(g_TsFifoSize), m_Event(c, m){}
~cRawTSFifo(){ Flush(); } // ポリモーフィズムは使わない前提
void Flush()
{
LOCK(m_Lock);
while (!empty())
{
TS_DATA *p = front();
pop();
delete p;
}
m_Event.Reset();
}
void Push(TS_DATA *p)
{
LOCK(m_Lock);
if (size() >= m_fifoSize)
{
::fprintf(stderr, "Raw TS Queue OVERFLOW : size[%zu]\n", size());
TS_DATA *pDel = front();
pop();
delete pDel;
}
push(p);
m_Event.Set();
}
void Pop(TS_DATA **p)
{
LOCK(m_Lock);
if (!empty())
{
*p = front();
pop();
if (empty())
m_Event.Reset();
}
else
m_Event.Reset();
}
cEvent *GetEventHandle()
{
return &m_Event;
}
inline size_t Size()
{
return size();
}
};
class cTSFifo : public cRawTSFifo {
public:
cTSFifo(pthread_cond_t &c, pthread_mutex_t &m) : cRawTSFifo(c, m){}
void Flush()
{
LOCK(m_Lock);
while (!empty())
{
TS_DATA *p = front();
pop();
delete p;
}
// m_Event.Reset();
}
void Push(TS_DATA *p)
{
LOCK(m_Lock);
if (size() >= m_fifoSize)
{
::fprintf(stderr, "TS Queue OVERFLOW : size[%zu]\n", size());
TS_DATA *pDel = front();
pop();
delete pDel;
}
push(p);
// m_Event.Set();
}
void Pop(TS_DATA **p)
{
LOCK(m_Lock);
if (!empty())
{
*p = front();
pop();
// if (empty())
// m_Event.Reset();
}
// else
// m_Event.Reset();
}
};
#endif // __TSQUEUE_H__