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