[Live-devel] Total Event Trigger Number and Thread Safety
单铭铭
shanmingming at itssky.com
Sat Dec 19 18:22:07 PST 2020
I'm sorry that I set some font color to white, which may be invisible if
background is white too (I use night mode so it's same...)
On 2020/12/20 10:14, 单铭铭 wrote:
> For your explanation to Question (1),
>
> Because the definition of “EventTriggerId” (in
> “UsageEnvironment/include/UsageEnvironment.hh”) is “u_int32_t”,
> *all* implementations (not just the default implementation)
> support no more than 32 different event triggers.
>
> I don't think so. Total event trigger number can be incremented by
> changing the implementation, by not assuming that
> "EventTriggerId"(u_int32_t) has only one bit set on and others off.
> What I mean is, "EventTriggerId" can range in { 1, 2, 3, 4, 5, ...,
> 2^32 - 1 }, not just { 1, 2, 4, 8, 16, ..., 2^31 }. Take system socket
> file descriptor as an example. Socket descriptor is usually
> implemented by int(or other int-releated). We can assume that system
> limit one process to 1024 simultanously openned file descriptor, then
> socket descriptor can range from 1 to 1023 (not very precise), and
> this is supported by implementation similar to your implementation of
> event trigger, but with a bit recording system of "fd_set, which may
> be 1024 bits size. I believe live555's event trigger upper limit can
> be pushed by changing the implementation of the generation and
> recording system of "EventTriggerId", just like system socket's
> implementation. But if "BasicUsageEnvironment0.hh" is also the
> not-to-modify public interface, then the limit can't be changed since
> "EventTriggerId BasicTaskScheduler0::fTriggersAwaitingHandling"
> already has type "EventTriggerId", which only has 32-bit to set to
> distinguish different events.
>
> And
>
> do {fTriggersAwaitingHandling |= eventTriggerId} while
> ((fTriggersAwaitingHandling&eventTriggerId) == 0); // (a)
>
> There may still be some risk that "fTriggersAwaitingHandling" will be
> corrupted. The code above can only ensure that the bit is really set
> by "TriggerEvent" function, but it may corrupt other operation on it
> inside event loop in "BasicTaskScheduler::SingleStep":
>
> fTriggersAwaitingHandling &=~ fLastUsedTriggerMask; // (b)
>
> If the order of (a) and (b) is following:
>
> 1. (b) Read.
>
> 2. (b) Modify.
>
> 3. (a) Read, Modify.
>
> 4. (b) Write back to fTriggersAwaitingHandling .
>
> 5. (a) Write back to fTriggersAwaitingHandling .
>
> And (a) operation is completed, but (b) is not, since (b)'s write
> operation is overwrited by (a)'s write. I believe some protection to
> fTriggersAwaitingHandling's Read-Write is needed. And if you decide to
> change the implementation of event trigger(use other data structrue to
> recording event as I describe above), the exclusive Read-Write
> mechanism is still needed.
>
> For solution, I didn't come up some ideas. Maybe spinlock is possible,
> but I'm not sure it can be implemented purely by normal C++(without
> other library support).
>
>
> By mitshan.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.live555.com/pipermail/live-devel/attachments/20201220/90abce6a/attachment.htm>
More information about the live-devel
mailing list