TEST(UDPTEST, TestBlockingUDPSendReceivePacketsSequencialy) { static Semaphore sockEv(0, 1); static Semaphore dataSendEv(1, 1); static Semaphore dataReceiveEv(0, 1); srand(static_cast<unsigned int>(time(NULL))); Aws::Vector<int> dataSize = Aws::Vector<int>(counter); for (auto& item: dataSize) { item = rand() % Aws::Net::UDP_BUFFER_SIZE; } //100 buffers with each can hold at most 8K data. uint8_t data[counter][Aws::Net::UDP_BUFFER_SIZE]; // fill buffers with data for (int i = 0; i < counter; i++) { for (int j = 0; j < dataSize[i]; j++) { data[i][j] = (i*j) % 255; } } DefaultExecutor exec; auto receiver = [&] { Aws::Net::SimpleUDP serverUDP(true/*IPV4*/, Aws::Net::UDP_BUFFER_SIZE/*SENDBUF*/, Aws::Net::UDP_BUFFER_SIZE * counter/*RECVBUF*/, false/*BLOCKING*/); ASSERT_EQ(0, serverUDP.BindToLocalHost(udpPort)); // Sender, you can send data now. sockEv.Release(); uint8_t buffer[Aws::Net::UDP_BUFFER_SIZE]; for (int i = 0; i < counter; i++) { dataReceiveEv.WaitOne(); // Can I receive? int dataLen = serverUDP.ReceiveDataFrom(nullptr, nullptr, buffer, sizeof(buffer)); ASSERT_EQ(dataSize[i], dataLen); ASSERT_EQ(0, memcmp(buffer, data[i], dataLen)); dataSendEv.Release(); // Sender, you can send another data! } }; auto sender = [&] { Aws::Net::SimpleUDP clientUDP(true/*IPV4*/, Aws::Net::UDP_BUFFER_SIZE * counter/*SENDBUF*/, Aws::Net::UDP_BUFFER_SIZE/*RECVBUF*/, false/*BLOCKING*/); // Wait for reciver listen on port. sockEv.WaitOne(); ASSERT_EQ(0, clientUDP.ConnectToLocalHost(udpPort)); for (int i = 0; i < counter; i++) { dataSendEv.WaitOne(); //Can I send? Initially yes, int sentLen = clientUDP.SendData(data[i], dataSize[i]); ASSERT_EQ(dataSize[i], sentLen); dataReceiveEv.Release(); //Receiver, you can receive data now! } }; exec.Submit(receiver); exec.Submit(sender); }
status_t release_sem(int handle, int count) { Semaphore *sem = static_cast<Semaphore*>(GetResource(handle, OBJ_SEMAPHORE)); if (sem == 0) return E_BAD_HANDLE; sem->Release(count); sem->ReleaseRef(); return E_NO_ERROR; }
void ProducerThread() { for(int i = 0; i < N; i++) { if(i % 1000 == 0) LOG(i); mutex.Enter(); queue.AddHead() = new int; mutex.Leave(); todo.Release(); MemoryCheckDebug(); } LOG("Producer shutdown"); }
void RwLock::LeaveRead() { LLOG("LeaveRead"); lock_mutex.Enter(); LLOG("LeaveRead:lock_mutex.Enter();"); if(--readers == 0 && waiting_writer) { LLOG("LeaveRead:if(--readers == 0 && writer)"); ASSERT(readers == 0); writer_wait.Release(); LLOG("LeaveRead:writer_wait.Release();"); } LLOG("LeaveRead:--readers"); lock_mutex.Leave(); LLOG(".LeaveRead"); }
TEST(UDPTEST, TestUDPSendReceivePacketsNonblockingBatch) { static Semaphore sockEv(0, 1); srand(static_cast<unsigned int>(time(NULL))); Aws::Vector<int> dataSize = Aws::Vector<int>(counter); for (auto& item: dataSize) { item = rand() % Aws::Net::UDP_BUFFER_SIZE; } //100 buffers with each can hold at most 8K data. uint8_t data[counter][Aws::Net::UDP_BUFFER_SIZE]; // fill buffers with data for (int i = 0; i < counter; i++) { for (int j = 0; j < dataSize[i]; j++) { data[i][j] = (i*j) % 255; } } DefaultExecutor exec; auto receiver = [&] { Aws::Net::SimpleUDP serverUDP(true/*IPV4*/, Aws::Net::UDP_BUFFER_SIZE/*SENDBUF*/, Aws::Net::UDP_BUFFER_SIZE * counter/*RECVBUF*/, true/*Non-Blocking*/); ASSERT_EQ(0, serverUDP.BindToLocalHost(udpPort)); uint8_t buffer[Aws::Net::UDP_BUFFER_SIZE]; sockEv.Release(); for (int i = 0; i < counter; i++) { int dataLen; while ( (dataLen = serverUDP.ReceiveDataFrom(nullptr, nullptr, buffer, sizeof(buffer))) == -1); ASSERT_EQ(dataSize[i], dataLen); ASSERT_EQ(0, memcmp(buffer, data[i], dataLen)); } }; auto sender = [&] { Aws::Net::SimpleUDP clientUDP(true/*IPV4*/, Aws::Net::UDP_BUFFER_SIZE * counter/*SENDBUF*/, Aws::Net::UDP_BUFFER_SIZE/*RECVBUF*/, true/*Non-Blocking*/); sockEv.WaitOne(); for (int i = 0; i < counter; i++) { int sentLen = clientUDP.SendDataToLocalHost(data[i], dataSize[i], udpPort); ASSERT_EQ(dataSize[i], sentLen); } }; exec.Submit(receiver); exec.Submit(sender); }
void ReaderWriterMutex::Done() { Semaphore *psema = 0; t_ulong n = 1; { MutexType::ScopeLock lock(m_cs); if(m_active > 0) { --m_active; } else { ++m_active; } if(m_active == 0) { if(m_waiting_writers > 0) { m_active = -1; --m_waiting_writers; psema = &m_sema_writers; } else if(m_waiting_readers > 0) { m_active = m_waiting_readers; m_waiting_readers = 0; psema = &m_sema_readers; n = m_active; } else { } } } if(psema != 0){ psema->Release(n); } }