/**************************************************************************** Data Object Queue Template class Class ----------------------------------------- begin : 2014/06/13 copyright : (C) 2005 Solbox Inc. author : °³¹ßÆÀ ½ºÅ丮Áö ´ã´ç. email : storage.sd@solbox.com version : 3.4.0 CopyRight(C) 2005 Solbox Inc. All Rights reserved. Redistribution and use in source and binary forms, with or with out modification, are not permitted in outside of Solbox Inc. *****************************************************************************/ /* Âü°í»çÇ× * º» Template Class ´Â ±âÁ¸ CQueue Ŭ·¡½º°¡ °¡Áö°í ÀÖ´Â ¹®Á¦Á¡À» ´ëüÇϱâ À§ÇØ * »õ·Î °³¹ßµÈ class ÀÓ. * ÀÚ¼¼ÇÑ »çÇ×Àº À̽´ #19042 Âü°í */ #ifndef __DATA_QUEUE_HPP__ #define __DATA_QUEUE_HPP__ #include #include #define QUEUE_DEFAULT_MAX_SIZE 0 template class CDataQueue { private: // data °´Ã¼¸¦ ÀúÀåÇÒ queue. std::queue m_queue; // queue Á¢±ÙÀ» Á¦¾îÇÒ ¹ÂÅØ½º lock. pthread_mutex_t m_mutexQueue; // queue ÀÇ ÃÖ´ë Å©±â Á¦ÇѰª ÀúÀå º¯¼ö. unsigned int m_uMaxSize; public: // »ý¼ºÀÚ CDataQueue() { m_uMaxSize = QUEUE_DEFAULT_MAX_SIZE; pthread_mutex_init( &m_mutexQueue, NULL ); } // ¼Ò¸êÀÚ ~CDataQueue() { pthread_mutex_destroy( &m_mutexQueue ); } //////////////////////////////////// // queue Å©±â¸¦ ¹Ýȯ unsigned int GetSize( void ); // queue Max Å©±â¸¦ ¹Ýȯ unsigned int GetMaxSize( void ); // queue Max Å©±â¸¦ ¼³Á¤ void SetMaxSize( unsigned int uMaxSize ); // ÃʱâÈ­ void Init( void ); // Data Object ÀúÀå bool Push( T const& object ); // queue ¿¡ ÀúÀåµÈ ù¹øÀç element ¹Ýȯ // - queue Å©±â°¡ 0 ÀÎ °æ¿ì È£Ãâ½Ã std::out_of_range ¿À·ù°¡ ¹ß»ýÇØ¾ß ÇÏÁö¸¸... // ¿¹¿Ü 󸮸¦ ´ëºÎºÐ ÇÏÁö ¾ÊÀ¸¹Ç·Î... ºó °´Ã¼¸¦ ¹Ýȯó¸®Çϵµ·Ï ÇÔ. // µû¶ó¼­...²À GetSize() ÇÔ¼ö¸¦ È£ÃâÇÏ¿© data °¡ Á¸ÀçÇÏ´ÂÁö È®ÀÎÇÑ ÈÄ º» ÇÔ¼ö È£ÃâÇÒ °Í. T Front( void ); // queue ¿¡ ÀúÀåµÈ ù¹øÀç element Á¦°Å void Pop( void ); }; /////////////////////////////////////////////// // queue Å©±â¸¦ ¹Ýȯ template unsigned int CDataQueue::GetSize( void ) { return m_queue.size(); } // queue Max Å©±â¸¦ ¹Ýȯ template unsigned int CDataQueue::GetMaxSize( void ) { return m_uMaxSize; } // queue Max Å©±â¸¦ ¼³Á¤ template void CDataQueue::SetMaxSize( unsigned int uMaxSize ) { m_uMaxSize = uMaxSize; } // ÃʱâÈ­ template void CDataQueue::Init( void ) { // queue clear 󸮸¦ ¼öÇà. // - queue ÀÇ °æ¿ì clear ÇÔ¼ö°¡ Áö¿øµÇÁö ¾ÊÀ¸¹Ç·Î size °¡ 0 ÀÌ µÉ¶§±îÁö pop ó¸® pthread_mutex_lock( &m_mutexQueue ); while( m_queue.empty() == false ) m_queue.pop(); pthread_mutex_unlock( &m_mutexQueue ); return; } // Data Object ÀúÀå template bool CDataQueue::Push( T const& object ) { // ÇöÀç queue size °¡ ¼³Á¤µÈ ÃÖ´ë size ¸¦ ÀÌ»óÀÎ °æ¿ì ½ÇÆÐ ó¸®. if( m_queue.size() >= m_uMaxSize ) return false; else { pthread_mutex_lock( &m_mutexQueue ); m_queue.push( object ); pthread_mutex_unlock( &m_mutexQueue ); return true; } } // queue ¿¡ ÀúÀåµÈ ù¹øÀç element ¹Ýȯ template T CDataQueue::Front( void ) { // queue Ư¼º»ó pop, front 󸮽à queue °¡ ºñ¾îÀÖÁö ¾ÊÀ½À» º¸ÀåÇØ¾ß ÇÑ´Ù. // - ¸¸¾à queue °¡ ºó °æ¿ì.. std::out_of_range ¿¹¿Ü¸¦ ¹ß»ý½ÃÄÑ¾ß ÇÏÁö¸¸... // È£Ãâ ÇÔ¼ö¿¡¼­ ÀÌ·± ¿¹¿Ü¸¦ ó¸®ÇÏÁö ¾ÊÀ¸¹Ç·Î... // ºó ±øÅë °´Ã¼¸¦ Àü´ÞÇÑ´Ù. T object; if( m_queue.empty() == false ) { pthread_mutex_lock( &m_mutexQueue ); object = m_queue.front(); pthread_mutex_unlock( &m_mutexQueue ); } return object; } // queue ¿¡ ÀúÀåµÈ ù¹øÀç element Á¦°Å template void CDataQueue::Pop( void ) { // queue Ư¼º»ó pop, front 󸮽à queue °¡ ºñ¾îÀÖÁö ¾ÊÀ½À» º¸ÀåÇØ¾ß ÇÑ´Ù. if( m_queue.empty() == false ) { pthread_mutex_lock( &m_mutexQueue ); m_queue.pop(); pthread_mutex_unlock( &m_mutexQueue ); } return; } #endif /* __DATA_QUEUE_HPP__ */