libbluray | branch: master | hpi1 <[email protected]> | Fri Aug 19 18:30:44 2016 +0300| [539ec3b73f78d0051bd2c23e9256908d0c57d8b4] | committer: hpi1
BDRootWindow: fix possible race conditions in dirty area handling > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=539ec3b73f78d0051bd2c23e9256908d0c57d8b4 --- src/libbluray/bdj/java/java/awt/Area.java | 16 +++++++++++----- src/libbluray/bdj/java/java/awt/BDRootWindow.java | 5 ++--- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/libbluray/bdj/java/java/awt/Area.java b/src/libbluray/bdj/java/java/awt/Area.java index 9f40442..27bde88 100644 --- a/src/libbluray/bdj/java/java/awt/Area.java +++ b/src/libbluray/bdj/java/java/awt/Area.java @@ -40,21 +40,21 @@ class Area { this.y1 = y1; } - public void clear() { + private void clear() { x0 = Integer.MAX_VALUE; y0 = Integer.MAX_VALUE; x1 = -1; y1 = -1; } - public void add(int newx, int newy) { + public synchronized void add(int newx, int newy) { x0 = Math.min(x0, newx); x1 = Math.max(x1, newx); y0 = Math.min(y0, newy); y1 = Math.max(y1, newy); } - public void add(Rectangle r) { + public synchronized void add(Rectangle r) { if ((r.x | r.width | r.y | r.height) >= 0) { x0 = Math.min(x0, r.x); x1 = Math.max(x1, r.x + r.width - 1); @@ -63,14 +63,20 @@ class Area { } } - public boolean isEmpty() { + public synchronized boolean isEmpty() { return (x1 < x0) || (y1 < y0); } - public Area getBounds() { + private synchronized Area getBounds() { return new Area(x0, y0, x1, y1); } + protected synchronized Area getBoundsAndClear() { + Area a = getBounds(); + clear(); + return a; + } + public String toString() { return getClass().getName() + "[" + x0 + "," + y0 + "-" + x1 + "," + y1 + "]"; } diff --git a/src/libbluray/bdj/java/java/awt/BDRootWindow.java b/src/libbluray/bdj/java/java/awt/BDRootWindow.java index 4c4f815..f34da83 100644 --- a/src/libbluray/bdj/java/java/awt/BDRootWindow.java +++ b/src/libbluray/bdj/java/java/awt/BDRootWindow.java @@ -124,8 +124,7 @@ public class BDRootWindow extends Frame { return; } - Area a = dirty.getBounds(); - dirty.clear(); + Area a = dirty.getBoundsAndClear(); if (!a.isEmpty()) { if (!overlay_open) { @@ -188,8 +187,8 @@ public class BDRootWindow extends Frame { if (overlay_open) { logger.error("clearOverlay() ignored (overlay is visible)"); } else { + dirty.getBoundsAndClear(); Arrays.fill(backBuffer, 0); - dirty.clear(); } } } _______________________________________________ libbluray-devel mailing list [email protected] https://mailman.videolan.org/listinfo/libbluray-devel
