Hi all,

As Michiel points, we shouldn't abuse of the AWT thread.
updateListeners is thread-safe, so it can be called in any thread
without problems.

I'd like to update Bob's solution as below.

BTW, I agree with Bob that we should investigate about calling
updateListeners. Maybe I'm missing something, but what is the reason
of
updateListeners(getOwner(),getOwner())? In ModelElement, updateListeners has:
    protected void updateListeners(Object oldOwner, Object newOwner) {
        if (oldOwner == newOwner) {
            return;
        }
Shouldn't this call be removed or I'm missing something?


On Sat, Apr 12, 2008 at 6:05 PM, Bob Tarling <[EMAIL PROTECTED]> wrote:
> Hmmm, I suspect that we're doing far too much when we get a model
>  event anyway, I've never been sure about things like
>  FigNodeModelElement.updateListeners being called so frequently. I
>  think that needs some investigation.
>
>  But if we are aware that there are certain things that should happen
>  in different threads then I think it would be useful to separate
>  methods for handling each thread in a consistent way.
>
>  e.g. in FigNodeModelElement
>
>
    final protected void modelChanged(final PropertyChangeEvent mee) {
        Runnable doWorkRunnable = new Runnable() {
            public void run() {
                modelChangedImpl(mee);
            }
        };
        SwingUtilities.invokeLater(doWorkRunnable);
        updateNotation();
        updateListeners(); <<<
    }
>
>    /**
>     * Alert the notation subsystem that change has taken place in the model
>     */
>    protected void updateNotation(PropertyChangeEvent event) {
>        // Here goes the notation code previously in modelChanged
>    }
>
>    /**
>     * Guaranteed to execute in AWT thread to update the layout of the
>  Fig composition
>     * as a result of a change in the model.
>     */
>    protected void modelChangedImpl(PropertyChangeEvent event) {
>        // Here goes the other code previously in modelChanged
>
>
>    }
>
>
>
>
>  On 12/04/2008, Bob Tarling <[EMAIL PROTECTED]> wrote:
>  > Is it not possibel that updateListeners and
>  >  NotationProvider.updateListener is ever called from the AWT thread
>  >  also? So we just move the problem somewhere else.
>  >
>  >  Is there actually an advantage of having those calls on the MDR
>  >  thread? Is it a performance issue to take work away from the AWT
>  >  thread?
>  >
>  >  If not then wouldn't it be safer to make sure that everything in that
>  >  method is on AWT thread by my suggested change to
>  >  FigNodeModelElement/FigEdgeModelElement.
>  >
>  >
>  >  Bob,
>  >
>  >
>  >
>  >
>  >  On 12/04/2008, Michiel van der Wulp <[EMAIL PROTECTED]> wrote:
>  >  > Hi Bob, Christian,
>  >  >
>  >  >  The current code is as follows:
>  >  >
>  >  >    protected void modelChanged(final PropertyChangeEvent mee) {
>  >  >        super.modelChanged(mee);
>  >  >        if (mee instanceof AddAssociationEvent
>  >  >                || mee instanceof RemoveAssociationEvent
>  >  >                || mee instanceof AttributeChangeEvent) {
>  >  >            Runnable doWorkRunnable = new Runnable() {
>  >  >                public void run() {
>  >  >                    renderingChanged();
>  >  >                    updateListeners(getOwner(), getOwner());
>  >  >                    notationProvider.updateListener(
>  >  >                     FigClassifierRole.this, getOwner(), mee);
>  >  >                    damage();
>  >  >                }
>  >  >            };
>  >  >
>  >  >            SwingUtilities.invokeLater(doWorkRunnable);
>  >  >        }
>  >  >    }
>  >  >
>  >  >
>  >  >  But, since the both updateListener calls only are intended to query the
>  >  > model, and do not impact the graphic representation, it should be as
>  >  > follows:
>  >  >
>  >  >    protected void modelChanged(final PropertyChangeEvent mee) {
>  >  >        super.modelChanged(mee);
>  >  >        if (mee instanceof AddAssociationEvent
>  >  >                || mee instanceof RemoveAssociationEvent
>  >  >                || mee instanceof AttributeChangeEvent) {
>  >  >            Runnable doWorkRunnable = new Runnable() {
>  >  >                public void run() {
>  >  >                    renderingChanged();
>  >  >                    damage();
>  >  >                }
>  >  >            };
>  >  >            updateListeners(getOwner(), getOwner());
>  >  >            notationProvider.updateListener(
>  >  >                    FigClassifierRole.this, getOwner(), mee);
>  >  >            SwingUtilities.invokeLater(doWorkRunnable);
>  >  >        }
>  >  >    }
>  >  >
>  >  >  IIRC, then this kind of seperating between threads has been discussed
>  >  > between me and Tom.
>  >  >  Please also read the comments with
>  >  > NotationProvider.updateListener().
>  >  >
>  >  >  Regards,
>  >  >  Michiel
>  >  >
>  >  >
>  >  >
>  >  >
>  >  >
>  >  >  ----- Original Message ----- From: "Bob Tarling" <[EMAIL PROTECTED]>
>  >  >  To: <[email protected]>
>  >  >  Sent: Saturday, April 12, 2008 1:48 AM
>  >  >  Subject: [argouml-dev] modelChanged in Figs should invokeLater
>  >  >
>  >  >
>  >  >
>  >  > >
>  >  > > Christian came across a problem with concurrency in FigClassifierRole
>  >  > > of the new sequence diagrams.
>  >  > >
>  >  > > The problem was that drawing of a message edge (user interaction an
>  >  > > AWT thread) was effecting the Fig composition at the same time as the
>  >  > > same Fig was receiving a model event which also resulted in a change
>  >  > > to the Fig composition.
>  >  > >
>  >  > > Forcing the handling of the model event to the AWT thread solved this.
>  >  > >
>  >  > > I'm thinking that this is probably something we should do in general
>  >  > > in Figs to be safe
>  >  > >
>  >  > > Something like the following in FigNodeModelElement (and Edge)
>  >  > >
>  >  > >   final protected void modelChanged(final PropertyChangeEvent mee) {
>  >  > >       Runnable doWorkRunnable = new Runnable() {
>  >  > >           public void run() {
>  >  > >               modelChangedImpl(mee);
>  >  > >           }
>  >  > >       };
>  >  > >
>  >  > >       SwingUtilities.invokeLater(doWorkRunnable);
>  >  > >   }
>  >  > >
>  >  > >   protected void modelChangedImpl(PropertyChangeEvent
>  >  > mee) {
>  >  > >       // Here goes the code previously in modelChanged
>  >  > >   }
>  >  > >
>  >  > >
>  >  > > Sound reasonable?
>  >  > >
>  >  > > Bob.
>  >  > >
>  >  > >
>  >  > ---------------------------------------------------------------------
>  >  > > To unsubscribe, e-mail:
>  >  > [EMAIL PROTECTED]
>  >  > > For additional commands, e-mail: [EMAIL PROTECTED]
>  >  > >
>  >  > >
>  >  > >
>  >  > > --
>  >  > > No virus found in this incoming message.
>  >  > > Checked by AVG.
>  >  > > Version: 7.5.519 / Virus Database: 269.22.12/1373 - Release Date:
>  >  > 11/04/2008 9:17
>  >  > >
>  >  > >
>  >  > >
>  >  >
>  >  >
>  >  > ---------------------------------------------------------------------
>  >  >  To unsubscribe, e-mail: [EMAIL PROTECTED]
>  >  >  For additional commands, e-mail: [EMAIL PROTECTED]
>  >  >
>  >  >
>  >
>
>  ---------------------------------------------------------------------
>  To unsubscribe, e-mail: [EMAIL PROTECTED]
>  For additional commands, e-mail: [EMAIL PROTECTED]
>
>



-- 
Regards,

Christian López Espínola

Reply via email to