< prev index next >

modules/base/src/main/java/javafx/beans/property/DoublePropertyBase.java

Print this page
rev 9211 : 8130458: Memory leak in bind/unbind of [Primitive]PropertyBase

*** 169,193 **** ObservableDoubleValue newObservable; if (rawObservable instanceof ObservableDoubleValue) { newObservable = (ObservableDoubleValue)rawObservable; } else if (rawObservable instanceof ObservableNumberValue) { final ObservableNumberValue numberValue = (ObservableNumberValue)rawObservable; ! newObservable = new DoubleBinding() { ! { ! super.bind(rawObservable); ! } @Override protected double computeValue() { return numberValue.doubleValue(); } }; } else { ! newObservable = new DoubleBinding() { ! { ! super.bind(rawObservable); ! } @Override protected double computeValue() { final Number value = rawObservable.getValue(); return (value == null)? 0.0 : value.doubleValue(); --- 169,187 ---- ObservableDoubleValue newObservable; if (rawObservable instanceof ObservableDoubleValue) { newObservable = (ObservableDoubleValue)rawObservable; } else if (rawObservable instanceof ObservableNumberValue) { final ObservableNumberValue numberValue = (ObservableNumberValue)rawObservable; ! newObservable = new ValueWrapper(rawObservable) { @Override protected double computeValue() { return numberValue.doubleValue(); } }; } else { ! newObservable = new ValueWrapper(rawObservable) { @Override protected double computeValue() { final Number value = rawObservable.getValue(); return (value == null)? 0.0 : value.doubleValue();
*** 212,221 **** --- 206,218 ---- @Override public void unbind() { if (observable != null) { value = observable.get(); observable.removeListener(listener); + if (observable instanceof ValueWrapper) { + ((ValueWrapper)observable).dispose(); + } observable = null; } } /**
*** 268,273 **** --- 265,285 ---- @Override public boolean wasGarbageCollected() { return wref.get() == null; } } + + private abstract class ValueWrapper extends DoubleBinding { + + private ObservableValue<? extends Number> observable; + + public ValueWrapper(ObservableValue<? extends Number> observable) { + this.observable = observable; + bind(observable); + } + + @Override + public void dispose() { + unbind(observable); + } + } }
< prev index next >