void* ARSTREAM_Reader_RunAckThread (void *ARSTREAM_Reader_t_Param) { ARSTREAM_NetworkHeaders_AckPacket_t sendPacket = {0}; ARSTREAM_Reader_t *reader = (ARSTREAM_Reader_t *)ARSTREAM_Reader_t_Param; memset(&sendPacket, 0, sizeof(sendPacket)); ARSAL_PRINT (ARSAL_PRINT_DEBUG, ARSTREAM_READER_TAG, "Ack sender thread running"); reader->ackThreadStarted = 1; while (reader->threadsShouldStop == 0) { int isPeriodicAck = 0; ARSAL_Mutex_Lock (&(reader->ackSendMutex)); if (reader->maxAckInterval <= 0) { ARSAL_Cond_Wait (&(reader->ackSendCond), &(reader->ackSendMutex)); } else { int retval = ARSAL_Cond_Timedwait (&(reader->ackSendCond), &(reader->ackSendMutex), reader->maxAckInterval); if (retval == -1 && errno == ETIMEDOUT) { isPeriodicAck = 1; } } ARSAL_Mutex_Unlock (&(reader->ackSendMutex)); /* Only send an ACK if the maxAckInterval value allows it. */ if ((reader->maxAckInterval > 0) || ((reader->maxAckInterval == 0) && (isPeriodicAck == 0))) { ARSAL_Mutex_Lock (&(reader->ackPacketMutex)); sendPacket.frameNumber = htods (reader->ackPacket.frameNumber); sendPacket.highPacketsAck = htodll (reader->ackPacket.highPacketsAck); sendPacket.lowPacketsAck = htodll (reader->ackPacket.lowPacketsAck); ARSAL_Mutex_Unlock (&(reader->ackPacketMutex)); ARNETWORK_Manager_SendData (reader->manager, reader->ackBufferID, (uint8_t *)&sendPacket, sizeof (sendPacket), NULL, ARSTREAM_Reader_NetworkCallback, 1); } } ARSAL_PRINT (ARSAL_PRINT_DEBUG, ARSTREAM_READER_TAG, "Ack sender thread ended"); reader->ackThreadStarted = 0; return (void *)0; }
int ARSAL_Sem_Wait(ARSAL_Sem_t *sem) { int result = -1; if (NULL == sem || NULL == *sem) { errno = EINVAL; return result; } /* No else: arguments are all good so just go on. */ #if __SAL_USE_POSIX_SEM result = sem_wait((sem_t *)*sem); #else /* * Custom wait algo: * Lock mutex * Check if counter is > 0 * NO YES * | | - Decrement counter * | \ - Unlock mutex * | - Wait for condition * | - Decrement counter * \ - Unlock mutex */ ARSAL_Sem_CustomImpl_t *psem = (ARSAL_Sem_CustomImpl_t *)*sem; int unlockRes = 0; result = ARSAL_Mutex_Lock (&(psem->lock)); ARSAL_SEM_ERRNO_TRANSFORM (result); if (0 == result && 0 >= psem->count) { result = ARSAL_Cond_Wait (&(psem->cond), &(psem->lock)); ARSAL_SEM_ERRNO_TRANSFORM (result); } /* No else. */ if (0 == result) { if (0 < psem->count) { (psem->count)--; } /* No else: don't decrement count below 0. */ } /* No else. */ unlockRes = ARSAL_Mutex_Unlock (&(psem->lock)); if (0 != unlockRes) { errno = unlockRes; result = -1; } /* No else. */ #endif return result; }