Re: [Pydev-cvs] org.python.pydev/src/org/python/pydev/outline PyOutlinePage.java, 1.25, 1.26 Outli
Brought to you by:
fabioz
|
From: Fabio Z. <fa...@gm...> - 2008-08-22 11:06:17
|
Hi Radim... Just fixed it. Thanks for reviewing it!
Cheers,
Fabio
On Fri, Aug 22, 2008 at 2:52 AM, Radim Kubacki <ra...@ku...> wrote:
> A comment about your synchronization patch:
>
> When I saw it I thought it cannot work. But I was surprised that
> autoboxing is so smart that
> Integer i; i++;
> causes conversion from Integer to int, increment and then (even if it
> is postfix increment) conversion back to Integer and storing to i
> variable. So far so good.
>
> 2nd idea: why volatile when every access is done inside this
> synchronized block?
>
> And now there is a reason why it does not work as you probably expect:
> Integer is an immutable object after each ++/-- you have another
> instance to synchronize on. So there can be more threads inside this
> synchronized block than one. For example if linkLevel is 0 one thread
> can start relinkAll and increment it, second thread calls unlinkAll
> and executes remove*() before add*() is called in 1st thread because
> it now sees different object assgned to linkLevel (and it volatile to
> inrease the chance that it will happen).
>
> Use
> private final Object lock = new Object();
> private int linkLevel = 1
> + synchronized(lock)
>
> Without the need for 1.4 compatibility you could also use
> AtomicInteger.{increment|decrement}AndGet()
>
> Yet another reason why your patch is bad: if you read
>
> http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.7
> carefully you will see that the intent is to provide the same instance
> for the same primitive values. Synchronizing on a publicly known
> object is wrong. If someone else starts to do the same at some other
> random place in the codebase you can get interesting contention
> (better) or deadlocks (worse).
>
> -Radim
>
> On Thu, Aug 21, 2008 at 1:56 PM, Fabio Zadrozny
> <fa...@us...> wrote:
> > Update of /cvsroot/pydev/org.python.pydev/src/org/python/pydev/outline
> > In directory sc8-pr-cvs1.sourceforge.net:
> /tmp/cvs-serv19176/src/org/python/pydev/outline
> >
> > Modified Files:
> > PyOutlinePage.java OutlineLinkWithEditorAction.java
> > Log Message:
> > Minor changes for console / possible race condition on linking with
> outline page.
> >
> > Index: PyOutlinePage.java
> > ===================================================================
> > RCS file:
> /cvsroot/pydev/org.python.pydev/src/org/python/pydev/outline/PyOutlinePage.java,v
> > retrieving revision 1.25
> > retrieving revision 1.26
> > ***************
> > *** 299,313 ****
> > }
> >
> > void unlinkAll() {
> > ! removeSelectionChangedListener(selectionListener);
> > ! if(linkWithEditor != null){
> > ! linkWithEditor.unlink();
> > }
> > }
> >
> > void relinkAll() {
> > ! addSelectionChangedListener(selectionListener);
> > ! if(linkWithEditor != null){
> > ! linkWithEditor.relink();
> > }
> > }
> > --- 305,343 ----
> > }
> >
> > + /**
> > + * Used to hold a link level to know when it should be unlinked or
> relinked, as calls can be 'cascaded'
> > + */
> > + private volatile Integer linkLevel = 1;
> > +
> > + /**
> > + * Stops listening to changes (the linkLevel is used so that
> multiple unlinks can be called and later
> > + * multiple relinks should be used)
> > + */
> > void unlinkAll() {
> > ! synchronized (linkLevel) {
> > ! linkLevel--;
> > ! if(linkLevel == 0){
> > !
> removeSelectionChangedListener(selectionListener);
> > ! if(linkWithEditor != null){
> > ! linkWithEditor.unlink();
> > ! }
> > ! }
> > }
> > }
> >
> > + /**
> > + * Starts listening to changes again if the number of relinks
> matches the number of unlinks
> > + */
> > void relinkAll() {
> > ! synchronized (linkLevel) {
> > ! linkLevel++;
> > ! if(linkLevel == 1){
> > !
> addSelectionChangedListener(selectionListener);
> > ! if(linkWithEditor != null){
> > ! linkWithEditor.relink();
> > ! }
> > ! }else if(linkLevel > 1){
> > ! throw new RuntimeException("Error:
> relinking without unlinking 1st");
> > ! }
> > }
> > }
> >
> > Index: OutlineLinkWithEditorAction.java
> > ===================================================================
> > RCS file:
> /cvsroot/pydev/org.python.pydev/src/org/python/pydev/outline/OutlineLinkWithEditorAction.java,v
> > retrieving revision 1.8
> > retrieving revision 1.9
> > diff -C2 -d -r1.8 -r1.9
> > *** OutlineLinkWithEditorAction.java 5 Feb 2008 23:11:12 -0000
> 1.8
> > --- OutlineLinkWithEditorAction.java 21 Aug 2008 20:56:28 -0000
> 1.9
> > ***************
> > *** 25,28 ****
> > --- 25,34 ----
> > * editor.
> > *
> > + * Design notes:
> > + * It's linked on the constructor and unlinked in the destructor.
> > + *
> > + * It considers that it's always linked, even if the action is
> inactive, but before executing it, a
> > + * check is done to see if it's active or not.
> > + *
> > * @author Fabio
> > */
> > ***************
> > *** 40,43 ****
> > --- 46,52 ----
> > }
> >
> > + /**
> > + * When called, it STOPS hearing notifications to update the
> outline when the cursor changes positions.
> > + */
> > public void unlink() {
> > PyEdit edit = pyEdit.get();
> > ***************
> > *** 47,50 ****
> > --- 56,62 ----
> > }
> >
> > + /**
> > + * When called, it STARTS hearing notifications to update the
> outline when the cursor changes positions.
> > + */
> > public void relink() {
> > PyEdit edit = pyEdit.get();
> > ***************
> > *** 158,161 ****
> > --- 170,176 ----
> >
> >
> > + /**
> > + * @return The parsed item that should be selected given the
> startLine passed.
> > + */
> > private ParsedItem findSel(ParsedItem r, int startLine) {
> > ParsedItem prev = null;
> >
> >
> > -------------------------------------------------------------------------
> > This SF.Net email is sponsored by the Moblin Your Move Developer's
> challenge
> > Build the coolest Linux based applications with Moblin SDK & win great
> prizes
> > Grand prize is a trip for two to an Open Source event anywhere in the
> world
> > http://moblin-contest.org/redirect.php?banner_id=100&url=/
> > _______________________________________________
> > Pydev-cvs mailing list
> > Pyd...@li...
> > https://lists.sourceforge.net/lists/listinfo/pydev-cvs
> >
>
|