1 /* 2 * Kiss - A refined core library for D programming language. 3 * 4 * Copyright (C) 2015-2018 Shanghai Putao Technology Co., Ltd 5 * 6 * Developer: HuntLabs.cn 7 * 8 * Licensed under the Apache-2.0 License. 9 * 10 */ 11 12 module kiss.event.timer.iocp; 13 14 // dfmt off 15 version (Windows) : 16 // dfmt on 17 18 19 import kiss.event.core; 20 import kiss.event.timer.common; 21 22 import core.time; 23 import std.datetime; 24 import std.exception; 25 import kiss.logger; 26 27 28 /** 29 */ 30 class AbstractTimer : TimerChannelBase 31 { 32 this(Selector loop) 33 { 34 super(loop); 35 setFlag(WatchFlag.Read, true); 36 _timer = new KissWheelTimer(); 37 _timer.timeout = &onTimerTimeout; 38 _readBuffer = new UintObject(); 39 } 40 41 bool readTimer(scope ReadCallBack read) 42 { 43 this.clearError(); 44 this._readBuffer.data = 1; 45 if (read) 46 read(this._readBuffer); 47 return false; 48 } 49 50 // override void start(bool immediately = false, bool once = false) 51 // { 52 // this.setTimerOut(); 53 // super.start(immediately, once); 54 // } 55 56 private void onTimerTimeout(Object) 57 { 58 _timer.rest(wheelSize); 59 this.onRead(); 60 } 61 62 override void stop() 63 { 64 _timer.stop(); 65 super.stop(); 66 } 67 68 69 bool setTimerOut() 70 { 71 if (_interval > 0) 72 { 73 _interval = _interval > 20 ? _interval : 20; 74 auto size = _interval / CustomTimerMinTimeOut; 75 const auto superfluous = _interval % CustomTimerMinTimeOut; 76 size += superfluous > CustomTimer_Next_TimeOut ? 1 : 0; 77 size = size > 0 ? size : 1; 78 _wheelSize = cast(uint) size; 79 _circle = _wheelSize / CustomTimerWheelSize; 80 return true; 81 } 82 return false; 83 } 84 85 86 @property KissWheelTimer timer() { return _timer; } 87 // mixin OverrideErro; 88 89 UintObject _readBuffer; 90 91 private KissWheelTimer _timer; 92 }