From: Tom Tromey Date: Mon, 11 Nov 2002 06:33:08 +0000 (+0000) Subject: Container.java (validate): Use tree lock. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=459c4c517ec265d28e3c35f17f90288979f18c9f;p=gcc.git Container.java (validate): Use tree lock. * java/awt/Container.java (validate): Use tree lock. (getComponent): Likewise. (getComponents): Likewise. (addImpl): Likewise. (remove): Likewise. (removeAll): Likewise. (processEvent): Fixed indentation. (getComponentAt): Use tree lock. (findComponentAt): Likewise. (removeNotify): Likewise. (isAncestorOf): Likewise. (list): Likewise. (visitChildren): Likewise. (findNextFocusComponent): Likewise. (addNotifyContainerChildren): Likewise. (getAccessibleChildrenCount): Likewise. (getAccessibleChild): Likewise. From-SVN: r59009 --- diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 1cb7ddeba89..8d6ae30453e 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,5 +1,23 @@ 2002-11-10 Tom Tromey + * java/awt/Container.java (validate): Use tree lock. + (getComponent): Likewise. + (getComponents): Likewise. + (addImpl): Likewise. + (remove): Likewise. + (removeAll): Likewise. + (processEvent): Fixed indentation. + (getComponentAt): Use tree lock. + (findComponentAt): Likewise. + (removeNotify): Likewise. + (isAncestorOf): Likewise. + (list): Likewise. + (visitChildren): Likewise. + (findNextFocusComponent): Likewise. + (addNotifyContainerChildren): Likewise. + (getAccessibleChildrenCount): Likewise. + (getAccessibleChild): Likewise. + * java/awt/GridLayout.java (layoutContainer): Use tree lock. (getSize): Likewise. * java/awt/FlowLayout.java (layoutContainer): Use tree lock. diff --git a/libjava/java/awt/Container.java b/libjava/java/awt/Container.java index d71a4bf3684..dd2390d35ba 100644 --- a/libjava/java/awt/Container.java +++ b/libjava/java/awt/Container.java @@ -123,9 +123,12 @@ public class Container extends Component */ public Component getComponent(int n) { - if (n < 0 || n >= ncomponents) - throw new ArrayIndexOutOfBoundsException("no such component"); - return component[n]; + synchronized (getTreeLock ()) + { + if (n < 0 || n >= ncomponents) + throw new ArrayIndexOutOfBoundsException("no such component"); + return component[n]; + } } /** @@ -135,10 +138,13 @@ public class Container extends Component */ public Component[] getComponents() { - Component[] result = new Component[ncomponents]; - if (ncomponents > 0) - System.arraycopy(component, 0, result, 0, ncomponents); - return result; + synchronized (getTreeLock ()) + { + Component[] result = new Component[ncomponents]; + if (ncomponents > 0) + System.arraycopy(component, 0, result, 0, ncomponents); + return result; + } } /** @@ -260,69 +266,72 @@ public class Container extends Component */ protected void addImpl(Component comp, Object constraints, int index) { - if (index > ncomponents - || (index < 0 && index != -1) - || comp instanceof Window - || (comp instanceof Container - && ((Container) comp).isAncestorOf(this))) - throw new IllegalArgumentException(); - - // Reparent component, and make sure component is instantiated if - // we are. - if (comp.parent != null) - comp.parent.remove(comp); - comp.parent = this; - if (peer != null) - { - comp.addNotify(); - - if (comp.isLightweight()) - enableEvents(comp.eventMask); - } - - invalidate(); - - if (component == null) - component = new Component[4]; // FIXME, better initial size? - - // This isn't the most efficient implementation. We could do less - // copying when growing the array. It probably doesn't matter. - if (ncomponents >= component.length) - { - int nl = component.length * 2; - Component[] c = new Component[nl]; - System.arraycopy(component, 0, c, 0, ncomponents); - component = c; - } - if (index == -1) - component[ncomponents++] = comp; - else - { - System.arraycopy(component, index, component, index + 1, - ncomponents - index); - component[index] = comp; - ++ncomponents; - } - - // Notify the layout manager. - if (layoutMgr != null) + synchronized (getTreeLock ()) { - if (layoutMgr instanceof LayoutManager2) - { - LayoutManager2 lm2 = (LayoutManager2) layoutMgr; - lm2.addLayoutComponent(comp, constraints); - } - else if (constraints instanceof String) - layoutMgr.addLayoutComponent((String) constraints, comp); - else - layoutMgr.addLayoutComponent(null, comp); + if (index > ncomponents + || (index < 0 && index != -1) + || comp instanceof Window + || (comp instanceof Container + && ((Container) comp).isAncestorOf(this))) + throw new IllegalArgumentException(); + + // Reparent component, and make sure component is instantiated if + // we are. + if (comp.parent != null) + comp.parent.remove(comp); + comp.parent = this; + if (peer != null) + { + comp.addNotify(); + + if (comp.isLightweight()) + enableEvents(comp.eventMask); + } + + invalidate(); + + if (component == null) + component = new Component[4]; // FIXME, better initial size? + + // This isn't the most efficient implementation. We could do less + // copying when growing the array. It probably doesn't matter. + if (ncomponents >= component.length) + { + int nl = component.length * 2; + Component[] c = new Component[nl]; + System.arraycopy(component, 0, c, 0, ncomponents); + component = c; + } + if (index == -1) + component[ncomponents++] = comp; + else + { + System.arraycopy(component, index, component, index + 1, + ncomponents - index); + component[index] = comp; + ++ncomponents; + } + + // Notify the layout manager. + if (layoutMgr != null) + { + if (layoutMgr instanceof LayoutManager2) + { + LayoutManager2 lm2 = (LayoutManager2) layoutMgr; + lm2.addLayoutComponent(comp, constraints); + } + else if (constraints instanceof String) + layoutMgr.addLayoutComponent((String) constraints, comp); + else + layoutMgr.addLayoutComponent(null, comp); + } + + // Post event to notify of adding the container. + ContainerEvent ce = new ContainerEvent(this, + ContainerEvent.COMPONENT_ADDED, + comp); + getToolkit().getSystemEventQueue().postEvent(ce); } - - // Post event to notify of adding the container. - ContainerEvent ce = new ContainerEvent(this, - ContainerEvent.COMPONENT_ADDED, - comp); - getToolkit().getSystemEventQueue().postEvent(ce); } /** @@ -332,24 +341,27 @@ public class Container extends Component */ public void remove(int index) { - Component r = component[index]; + synchronized (getTreeLock ()) + { + Component r = component[index]; - r.removeNotify(); + r.removeNotify(); - System.arraycopy(component, index + 1, component, index, - ncomponents - index - 1); - component[--ncomponents] = null; + System.arraycopy(component, index + 1, component, index, + ncomponents - index - 1); + component[--ncomponents] = null; - invalidate(); + invalidate(); - if (layoutMgr != null) - layoutMgr.removeLayoutComponent(r); + if (layoutMgr != null) + layoutMgr.removeLayoutComponent(r); - // Post event to notify of adding the container. - ContainerEvent ce = new ContainerEvent(this, - ContainerEvent.COMPONENT_REMOVED, - r); - getToolkit().getSystemEventQueue().postEvent(ce); + // Post event to notify of adding the container. + ContainerEvent ce = new ContainerEvent(this, + ContainerEvent.COMPONENT_REMOVED, + r); + getToolkit().getSystemEventQueue().postEvent(ce); + } } /** @@ -359,13 +371,16 @@ public class Container extends Component */ public void remove(Component comp) { - for (int i = 0; i < ncomponents; ++i) + synchronized (getTreeLock ()) { - if (component[i] == comp) - { - remove(i); - break; - } + for (int i = 0; i < ncomponents; ++i) + { + if (component[i] == comp) + { + remove(i); + break; + } + } } } @@ -374,8 +389,11 @@ public class Container extends Component */ public void removeAll() { - while (ncomponents > 0) - remove(0); + synchronized (getTreeLock ()) + { + while (ncomponents > 0) + remove(0); + } } /** @@ -433,8 +451,7 @@ public class Container extends Component */ public void validate() { - // FIXME: use the tree lock? - synchronized (this) + synchronized (getTreeLock ()) { if (! isValid()) { @@ -713,7 +730,8 @@ public class Container extends Component { if (e instanceof ContainerEvent) processContainerEvent((ContainerEvent) e); - else super.processEvent(e); + else + super.processEvent(e); } /** @@ -764,20 +782,23 @@ public class Container extends Component */ public Component getComponentAt(int x, int y) { - if (! contains(x, y)) - return null; - for (int i = 0; i < ncomponents; ++i) + synchronized (getTreeLock ()) { - // Ignore invisible children... - if (!component[i].isVisible()) - continue; - - int x2 = x - component[i].x; - int y2 = y - component[i].y; - if (component[i].contains(x2, y2)) - return component[i]; + if (! contains(x, y)) + return null; + for (int i = 0; i < ncomponents; ++i) + { + // Ignore invisible children... + if (!component[i].isVisible()) + continue; + + int x2 = x - component[i].x; + int y2 = y - component[i].y; + if (component[i].contains(x2, y2)) + return component[i]; + } + return this; } - return this; } /** @@ -818,31 +839,34 @@ public class Container extends Component public Component findComponentAt(int x, int y) { - if (! contains(x, y)) - return null; - - for (int i = 0; i < ncomponents; ++i) + synchronized (getTreeLock ()) { - // Ignore invisible children... - if (!component[i].isVisible()) - continue; - - int x2 = x - component[i].x; - int y2 = y - component[i].y; - // We don't do the contains() check right away because - // findComponentAt would redundantly do it first thing. - if (component[i] instanceof Container) - { - Container k = (Container) component[i]; - Component r = k.findComponentAt(x2, y2); - if (r != null) - return r; - } - else if (component[i].contains(x2, y2)) - return component[i]; + if (! contains(x, y)) + return null; + + for (int i = 0; i < ncomponents; ++i) + { + // Ignore invisible children... + if (!component[i].isVisible()) + continue; + + int x2 = x - component[i].x; + int y2 = y - component[i].y; + // We don't do the contains() check right away because + // findComponentAt would redundantly do it first thing. + if (component[i] instanceof Container) + { + Container k = (Container) component[i]; + Component r = k.findComponentAt(x2, y2); + if (r != null) + return r; + } + else if (component[i].contains(x2, y2)) + return component[i]; + } + + return this; } - - return this; } public Component findComponentAt(Point p) @@ -868,9 +892,12 @@ public class Container extends Component */ public void removeNotify() { - for (int i = 0; i < ncomponents; ++i) - component[i].removeNotify(); - super.removeNotify(); + synchronized (getTreeLock ()) + { + for (int i = 0; i < ncomponents; ++i) + component[i].removeNotify(); + super.removeNotify(); + } } /** @@ -880,17 +907,20 @@ public class Container extends Component * @param component The component to test. * * @return true if this container is an ancestor of the - * specified component, false. + * specified component, false otherwise. */ public boolean isAncestorOf(Component comp) { - while (true) + synchronized (getTreeLock ()) { - if (comp == null) - return false; - if (comp == this) - return true; - comp = comp.getParent(); + while (true) + { + if (comp == null) + return false; + if (comp == this) + return true; + comp = comp.getParent(); + } } } @@ -918,9 +948,12 @@ public class Container extends Component */ public void list(PrintStream out, int indent) { - super.list(out, indent); - for (int i = 0; i < ncomponents; ++i) - component[i].list(out, indent + 2); + synchronized (getTreeLock ()) + { + super.list(out, indent); + for (int i = 0; i < ncomponents; ++i) + component[i].list(out, indent + 2); + } } /** @@ -932,9 +965,12 @@ public class Container extends Component */ public void list(PrintWriter out, int indent) { - super.list(out, indent); - for (int i = 0; i < ncomponents; ++i) - component[i].list(out, indent + 2); + synchronized (getTreeLock ()) + { + super.list(out, indent); + for (int i = 0; i < ncomponents; ++i) + component[i].list(out, indent + 2); + } } public void setFocusTraversalKeys(int id, Set keys) @@ -1006,16 +1042,17 @@ public class Container extends Component private void visitChildren(Graphics gfx, GfxVisitor visitor, boolean lightweightOnly) { - // FIXME: do locking - - for (int i = 0; i < ncomponents; ++i) + synchronized (getTreeLock ()) { - Component comp = component[i]; - boolean applicable = comp.isVisible() - && (comp.isLightweight() || !lightweightOnly); - - if (applicable) - visitChild(gfx, visitor, comp); + for (int i = 0; i < ncomponents; ++i) + { + Component comp = component[i]; + boolean applicable = comp.isVisible() + && (comp.isLightweight() || !lightweightOnly); + + if (applicable) + visitChild(gfx, visitor, comp); + } } } @@ -1061,59 +1098,65 @@ public class Container extends Component // This is used to implement Component.transferFocus. Component findNextFocusComponent(Component child) { - int start, end; - if (child != null) - { - for (start = 0; start < ncomponents; ++start) - { - if (component[start] == child) - break; - } - end = start; - // This special case lets us be sure to terminate. - if (end == 0) - end = ncomponents; - ++start; - } - else - { - start = 0; - end = ncomponents; - } - - for (int j = start; j != end; ++j) + synchronized (getTreeLock ()) { - if (j >= ncomponents) - { - // The JCL says that we should wrap here. However, that - // seems wrong. To me it seems that focus order should be - // global within in given window. So instead if we reach - // the end we try to look in our parent, if we have one. - if (parent != null) - return parent.findNextFocusComponent(this); - j -= ncomponents; - } - if (component[j] instanceof Container) - { - Component c = component[j]; - c = c.findNextFocusComponent(null); - if (c != null) - return c; - } - else if (component[j].isFocusTraversable()) - return component[j]; + int start, end; + if (child != null) + { + for (start = 0; start < ncomponents; ++start) + { + if (component[start] == child) + break; + } + end = start; + // This special case lets us be sure to terminate. + if (end == 0) + end = ncomponents; + ++start; + } + else + { + start = 0; + end = ncomponents; + } + + for (int j = start; j != end; ++j) + { + if (j >= ncomponents) + { + // The JCL says that we should wrap here. However, that + // seems wrong. To me it seems that focus order should be + // global within in given window. So instead if we reach + // the end we try to look in our parent, if we have one. + if (parent != null) + return parent.findNextFocusComponent(this); + j -= ncomponents; + } + if (component[j] instanceof Container) + { + Component c = component[j]; + c = c.findNextFocusComponent(null); + if (c != null) + return c; + } + else if (component[j].isFocusTraversable()) + return component[j]; + } + + return null; } - - return null; } private void addNotifyContainerChildren() { - for (int i = ncomponents; --i >= 0; ) + synchronized (getTreeLock ()) { - component[i].addNotify(); - if (component[i].isLightweight()) - enableEvents(component[i].eventMask); + for (int i = ncomponents; --i >= 0; ) + { + component[i].addNotify(); + if (component[i].isLightweight()) + enableEvents(component[i].eventMask); + } } } @@ -1190,12 +1233,15 @@ public class Container extends Component */ public int getAccessibleChildrenCount() { - int count = 0; - int i = component == null ? 0 : component.length; - while (--i >= 0) - if (component[i] instanceof Accessible) - count++; - return count; + synchronized (getTreeLock ()) + { + int count = 0; + int i = component == null ? 0 : component.length; + while (--i >= 0) + if (component[i] instanceof Accessible) + count++; + return count; + } } /** @@ -1206,15 +1252,18 @@ public class Container extends Component */ public Accessible getAccessibleChild(int i) { - if (component == null) - return null; - int index = -1; - while (i >= 0 && ++index < component.length) - if (component[index] instanceof Accessible) - i--; - if (i < 0) - return (Accessible) component[index]; - return null; + synchronized (getTreeLock ()) + { + if (component == null) + return null; + int index = -1; + while (i >= 0 && ++index < component.length) + if (component[index] instanceof Accessible) + i--; + if (i < 0) + return (Accessible) component[index]; + return null; + } } /**