Esempio n. 1
0
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);
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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");
}
Esempio n. 4
0
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");
}
Esempio n. 5
0
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);
		}
		
		
}