[Live-devel] triggerEvent() race condition

Robert Smith smith at cognitec.com
Wed Mar 18 05:34:30 PDT 2015


I would like to use boost::atomic< T> or std::atomic< T> but 
unfortunately boost and c++11 are unavailable to me. I agree that 
std::atomic< T> or the like would be the best way to go though.


On 03/18/2015 12:16 AM, Jeff Shanab wrote:
> I have used boost atomic or just a boost mutex with a scoped_lock when 
> I needed to protect, It implements cross platform the best avail on a 
> platform.
>
>
>
>
> On Tue, Mar 17, 2015 at 9:07 AM, Robert Smith <smith at cognitec.com 
> <mailto:smith at cognitec.com>> wrote:
>
>     Ok, I will implement my own TaskScheduler class, but operations
>     that read-modify-write memory are not atomic with multiple
>     processors/cores. I guess the large portion of users these days
>     will be using multicore x86 processors.
>
>     I asked this question on stackoverflow and the responses support
>     the research I have done myself.
>
>     http://stackoverflow.com/questions/29099094/is-the-c-operator-atomic-with-a-multicore-processor
>
>     My updated  application with a protected triggerEvent() method
>     didn't cure the problem, one (out of six) of the streams stopped
>     after an hour. I then modified BasicTaskScheduler to protect all
>     reads/writes of the fTriggersAwaitingHandling and it has been
>     running for over 24 hours now. Time will tell but it looks promising.
>
>     If I'm to speculate why this hasn't been a problem before I would
>     guess that the large majority of users are not using the triggers
>     at runtime, e.g, they are using the file sources. And for those
>     who are using a live source, if they only have one stream then the
>     task schedulers' SingleStep() method is probably waiting in the
>     select() call when the triggerEvent() method is called making it
>     unlikely that they conflict.
>
>     Also each thread in my application has it's own event trigger id.
>
>     I'm not even suggesting that you change the implementation but at
>     least be aware of the problem and document it for future users.
>
>
>     On 03/16/2015 05:50 PM, Ross Finlayson wrote:
>>>     Having thought about it some more, I don't think it's enough to
>>>     just protect calls to triggerEvent() because
>>>     'fTriggersAwaitingHandling' is still modified by
>>>     BasicTaskScheduler::SingleStep().
>>
>>     The intention of the code that implements "BasicTaskScheduler"
>>     was that:
>>     1/ The event loop code (which is always just a single thread,
>>     remember) does nothing with "fTriggersAwaitingHandling" except
>>     clear (using "&=~") a single bit that was already set, and
>>     2/ The other thread(s) that can trigger event(s) do nothing
>>     with "fTriggersAwaitingHandling" except set (using "|=") bit(s)
>>     that were not already set.
>>
>>     If these two conditions are met, *and* if the 'clear a bit' and
>>     'set a bit' operations are atomic, then the code will be thread-safe.
>>
>>     (If, OTOH, you're worried that the 'clear a bit' and 'set a bit'
>>     operations might not be atomic on your system, then you'd need to
>>     write your own "TaskScheduler" subclass instead.)
>>
>>     Looking at the code again just now, however, I realized that the
>>     event loop code does not always satisfy condition 1/.   Line 183
>>     of "BasicTaskScheduler.cpp" should be changed from:
>>     fTriggersAwaitingHandling = 0;
>>     to
>>     fTriggersAwaitingHandling &=~ fLastUsedTriggerMask;
>>
>>     I have just released a new version (2015.03.16) of the code that
>>     fixes this.  You should upgrade to this version.
>>
>>
>>     You should also make sure that your own code satisfies condition
>>     2/.  I.e., you should make sure that your code is never calling
>>     "triggerEvent()" more than once with the same 'event trigger'
>>     value, unless you're sure that the first event (for that event
>>     trigger) has already been handled.  (In particular, you should
>>     never call "triggerEvent()" with the same 'event trigger' value
>>     from more than one thread.)
>>
>>     Ross Finlayson
>>     Live Networks, Inc.
>>     http://www.live555.com/
>>
>>
>>
>>
>>     _______________________________________________
>>     live-devel mailing list
>>     live-devel at lists.live555.com  <mailto:live-devel at lists.live555.com>
>>     http://lists.live555.com/mailman/listinfo/live-devel
>
>
>     _______________________________________________
>     live-devel mailing list
>     live-devel at lists.live555.com <mailto:live-devel at lists.live555.com>
>     http://lists.live555.com/mailman/listinfo/live-devel
>
>
>
>
> _______________________________________________
> live-devel mailing list
> live-devel at lists.live555.com
> http://lists.live555.com/mailman/listinfo/live-devel

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.live555.com/pipermail/live-devel/attachments/20150318/eedfd432/attachment.html>


More information about the live-devel mailing list