[#5218] Ruby Book Eng tl, ch1 question — Jon Babcock <jon@...>

13 messages 2000/10/02

[#5404] Object.foo, setters and so on — "Hal E. Fulton" <hal9000@...>

OK, here is what I think I know.

14 messages 2000/10/11

[#5425] Ruby Book Eng. tl, 9.8.11 -- seishitsu ? — Jon Babcock <jon@...>

18 messages 2000/10/11
[#5427] RE: Ruby Book Eng. tl, 9.8.11 -- seishitsu ? — OZAWA -Crouton- Sakuro <crouton@...> 2000/10/11

At Thu, 12 Oct 2000 03:49:46 +0900,

[#5429] Re: Ruby Book Eng. tl, 9.8.11 -- seishitsu ? — Jon Babcock <jon@...> 2000/10/11

Thanks for the input.

[#5432] Re: Ruby Book Eng. tl, 9.8.11 -- seishitsu ? — Yasushi Shoji <yashi@...> 2000/10/11

At Thu, 12 Oct 2000 04:53:41 +0900,

[#5516] Re: Some newbye question — ts <decoux@...>

>>>>> "D" == Davide Marchignoli <marchign@di.unipi.it> writes:

80 messages 2000/10/13
[#5531] Re: Some newbye question — matz@... (Yukihiro Matsumoto) 2000/10/14

Hi,

[#5544] Re: Some newbye question — Davide Marchignoli <marchign@...> 2000/10/15

On Sat, 14 Oct 2000, Yukihiro Matsumoto wrote:

[#5576] Re: local variables (nested, in-block, parameters, etc.) — Dave Thomas <Dave@...> 2000/10/16

matz@zetabits.com (Yukihiro Matsumoto) writes:

[#5617] Re: local variables (nested, in-block, parameters, etc.) — "Brian F. Feldman" <green@...> 2000/10/16

Dave Thomas <Dave@thomases.com> wrote:

[#5705] Dynamic languages, SWOT ? — Hugh Sasse Staff Elec Eng <hgs@...>

There has been discussion on this list/group from time to time about

16 messages 2000/10/20
[#5712] Re: Dynamic languages, SWOT ? — Charles Hixson <charleshixsn@...> 2000/10/20

Hugh Sasse Staff Elec Eng wrote:

[#5882] [RFC] Towards a new synchronisation primitive — hipster <hipster@...4all.nl>

Hello fellow rubyists,

21 messages 2000/10/26

[ruby-talk:5309] Re: Proper ConditionVariable usage?

From: hipster <hipster@...4all.nl>
Date: 2000-10-05 14:47:42 UTC
List: ruby-talk #5309
On Thu, 05 Oct 2000  23:06:08 +0900, YANAGAWA Kazuhisa wrote:
> In message <877l7o375b.wl@studly.netlab.co.jp>
> shugo@ruby-lang.org writes:
> 
> > > class YASizedQueue < YAQueue
> > (snip)
> > >   def enq(obj)
> > >     @mutex.synchronize do
> > >       while @que.length >= @max
> > >         @full_cond.wait(@mutex)
> > >       end
> > >       super(obj)
> > >     end
> > >   end
> > 
> > Sorry, Mutex is not re-entrant. (So this program cause dead-lock.)
> > Please use Monitor instead of Mutex.
> 
> NOTE: A problem above is a one of similar situations known as
> ``inheritance anomaly'' --- embedded synchronization codes prevent
> ``normal'' inheritance where one can use super class's code without
> knowledge of its implementation.  Even merely adding constraints may
> need to reimplement other methods.

Agreed. Not only do you inherit an interface, you also inherit (a)
state (machine) that defines the interface's behaviour. This violates
the encapsulation principle. To solve this we could refactor Queue and
siblings:

  AbstractQueue  - a generic queue w/o synchronisation stuff
    Queue        - or `SynchronizedQueue', a synced queue
    SizedQueue   - does _not_ inherit from Queue due to ``inheritance
                   anomaly''
    ...

The synced variants are probably best made `final'.
We should analyze this a bit deeper and maybe introduce some patterns.
State, Strategy and Adapter come to mind.

And another thing (which follows from the above):
To acquire a clean, simple and understandable set of synchronisation
primitives it would, IMO, be a Good Thing to implement all of them
_only_ using the Thread.critical primitive (which Thread.exclusive
nicely wraps). At the possible cost of some code duplication,
decoupling is achieved. Easier to test, easier to maintain.

	- Michel

In This Thread