[Mono-dev] [PATCH] WCF multithreaded and property handling

Atsushi Eno atsushieno at veritas-vos-liberabit.com
Sun Apr 18 23:52:47 EDT 2010


Hi, sorry for the late reply, I'm back here again.

Thanks, I'm going to apply your patch with a little change. This method 
should not return true if the channel has received null HTTP context, 
while WaitOne() just returns true unless it goes timeout.

As for properties patch, I already made a relevant fix (I think I 
mentioned it in my previous posts) which fixed the issue you fixed in 
your own patch, and I didn't find it worthy enough to make an extra change.

Atsushi Eno


On 2010/04/08 18:35, Matt Dargavel wrote:
> Hi again,
>
> 	I'm just going through my outstanding local changes against the
> latest CVS.  Did you have chance to revisit the AutoResetEvent issue as
> mentioned below?  I've attached a new patch against the latest revision
> to show the changes.
>
> 	Also, I don't think the properties patch (my version or your
> version) got applied in the end?  I saw it got rolled back due to a
> regression.  If you could point me in the right direction I'd be happy
> to look in to this in a bit more.
>
> 		Regards,
>
> 			Matt.
>
>> -----Original Message-----
>> From: Matt Dargavel
>> Sent: 24 March 2010 12:29 PM
>> To: 'Atsushi Eno'
>> Cc: mono-devel-list at lists.ximian.com
>> Subject: RE: [PATCH] WCF multithreaded and property handling
>>
>> The problem I was trying to fix was that it's possible for wait to be
> set
>> to null after:
>>
>> if (wait != null)
>>
>> and before:
>>
>> wait.WaitOne(...)
>>
>> causing a null reference exception.
>>
>> Looking at MSDN it sounds like an AutoResetEvent should remain
> signalled
>> until a thread calls WaitOne?  The problem is if another thread sets
> the
>> event when it is already set.  If this happens the second Set has no
>> effect.  I don't think that's an issue here as the only place that
> sets the
>> event is the result of the operation we're starting?
>>
>> You're right that the waiting.Count>  0 check should have stayed in
> there.
>>
>> My thanks to you for all the work you've put in to WCF- in case you're
>> interested in how it's being used we're embedding a WCF web service in
> to
>> one of our core products (a SIP Switch) and then providing a set of
> web
>> pages that allow users to manage it.
>>
>> 	Matt.
>>
>>
>>> -----Original Message-----
>>> From: Atsushi Eno [mailto:atsushieno at veritas-vos-liberabit.com]
>>> Sent: 24 March 2010 10:58 AM
>>> To: Matt Dargavel
>>> Cc: mono-devel-list at lists.ximian.com
>>> Subject: Re: [PATCH] WCF multithreaded and property handling
>>>
>>> After examining the patch, I have applied some parts of your patch.
>>>
>>> -                wait = new AutoResetEvent (false);
>>> -                source.ListenerManager.GetHttpContextAsync
> (timeout,
>>> HttpContextAcquired);
>>> -                if (wait != null) // in case callback is done
> before
>>> WaitOne() here.
>>> -                    return wait.WaitOne (timeout, false);
>>> -                return waiting.Count>  0;
>>> +                    var wait_ = new AutoResetEvent (false);
>>> +                    wait = wait_;    // wait can be set to null if
>>> HttpContextAcquired runs to completion before we do WaitOne
>>> +                    source.ListenerManager.GetHttpContextAsync
>>> (timeout, HttpContextAcquired);
>>> +                    var result = wait_.WaitOne (timeout, false);
>>> +                    return result;
>>>
>>> This change is wrong. Since it is AutoResetEvent, it must not call
>>> WaitOne() if it has already finished (SignalAsyncWait). And It it
> set to
>>> null when SignalAsyncWait() is done. Also, it should not depend on
>>> specific GetHttpContextAsync() call result, as another async call
> may
>>> receive a context (hence waiting.Count>  0).
>>>
>>> I think I have answered to all non-committed parts of your patch,
> but
>>> further comments are welcome. Thanks again for the patch. You're
> hero,
>>> few people dig in such depth into the WCF
>>> core engine :)
>>>
>>> Atsushi Eno
>>>
>>>
>>> On 2010/03/23 22:33, Matt Dargavel wrote:
>>>> Ok, no problem.  I can break them down more.
>>>>
>>>> You're right, I can provide no guarantees about the Thread.Sleep
>>>> removal!  But it could have been related to locking
> registered_channels
>>>> instead of pending?  I did quite a bit of multithreaded testing,
> and
>>>> there were no problems; but I take your point.
>>>>
>>>> I implemented new functions rather than overriding Properties for
> a few
>>>> reasons.  I wanted to be sure that I found everywhere that used
> the
>>>> properties mechanism to check there were no unwanted side effects,
> and
>>>> to make it more obvious something a little special was going on.
> Also
>> I
>>>> thought that using a function hides the implementation from other
>>>> classes.  For example, the .NET documentation states that
>>>> ChannelListenerBase should search for the property and then
> delegate
>>>> down the stack if it can't find it, so I could see a scenario
> where
>> only
>>>> certain properties were passed to / from inner channels.  But I
> guess
>>>> that's refactoring and personal preference rather than a minimum
> change
>>>> fix. :-)
>>>>
>>>> I can delve in to the test code and come up with some test cases
> for
>> the
>>>> properties fix, but unfortunately I think it'll be impossible to
> write
>>>> test cases for the multithreading issues.
>>>>
>>>> 	Cheers,
>>>>
>>>> 		Matt.
>>>>
>>>>
>>>>
>>>>> -----Original Message-----
>>>>> From: Atsushi Eno [mailto:atsushieno at veritas-vos-liberabit.com]
>>>>> Sent: 23 March 2010 12:50 PM
>>>>> To: Matt Dargavel
>>>>> Cc: mono-devel-list at lists.ximian.com
>>>>> Subject: Re: [PATCH] WCF multithreaded and property handling
>>>>>
>>>>> Hello,
>>>>>
>>>>> Thanks for the patch. They are looking like a great set of
> attempts
>>>>>
>>>> for
>>>>
>>>>> cool bugfixes :) However there is a lot of other changes that
> your
>>>>> description cannot explain. So, please first split the changes
> into
>>>>>
>>>> further
>>>>
>>>>> smaller patches for each purpose, and give explanation for each
>>>>>
>>>> change. For
>>>>
>>>>> example,
>>>>>
>>>>> - // FIXME: this should not be required, but it somehow saves
> some
>>>>>
>>>> failures
>>>>
>>>>> wrt concurrent calls.
>>>>> - Thread.Sleep (100);
>>>>>
>>>>> This kind of change should not be made without explanation. (you
>>>>>
>>>> aren't
>>>>
>>>>> really sure about why it exists, right?)
>>>>>
>>>>> As for ChannelListenerBase.Properties, I'd rather make the
> changes
>>>>>
>>>> much
>>>>
>>>>> smaller like the attached change. Isn't it enough? There's no
> test
>>>>>
>>>> case
>>>>
>>>>> that I can verify your (and-my) changes.
>>>>>
>>>>> Atsushi Eno
>>>>>
>>>>> On 2010/03/23 20:28, Matt Dargavel wrote:
>>>>>
>>>>>> The included patches fix the following:
>>>>>>
>>>>>> multithreaded_fixes.patch: ObjectDisposedException,
>>>>>> InvalidOperationException("Another async TryReceiveRequest
> operation
>>>>>> is in progress") and other multithreaded timing fixes. Also
> includes
>>>>>> change to make GET ?wsdl case insensitive.
>>>>>>
>>>>>> properties_handling.patch: MetadataPublishingInfo not available
> in
>>>>>> TransactionChannelListener's inner_listener. I created a new
>>>>>> RetrieveProperty function as overriding GetProperty<T>   didn't
> work-
>>>>>> the ChannelListenerBase implementation was still called. Perhaps
>>>>>> there's a bug with generic function overrides or maybe I've done
>>>>>> something silly there?
>>>>>>
>>>>>> properties_and_wsdl.patch: patch for ServiceMetadataExtension.cs
>>>>>>
>>>> that
>>>>
>>>>>> goes with the properties changes and the ?wsdl change.
>>>>>>
>>>>>> Let me know if you have any questions. :-)
>>>>>>
>>>>>> Matt.
>>>>>>
>>>>>>
>>>>
>>>>
>>>>
>



More information about the Mono-devel-list mailing list