#include <cstdlib>
#include <utility>
-ExpiryTimer_Impl* ExpiryTimer_Impl::s_instance;
-std::once_flag ExpiryTimer_Impl::mflag;
+ExpiryTimer_Impl* ExpiryTimer_Impl::s_instance = nullptr;
+std::once_flag* ExpiryTimer_Impl::mflag = new std::once_flag;
ExpiryTimer_Impl::ExpiryTimer_Impl()
{
ExpiryTimer_Impl::~ExpiryTimer_Impl()
{
+ check.detach();
+ delete mflag;
+ s_instance = nullptr;
+ delete s_instance;
}
+void ExpiryTimer_Impl::destroy()
+{
+ if(mTimerCBList.empty())
+ {
+ try
+ {
+ s_instance->~ExpiryTimer_Impl();
+ }
+ catch(std::exception &e)
+ {
+ std::cout << e.what();
+ }
+ }
+}
ExpiryTimer_Impl* ExpiryTimer_Impl::getInstance()
{
- std::call_once(mflag, [](){ s_instance = new ExpiryTimer_Impl; });
+ std::call_once((*mflag), [](){ s_instance = new ExpiryTimer_Impl(); });
return s_instance;
}
{
Id retID;
retID = generateID();
+
milliSeconds delay(msec);
insertTimerCBInfo(countExpireTime(delay), cb, retID);
bool ExpiryTimer_Impl::cancelTimer(Id timerID)
{
- std::lock_guard<std::mutex> lockf(m_mutex);
bool ret = false;
for(auto it: mTimerCBList)
{
if(it.second.m_id == timerID)
{
+ std::lock_guard<std::mutex> lockf(m_mutex);
if(mTimerCBList.erase(it.first)!=0)
ret = true;
else
void ExpiryTimer_Impl::insertTimerCBInfo(ExpiredTime msec, TimerCb cb, Id timerID)
{
- std::lock_guard<std::mutex> lockf(m_mutex);
TimerCBInfo newInfo = {timerID, cb};
+ std::lock_guard<std::mutex> lockf(m_mutex);
mTimerCBList.insert(std::multimap<ExpiredTime, TimerCBInfo>::value_type(msec, newInfo));
m_cond.notify_all();
}
srand(time(NULL));
Id retID = rand();
+ std::lock_guard<std::mutex> lockf(id_mutex);
for(std::multimap<ExpiredTime, TimerCBInfo>::iterator it=mTimerCBList.begin(); it!=mTimerCBList.end(); ++it)
{
if((*it).second.m_id == retID || retID == 0)
#ifndef _EXPIRY_TIMER_Impl_H_
#define _EXPIRY_TIMER_Impl_H_
-// CHECKER_WAIT_TIME : checker thread waits new request for 10000 seconds
-#define CHECKER_WAIT_TIME 10000
+// CHECKER_WAIT_TIME : checker thread waits new request for 10 seconds
+#define CHECKER_WAIT_TIME 10
#include <iostream>
#include <functional>
TimerCb m_cb;
};
-public:
- ~ExpiryTimer_Impl();
-
private:
ExpiryTimer_Impl();
+ ExpiryTimer_Impl(const ExpiryTimer_Impl&);
+ ExpiryTimer_Impl& operator=(const ExpiryTimer_Impl&);
+ ~ExpiryTimer_Impl();
public:
static ExpiryTimer_Impl* getInstance();
+ void destroy();
Id postTimer(DelayMilliSec, TimerCb);
bool cancelTimer(Id);
private:
static ExpiryTimer_Impl* s_instance;
- static std::once_flag mflag;
+ static std::once_flag* mflag;
std::multimap<ExpiredTime, TimerCBInfo> mTimerCBList;
std::thread check;
std::mutex m_mutex;
+ std::mutex id_mutex;
std::mutex cond_mutex;
std::condition_variable m_cond;