[reSIProcate] Timers: why system time?

Adam Roach adam at nostrum.com
Fri Oct 31 14:27:28 CDT 2008


Byron Campen wrote:
>     So, maybe on win32 we need to have something call getTimeMs() 
> every minute? A heartbeat timer of some sort?

You could be even more clever about it than that. Inserting a timer 
immediately before and after the rollover should get you there. That 
way, you have two timers every 49 days, instead of one timer every 
minute. :)

UInt64 timer1Time = 0x00000000FFFFFFF0ui64 | (Timer::getTimeMs() & 
0xFFFFFFFF00000000ui64);
UInt64 timer2Time = timer1 + 33;

Then, all you need is a new Timer constructor that takes an absolute 
time instead of a relative one.

/a

>
> Best regards,
> Byron Campen
>
>> To qualify things further, though: in order for this bug to be 
>> triggered, you would need to have no calls to "Timer::getTimeMs()" 
>> for over two minutes (131.07 seconds, to be more precise) as the 
>> 49.7-day boundary rolls around. In a normally operating SIP stack, 
>> the chances of this happening seem vanishingly small.
>>
>> So, it's a corner case on top of a corner case. And it only happens 
>> on WIN32 systems.
>>
>> /a
>>
>> Byron Campen wrote:
>>>    Ok, so this is in the "much more serious" category. I would not 
>>> be comfortable leaving this be.
>>>
>>> Best regards,
>>> Byron Campen
>>>
>>>> Byron Campen wrote:
>>>>>   Let's say one of these timers is at the top of the heap, and 
>>>>> whatever error you're thinking about happens. Are you saying that 
>>>>> not only will that timer be 49 days late, but everything else in 
>>>>> the heap will be too?
>>>>
>>>> Not new timers. But, if we miss the rollover, then everything in 
>>>> the heap at that time will instantaneously appear to be 49.7 days 
>>>> later than their original expiration time. New timers will be 
>>>> inserted in the heap just fine (ahead of the "lost" timers), and 
>>>> expire correctly.
>>>>
>>>> The behavior would be similar to using our current stack and 
>>>> setting the system time to be 49 days in the past while timers are 
>>>> pending.
>>>>
>>>> /a
>>>>>
>>>>>
>>>>> Best regards,
>>>>> Byron Campen
>>>>>
>>>>>> Technically, they won't be "lost" as much as "over 49 days late." 
>>>>>> From a SIP protocol perspective, 49 days is long enough to 
>>>>>> consider the timer lost for all practical purposes.
>>>>>>
>>>>>> /a
>>>>>>
>>>>>> Byron Campen wrote:
>>>>>>>  I can see how we would miss a roll-over with low timer 
>>>>>>> activity, but I am not sure what you mean by "lose timers". If 
>>>>>>> we have lost a timer from a timer heap, that implies the heap is 
>>>>>>> now broken, because that is the only way to "lose" anything. So 
>>>>>>> this is either much more serious, or much less serious than you 
>>>>>>> have stated.
>>>>>>>
>>>>>>> Best regards,
>>>>>>> Byron Campen
>>>>>>>
>>>>>>>> Scott (and any other Windows developers on the list):
>>>>>>>>
>>>>>>>> The Windows 49.7-day rollover fix in this patch uses heuristics 
>>>>>>>> to handle the rollover in an efficient manner -- you can 
>>>>>>>> actually lose timers if you have relatively low timer activity 
>>>>>>>> and a multi-minute timer running when the tick count rolls 
>>>>>>>> over.  The chances of this happening are, admittedly, 
>>>>>>>> vanishingly small (especially in normal SIP usage). In any 
>>>>>>>> case, you might want to give that code a quick review to ensure 
>>>>>>>> that you're comfortable with it.
>>>>>>>>
>>>>>>>> Also, I think it's safe to say that it's difficult to test the 
>>>>>>>> correctness of the code, as step one of any such test plan 
>>>>>>>> necessarily involves something like: "boot a Windows machine 
>>>>>>>> and wait 49.6 days." Make sure you're comfortable with that 
>>>>>>>> fact as well.
>>>>>>>>
>>>>>>>> /a
>>>>>>>>
>>>>>>>> Alexander wrote:
>>>>>>>>> Hi
>>>>>>>>>
>>>>>>>>> Here is a patch to use monotonic clock.
>>>>>>>>> It is 3 modified files from reSIProcate 1.4.
>>>>>>>>> Attached files have Windows (CLRF) eof-style.
>>>>>>>>>
>>>>>>>>> Windows
>>>>>>>>> =======
>>>>>>>>>
>>>>>>>>> GetTickCount() with 16 ms inaccuracy used.
>>>>>>>>> It is very simple to change it to timeGetTime() etc with 1 ms 
>>>>>>>>> accuracy,
>>>>>>>>> but it will require init/fini calls on application level and 
>>>>>>>>> linking
>>>>>>>>> with Winmm.lib
>>>>>>>>> Tested on Windows XP SP2, compiled with VS7.1
>>>>>>>>>
>>>>>>>>> Not tested on Windows CE
>>>>>>>>>
>>>>>>>>> Linux
>>>>>>>>> =====
>>>>>>>>>
>>>>>>>>> If monotonic clock is not available (compile time and runtime) 
>>>>>>>>> it will
>>>>>>>>> fall back to gettimeofday()
>>>>>>>>> I am not familiar with reSIProcate build system so I use 
>>>>>>>>> workaround to
>>>>>>>>> avoid linking with librt:
>>>>>>>>> syscall( __NR_clock_gettime, ... )
>>>>>>>>> instead of clock_gettime(...)
>>>>>>>>>
>>>>>>>>> IMHO it may not work on other POSIX compliant platforms.
>>>>>>>>>
>>>>>>>>> Pass only some basic tests on my Linux PC (2.6.18 kernel)
>>>>>>>>>
>>>>>>>>> Any feedbacks appreciated.
>>>>>>>>>
>>>>>>>>> Regards
>>>>>>>>> Alexander Altshuler
>>>>>>>>> Xeepe team
>>>>>>>>> http://xeepe.com
>>>>>>>>> ------------------------------------------------------------------------ 
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> resiprocate-devel mailing list
>>>>>>>>> resiprocate-devel at resiprocate.org
>>>>>>>>> https://list.resiprocate.org/mailman/listinfo/resiprocate-devel
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> resiprocate-devel mailing list
>>>>>>>> resiprocate-devel at resiprocate.org
>>>>>>>> https://list.resiprocate.org/mailman/listinfo/resiprocate-devel
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>




More information about the resiprocate-devel mailing list