RE: Monitor.c patch

"Thong (Tum) Nguyen" <tum-x2aT3/[email protected]>
Newsgroups gmane.comp.gnu.dotgnu.developer
Message-ID <[email protected]>
Hi Russell,

I will look at this soon.  I have actually started to do some of what you
have done so I will integrate it with my code.  There are things I see
you've done like change USE_HASHING_MONITORS to USE_SMALL_MONITORS.  I've
actually changed it to IL_CONFIG_USE_THIN_LOCKS (and added profiles to
support that)...etc etc.

I'll send a patch back your way when I'm done...

^Tum

> -----Original Message-----
> From: Russell Stuart [mailto:[email protected]]
> Sent: Wednesday, 5 May 2004 8:35 p.m.
> To: Thong (Tum) Nguyen
> Cc: [email protected]
> Subject: Monitor.c patch
> 
> I have put up a second patch for you to look at.
>  https://savannah.gnu.org/patch/index.php?func=detailitem&item_id=3009
> 
> This is the re-coding of how monitors are created and destroyed.  Given
> that you have fixed the race condition that was plaguing me (although
> I haven't checked it as yet), the original reason for doing this has
> gone.  Still, I think this patch is worth applying.  The reasons are:
> 
> 1.  In the current implementation, the number of global mutexes locked
>     by the typical "lock (...) ..." has gone from 3 to 0, hopefully
>     speeding it up.  I haven't attempted to measure whether it does
>     speed it up, though.
> 
> 2.  Quite a bit of common code has been factored out, hopefully making
>     it all a bit easier to understand.
> 
> 3.  I have removed the per thread free monitor queues.  They are a
>     potential memory leak.  They will leak if one queue creates the
>     monitors and another frees them.
> 
> 4.  The code that checks whether a monitor is "unused" and thus can be
>     freed has been simplified considerably.
> 
> Anyway, if I have got you interested, here are the changes I have made.
> Most all of the changes are to do with how monitors are created and
> destroyed.
> 
> a.  As I described earlier, non-hasing monitors are now only freed
>     on garbage collection.  Hashing monitors work as before.  I used
>     your suggestion of typed GC allocations to to make this work with
>     ILGCAllocAtomic.  The monitor is destroyed by a GC finaliser
>     attached to the monitor.
> 
> b.  When a monitor is created one global mutex is hit.  As before, the
>     monitor is installed with a CompareAndSwap, and this is where the
>     global monitor is used.  If someone re-writes CompareAndSwap to use
>     a hardware interlock, then there will be no global mutex used.
> 
> c.  As mentioned above, the per thread free list is gone.  In the
>     small monitor case there is a single global list.  This does not
>     slow down small monitors as then have to lock a global mutex
>     anyway when allocating or freeing a monitor.
> 
> d.  Although the fast monitor code only frees monitors via the garbage
>     collector, the code to free the monitor as soon as it is unused is
>     still present so it wouldn't be hard to change it back to the
>     old way.  The algorithm used to check if a monitor is unused has
>     changed, however.  Before it was rather complex, and included a
>     call to ILWaitMonitorCanClose.  The new algorithm takes advantage
>     of the fact that if you aren't in a Monitor.Enter()..Monitor.Exit()
>     block, then you can't use the monitor.  So a count of the number
>     of times such a block has been entered but not exited (including
>     waiting on Monitor.Enter()) is kept.  If that count is 0 the
>     monitor can be freed.
> 
> e.  The body of the _IL_Monitor_ routines used by the runtime (such
>     as _IL_Monitor_Exit) is unchanged, apart from catering to the new
>     monitor constructor / destructor code.  But they have all been
>     moved into pnet/engine/monitor.c.  Before the bulk (all?) of
>     them were in pnet/engine/lib_thread.c.  Only monitor.c knows
>     about VM monitors now.  This got rid of a few globals - for
>     example the new version of the ILExecMonitor structure is now
>     private to monitor.c
> 
> This has had the side effect of reducing the number of failures
> in TestMonitor.cs from 5 to 3.  I am not sure if that means anything -
> it may just be hiding a race condition.  If it has fixed a bug, it is
> probably because of the simplified "unused monitor" checking.
> 
> Some other metrics:
> 
>   Speed:          Unchanged, as least when measuring how fast the
>                   test suite runs.  This is probably a lousy test,
>                   but it does show its not dramatically different
>                   one way or the other.
> 
>   Lines of code:  About 180 lines shorter (not counting comment lines).
>                   If you want to check this yourself, I ran this
>                   shell line in the pnet directory to count lines (beware
>                   is contains tabs which have probably been munged by
>                   my mail client):
> 
> egrep -v '^[      ]*(//|/\*|\*/|\*[       ]|\*$|$)' \
>   $(find include engine support -name "*.[ch]") | wc -l
> 
> The small/hashing monitor case hasn't been tested yet - mostly because
> I wanted to get the non-hashing case testing cleaning before I did
> that.
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.