[h323plus] PTimedMutex::Wait patch
Robert Jongbloed
robert.jongbloed at bigpond.com
Sun Sep 21 03:21:58 EDT 2008
I have applied this patch to the PTLib trunk. Thank you very much!
Robert Jongbloed
OPAL/OpenH323/PTLib Architect and Co-founder.
> -----Original Message-----
> From: h323plus-bounces at lists.packetizer.com [mailto:h323plus-
> bounces at lists.packetizer.com] On Behalf Of Nir Soffer
> Sent: Sunday, 21 September 2008 5:26 AM
> To: h323plus
> Subject: [h323plus] PTimedMutex::Wait patch
>
> In PTimedMutex::Wait(const PTimeInterval & waitTime), when
> pthread_mutex_timedlock is not available or broken (it is broken on
> our arm platform), the code always sleeps before checking the finish
> time, which is incorrect.
>
> For example, if you call Wait(0), and fail to acquire the lock, you
> will sleep for 10 milliseconds before you get back the retrun value.
>
> This is a bigger issue if you use
> H323EndPoint::FindConnectionWithLock:
>
> PWaitAndSignal mutex(connectionsMutex);
>
> H323Connection * connection;
> while ((connection = FindConnectionWithoutLocks(token)) != NULL) {
>
> // XXX this will block for 10 milliseconds if the lock can not
> be acquired!
> // TryLock calls Wait(0) which sleeps for 10ms on failure
> switch (connection->TryLock()) {
>
> case 0 :
> return NULL;
> case 1 :
> return connection;
> }
> // Could not get connection lock, unlock the endpoint lists so a
> thread
> // that has the connection lock gets a chance at the endpoint
> lists.
> connectionsMutex.Signal();
> PThread::Sleep(20);
> connectionsMutex.Wait();
> }
>
> return NULL;
>
> The code try sleep for 20 milliseconds while the connectionsMutex is
> unlocked, letting the other thread that hold the connection a chancee
> to use the endpoint lists, but for each 30 milliseconds cycle, it
> keeps the endpoint lists locked for 10 milliseconds.
>
> Attached a trivial fix.
More information about the h323plus
mailing list