[reSIProcate] Timers: why system time?

Byron Campen bcampen at estacado.net
Fri Oct 31 14:15:15 CDT 2008


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

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
>>>>>>
>>>>>
>>>>
>>>
>>
>

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2482 bytes
Desc: not available
URL: <http://list.resiprocate.org/pipermail/resiprocate-devel/attachments/20081031/7fb2694e/attachment.bin>


More information about the resiprocate-devel mailing list