ewol/Sources/libetk/etk/MessageFifo.h

121 lines
2.5 KiB
C++

/**
*******************************************************************************
* @file etk/Mutex.h
* @brief Ewol Tool Kit : basic mutex system (header)
* @author Edouard DUPIN
* @date 15/08/2012
* @par Project
* Ewol TK
*
* @par Copyright
* Copyright 2011 Edouard DUPIN, all right reserved
*
* This software is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY.
*
* Licence summary :
* You can modify and redistribute the sources code and binaries.
* You can send me the bug-fix
*
* Term of the licence in in the file licence.txt.
*
*******************************************************************************
*/
#ifndef __ETK_MESSAGE_FIFO_H__
#define __ETK_MESSAGE_FIFO_H__
#include <etk/Mutex.h>
#include <etk/Semaphore.h>
#include <etk/Vector.h>
namespace etk
{
template<class MY_TYPE=int32_t> class MessageFifo
{
private :
etk::Mutex m_mutex;
etk::Semaphore m_semaphore;
etk::Vector<MY_TYPE> m_data;
public :
MessageFifo(void)
{
// nothing to do ...
};
~MessageFifo(void)
{
// nothing to do ...
};
bool Wait(MY_TYPE &data)
{
m_mutex.Lock();
// Check if data is not previously here
while(0==m_data.Size()) {
m_mutex.UnLock();
m_semaphore.Wait();
m_mutex.Lock();
}
// End Waiting message :
if (0<m_data.Size()) {
// copy element :
data = m_data[0];
// remove element :
m_data.Erase(0);
// remove lock
m_mutex.UnLock();
return true;
}
return false;
};
bool Wait(MY_TYPE &data, uint32_t timeOutInUs)
{
m_mutex.Lock();
// Check if data is not previously here
while(0==m_data.Size()) {
m_mutex.UnLock();
if (false == m_semaphore.Wait(timeOutInUs)) {
return false;
}
m_mutex.Lock();
}
// End Waiting message :
if (0<m_data.Size()) {
// copy element :
data = m_data[0];
// remove element :
m_data.Erase(0);
// remove lock
m_mutex.UnLock();
return true;
}
return false;
};
int32_t Count(void)
{
m_mutex.Lock();
int32_t nbElement = m_data.Size();
m_mutex.UnLock();
return nbElement;
};
void Post(MY_TYPE &data)
{
m_mutex.Lock();
m_data.PushBack(data);
m_semaphore.Post();
m_mutex.UnLock();
};
void Clean(void)
{
m_mutex.Lock();
// remove data
m_data.Clear();
m_mutex.UnLock();
// remove semaphore
m_semaphore.Wait(0);
};
};
};
#endif