1*a9643ea8Slogwang 2*a9643ea8Slogwang /** 3*a9643ea8Slogwang * Tencent is pleased to support the open source community by making MSEC available. 4*a9643ea8Slogwang * 5*a9643ea8Slogwang * Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved. 6*a9643ea8Slogwang * 7*a9643ea8Slogwang * Licensed under the GNU General Public License, Version 2.0 (the "License"); 8*a9643ea8Slogwang * you may not use this file except in compliance with the License. You may 9*a9643ea8Slogwang * obtain a copy of the License at 10*a9643ea8Slogwang * 11*a9643ea8Slogwang * https://opensource.org/licenses/GPL-2.0 12*a9643ea8Slogwang * 13*a9643ea8Slogwang * Unless required by applicable law or agreed to in writing, software distributed under the 14*a9643ea8Slogwang * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 15*a9643ea8Slogwang * either express or implied. See the License for the specific language governing permissions 16*a9643ea8Slogwang * and limitations under the License. 17*a9643ea8Slogwang */ 18*a9643ea8Slogwang 19*a9643ea8Slogwang 20*a9643ea8Slogwang /** 21*a9643ea8Slogwang * @file heap_timer.cpp 22*a9643ea8Slogwang */ 23*a9643ea8Slogwang 24*a9643ea8Slogwang #include "heap_timer.h" 25*a9643ea8Slogwang #include "micro_thread.h" 26*a9643ea8Slogwang 27*a9643ea8Slogwang using namespace NS_MICRO_THREAD; 28*a9643ea8Slogwang 29*a9643ea8Slogwang 30*a9643ea8Slogwang /** 31*a9643ea8Slogwang * @brief ���캯�� 32*a9643ea8Slogwang */ 33*a9643ea8Slogwang CTimerMng::CTimerMng(uint32_t max_item) 34*a9643ea8Slogwang { 35*a9643ea8Slogwang #define TIMER_MIN 100000 36*a9643ea8Slogwang 37*a9643ea8Slogwang if (max_item < TIMER_MIN) 38*a9643ea8Slogwang { 39*a9643ea8Slogwang max_item = TIMER_MIN; 40*a9643ea8Slogwang } 41*a9643ea8Slogwang 42*a9643ea8Slogwang _heap = new HeapList(max_item); 43*a9643ea8Slogwang } 44*a9643ea8Slogwang 45*a9643ea8Slogwang 46*a9643ea8Slogwang /** 47*a9643ea8Slogwang * @brief �������� 48*a9643ea8Slogwang */ 49*a9643ea8Slogwang CTimerMng::~CTimerMng() 50*a9643ea8Slogwang { 51*a9643ea8Slogwang if (_heap) { 52*a9643ea8Slogwang delete _heap; 53*a9643ea8Slogwang _heap = NULL; 54*a9643ea8Slogwang } 55*a9643ea8Slogwang } 56*a9643ea8Slogwang 57*a9643ea8Slogwang 58*a9643ea8Slogwang /** 59*a9643ea8Slogwang * @brief ��ʱ�����ú��� 60*a9643ea8Slogwang * @param timerable ��ʱ������ 61*a9643ea8Slogwang * @param interval ��ʱ�ļ�� ms��λ 62*a9643ea8Slogwang * @return �ɹ�����true, ����ʧ�� 63*a9643ea8Slogwang */ 64*a9643ea8Slogwang bool CTimerMng::start_timer(CTimerNotify* timerable, uint32_t interval) 65*a9643ea8Slogwang { 66*a9643ea8Slogwang if (!_heap || !timerable) { 67*a9643ea8Slogwang return false; 68*a9643ea8Slogwang } 69*a9643ea8Slogwang 70*a9643ea8Slogwang utime64_t now_ms = MtFrame::Instance()->GetLastClock(); 71*a9643ea8Slogwang timerable->set_expired_time(now_ms + interval); 72*a9643ea8Slogwang int32_t ret = _heap->HeapPush(timerable); 73*a9643ea8Slogwang if (ret < 0) { 74*a9643ea8Slogwang MTLOG_ERROR("timer start failed(%p), ret(%d)", timerable, ret); 75*a9643ea8Slogwang return false; 76*a9643ea8Slogwang } 77*a9643ea8Slogwang 78*a9643ea8Slogwang return true; 79*a9643ea8Slogwang } 80*a9643ea8Slogwang 81*a9643ea8Slogwang /** 82*a9643ea8Slogwang * @brief ��ʱ��ֹͣ�ӿں��� 83*a9643ea8Slogwang * @param timerable ��ʱ������ 84*a9643ea8Slogwang */ 85*a9643ea8Slogwang void CTimerMng::stop_timer(CTimerNotify* timerable) 86*a9643ea8Slogwang { 87*a9643ea8Slogwang if (!_heap || !timerable) { 88*a9643ea8Slogwang return; 89*a9643ea8Slogwang } 90*a9643ea8Slogwang 91*a9643ea8Slogwang _heap->HeapDelete(timerable); 92*a9643ea8Slogwang return; 93*a9643ea8Slogwang } 94*a9643ea8Slogwang 95*a9643ea8Slogwang /** 96*a9643ea8Slogwang * @brief ��ʱ����ʱ��⺯�� 97*a9643ea8Slogwang */ 98*a9643ea8Slogwang void CTimerMng::check_expired() 99*a9643ea8Slogwang { 100*a9643ea8Slogwang if (!_heap) { 101*a9643ea8Slogwang return; 102*a9643ea8Slogwang } 103*a9643ea8Slogwang 104*a9643ea8Slogwang utime64_t now = MtFrame::Instance()->GetLastClock(); 105*a9643ea8Slogwang CTimerNotify* timer = dynamic_cast<CTimerNotify*>(_heap->HeapTop()); 106*a9643ea8Slogwang while (timer && (timer->get_expired_time() <= now)) 107*a9643ea8Slogwang { 108*a9643ea8Slogwang _heap->HeapDelete(timer); 109*a9643ea8Slogwang timer->timer_notify(); 110*a9643ea8Slogwang timer = dynamic_cast<CTimerNotify*>(_heap->HeapTop()); 111*a9643ea8Slogwang } 112*a9643ea8Slogwang }; 113*a9643ea8Slogwang 114*a9643ea8Slogwang 115*a9643ea8Slogwang 116