AJA NTV2 SDK  17.5.0.1242
NTV2 SDK 17.5.0.1242
eventimpl.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
9 #include "ajabase/system/debug.h"
10 #include <errno.h>
11 
12 #define MAX_EVENTS 64
13 
14 using std::string;
15 
16 // event implementation class (linux)
17 AJAEventImpl::AJAEventImpl(bool manualReset, const std::string& name)
18  : mManualReset(manualReset)
19 {
20  AJA_UNUSED(name);
21  pthread_mutex_init(&mMutex, NULL);
22  pthread_cond_init(&mCondVar, NULL);
23  Clear();
24 }
25 
26 
28 {
29  pthread_cond_destroy(&mCondVar);
30  pthread_mutex_destroy(&mMutex);
31 }
32 
33 
34 AJAStatus
36 {
37  // check for open
38  int theError;
39 
40  pthread_mutex_lock(&mMutex);
41  mSignaled = true;
42  theError = pthread_cond_broadcast(&mCondVar);
43  pthread_mutex_unlock(&mMutex);
44 
45  if (theError)
46  {
47  AJA_REPORT(0, AJA_DebugSeverity_Error, "AJAEventImpl::Signal() returns error %08x", theError);
48  return AJA_STATUS_FAIL;
49  }
50  return AJA_STATUS_SUCCESS;
51 }
52 
53 
56 {
57  // check for open
58  mSignaled = false;
59  return AJA_STATUS_SUCCESS;
60 }
61 
62 
64 AJAEventImpl::SetState(bool signaled)
65 {
66  AJAStatus status;
67 
68  if (signaled)
69  {
70  status = Signal();
71  }
72  else
73  {
74  status = Clear();
75  }
76 
77  return status;
78 }
79 
80 
82 AJAEventImpl::GetState(bool* pSignaled)
83 {
84  AJA_UNUSED(pSignaled);
85 
86  // wait with timeout 0 returns immediately
87  return WaitForSignal(0);
88 }
89 
90 
92 AJAEventImpl::SetManualReset(bool manualReset)
93 {
94  mManualReset = manualReset;
95  return AJA_STATUS_SUCCESS;
96 }
97 
98 
100 AJAEventImpl::GetManualReset(bool* pManualReset)
101 {
102  if (pManualReset)
103  {
104  *pManualReset = mManualReset;
105  return AJA_STATUS_SUCCESS;
106  }
107  else
108  return AJA_STATUS_FAIL;
109 }
110 
111 
112 AJAStatus
113 AJAEventImpl::WaitForSignal(uint32_t timeout)
114 {
115  static const long long NS_PER_SEC = 1000000000ULL;
116 
117  // check for open
118  int64_t nanos = timeout;
119  nanos *= 1000000;
120 
121  struct timespec ts;
122  int32_t result;
123  AJAStatus status = AJA_STATUS_SUCCESS;
124 
126 
127  nanos += ts.tv_nsec;
128  ts.tv_sec += (nanos / NS_PER_SEC);
129  ts.tv_nsec = (nanos % NS_PER_SEC);
130 
131  pthread_mutex_lock(&mMutex);
132 
133  if (false == mSignaled)
134  {
135  result = pthread_cond_timedwait(&mCondVar, &mMutex, &ts);
136 
137  if (0 != result)
138  {
139  if (result == ETIMEDOUT)
140  {
142  "AJAEventImpl::WaitForSignal() timeout", result);
143  status = AJA_STATUS_TIMEOUT;
144  }
145  else
146  {
148  "AJAEventImpl::WaitForSignal() "
149  "pthread_cond_timedwait returns error %08x", result);
150  status = AJA_STATUS_FAIL;
151  }
152  }
153  }
154  if (!mManualReset)
155  {
156  mSignaled = false;
157  }
158  pthread_mutex_unlock(&mMutex);
159  return (status);
160 }
161 
162 
163 AJAStatus
164 AJAEventImpl::GetEventObject(uint64_t* pEventObject)
165 {
166  AJA_UNUSED(pEventObject);
167 
168  return AJA_STATUS_SUCCESS;
169 }
170 
171 
172 /*
173 AJAStatus
174 AJAWaitForEvents(AJAEventPtr* pEventList, uint32_t numEvents, bool all, uint32_t timeout)
175 {
176 
177  HANDLE eventArray[MAX_EVENTS];
178 
179  if (pEventList == NULL)
180  {
181  AJA_REPORT(0, AJA_DebugSeverity_Error, "AJAWaitForEvents event list is NULL");
182  return AJA_STATUS_INITIALIZE;
183  }
184 
185  if (numEvents == 0)
186  {
187  AJA_REPORT(0, AJA_DebugSeverity_Error, "AJAWaitForEvents event list is empty");
188  return AJA_STATUS_RANGE;
189  }
190 
191  if (numEvents > MAX_EVENTS)
192  {
193  AJA_REPORT(0, AJA_DebugSeverity_Error, "AJAWaitForEvents event list larger that MAX_EVENTS");
194  return AJA_STATUS_RANGE;
195  }
196 
197  uint32_t i;
198 
199  // build the array of handles from the AJAEvent(s)
200  for (i = 0; i < numEvents; i++)
201  {
202  AJAEventPtr eventPtr = pEventList[i];
203  AJA_ASSERT(eventPtr->mImplPtr->mEvent != NULL);
204  if(eventPtr->mImplPtr->mEvent == NULL)
205  {
206  AJA_REPORT(0, AJA_DebugSeverity_Error, "AJAWaitForEvents event not initialized");
207  return AJA_STATUS_INITIALIZE;
208  }
209  eventArray[i] = eventPtr->mImplPtr->mEvent;
210  }
211 
212  // check for infinite timeout
213  if (timeout == 0xffffffff)
214  {
215  timeout = INFINITE;
216  }
217 
218  // wait for event(s) to be signaled
219  DWORD retCode = WaitForMultipleObjects(numEvents, eventArray, all, (DWORD)timeout);
220 
221  // an event was signaled
222  if ((retCode >= WAIT_OBJECT_0) && (retCode < (WAIT_OBJECT_0 + numEvents)))
223  {
224  return AJA_STATUS_SUCCESS;
225  }
226  // the wait timed out
227  else if (retCode == WAIT_TIMEOUT)
228  {
229  return AJA_STATUS_TIMEOUT;
230  }
231 
232  // some type of error occurred
233  AJA_REPORT(0, AJA_DebugSeverity_Error, "AJAEvent()::WaitForEvents WaitForMultipleObjects() returns error %08x", retCode);
234 
235  return AJA_STATUS_FAIL;
236 }
237 */
NULL
#define NULL
Definition: ntv2caption608types.h:19
AJA_STATUS_SUCCESS
@ AJA_STATUS_SUCCESS
Definition: types.h:381
AJA_DebugSeverity_Error
@ AJA_DebugSeverity_Error
Definition: debugshare.h:28
AJAEventImpl::~AJAEventImpl
virtual ~AJAEventImpl(void)
Definition: eventimpl.cpp:29
AJA_UNUSED
#define AJA_UNUSED(_x_)
Definition: types.h:424
AJAStatus
AJAStatus
Definition: types.h:378
CLOCK_REALTIME
#define CLOCK_REALTIME
Definition: pthreadsextra.h:21
AJA_STATUS_FAIL
@ AJA_STATUS_FAIL
Definition: types.h:382
eventimpl.h
Declares the AJAEventImpl class.
AJAEventImpl::GetState
AJAStatus GetState(bool *pSignaled)
Definition: eventimpl.cpp:90
AJAEventImpl::SetState
AJAStatus SetState(bool signaled=true)
Definition: eventimpl.cpp:72
AJA_REPORT
#define AJA_REPORT(_index_, _severity_, _format_,...)
Definition: debug.h:117
AJAEventImpl::GetEventObject
virtual AJAStatus GetEventObject(uint64_t *pEventObject)
Definition: eventimpl.cpp:176
AJAEventImpl::WaitForSignal
AJAStatus WaitForSignal(uint32_t timeout=0xffffffff)
Definition: eventimpl.cpp:121
AJA_DebugSeverity_Info
@ AJA_DebugSeverity_Info
Definition: debugshare.h:31
AJA_STATUS_TIMEOUT
@ AJA_STATUS_TIMEOUT
Definition: types.h:384
AJAEventImpl::GetManualReset
AJAStatus GetManualReset(bool *pManualReset)
Definition: eventimpl.cpp:108
AJAEventImpl::AJAEventImpl
AJAEventImpl(bool manualReset, const std::string &name)
Definition: eventimpl.cpp:17
clock_gettime
int clock_gettime(clockid_t clk_id, struct timespec *tp)
Definition: pthreadsextra.cpp:12
AJAEventImpl::SetManualReset
AJAStatus SetManualReset(bool manualReset)
Definition: eventimpl.cpp:100
AJAEventImpl::Clear
AJAStatus Clear(void)
Definition: eventimpl.cpp:63
AJAEventImpl::Signal
AJAStatus Signal(void)
Definition: eventimpl.cpp:39
debug.h
Declares the AJADebug class.