Fix for bug 381597: Deadlock with
authorPatrick Tasse <patrick.tasse@gmail.com>
Mon, 4 Jun 2012 21:14:53 +0000 (17:14 -0400)
committerPatrick Tasse <patrick.tasse@gmail.com>
Mon, 4 Jun 2012 21:43:23 +0000 (17:43 -0400)
org.eclipse.linuxtools.tmf.ui.viewers.events.TmfEventsCache.getFilteredEventIndex(long)

org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/viewers/events/TmfEventsCache.java

index 8a55d4fbeade0d930d132c2d04aba5eb2b241728..24b803c83a5a9207d7e4c0cd0d8e10b430852f36 100644 (file)
@@ -28,15 +28,15 @@ import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
 \r
 public class TmfEventsCache {\r
 \r
-       public static class CachedEvent {\r
-               ITmfEvent event;\r
-               long rank;\r
+    public static class CachedEvent {\r
+        ITmfEvent event;\r
+        long rank;\r
 \r
-               public CachedEvent (ITmfEvent iTmfEvent, long rank) {\r
-                       this.event = iTmfEvent;\r
-                       this.rank = rank;\r
-               }\r
-       }\r
+        public CachedEvent (ITmfEvent iTmfEvent, long rank) {\r
+            this.event = iTmfEvent;\r
+            this.rank = rank;\r
+        }\r
+    }\r
 \r
     private final CachedEvent[] fCache;\r
     private int fCacheStartIndex = 0;\r
@@ -48,29 +48,29 @@ public class TmfEventsCache {
     private final List<Integer> fFilterIndex = new ArrayList<Integer>(); // contains the event rank at each 'cache size' filtered events\r
 \r
     public TmfEventsCache(int cacheSize, TmfEventsTable table) {\r
-       fCache = new CachedEvent[cacheSize];\r
-       fTable = table;\r
+        fCache = new CachedEvent[cacheSize];\r
+        fTable = table;\r
     }\r
 \r
     public void setTrace(ITmfTrace<?> trace) {\r
-       fTrace = trace;\r
-       clear();\r
+        fTrace = trace;\r
+        clear();\r
     }\r
 \r
     public synchronized void clear() {\r
-       fCacheStartIndex = 0;\r
-       fCacheEndIndex = 0;\r
-       fFilterIndex.clear();\r
+        fCacheStartIndex = 0;\r
+        fCacheEndIndex = 0;\r
+        fFilterIndex.clear();\r
     }\r
 \r
     public void applyFilter(ITmfFilter filter) {\r
-       fFilter = filter;\r
-       clear();\r
+        fFilter = filter;\r
+        clear();\r
     }\r
 \r
     public void clearFilter() {\r
-       fFilter = null;\r
-       clear();\r
+        fFilter = null;\r
+        clear();\r
     }\r
 \r
     public synchronized CachedEvent getEvent(int index) {\r
@@ -79,7 +79,7 @@ public class TmfEventsCache {
             return fCache[i];\r
         }\r
         populateCache(index);\r
-       return null;\r
+        return null;\r
     }\r
 \r
     public synchronized CachedEvent peekEvent(int index) {\r
@@ -87,106 +87,105 @@ public class TmfEventsCache {
             int i = index - fCacheStartIndex;\r
             return fCache[i];\r
         }\r
-       return null;\r
+        return null;\r
     }\r
 \r
     public synchronized void storeEvent(ITmfEvent event, long rank, int index) {\r
-       if (fCacheStartIndex == fCacheEndIndex) {\r
-               fCacheStartIndex = index;\r
-               fCacheEndIndex = index;\r
-       }\r
-       if (index == fCacheEndIndex) {\r
-               int i = index - fCacheStartIndex;\r
-               if (i < fCache.length) {\r
-                       fCache[i] = new CachedEvent(event.clone(), rank);\r
-                       fCacheEndIndex++;\r
-               }\r
-       }\r
-       if ((fFilter != null) && ((index % fCache.length) == 0)) {\r
-               int i = index / fCache.length;\r
-               fFilterIndex.add(i, Integer.valueOf((int) rank));\r
-       }\r
+        if (index == fCacheEndIndex) {\r
+            int i = index - fCacheStartIndex;\r
+            if (i < fCache.length) {\r
+                fCache[i] = new CachedEvent(event.clone(), rank);\r
+                fCacheEndIndex++;\r
+            }\r
+        }\r
+        if ((fFilter != null) && ((index % fCache.length) == 0)) {\r
+            int i = index / fCache.length;\r
+            fFilterIndex.add(i, Integer.valueOf((int) rank));\r
+        }\r
     }\r
 \r
     @SuppressWarnings("unchecked")\r
-    public synchronized int getFilteredEventIndex(final long rank) {\r
-       int current;\r
-       int startRank;\r
-       TmfDataRequest<ITmfEvent> request;\r
-       synchronized (this) {\r
-               int start = 0;\r
-               int end = fFilterIndex.size();\r
-\r
-               if ((fCacheEndIndex - fCacheStartIndex) > 1) {\r
-                       if (rank < fCache[0].rank) {\r
-                               end = (fCacheStartIndex / fCache.length) + 1;\r
-                       } else if (rank > fCache[fCacheEndIndex - fCacheStartIndex - 1].rank) {\r
-                               start = fCacheEndIndex / fCache.length;\r
-                       } else {\r
-                               for (int i = 0; i < (fCacheEndIndex - fCacheStartIndex); i++) {\r
-                                       if (fCache[i].rank >= rank) {\r
-                                               return fCacheStartIndex + i;\r
-                                       }\r
-                               }\r
-                               return fCacheEndIndex;\r
-                       }\r
-               }\r
-\r
-               current = (start + end) / 2;\r
-               while (current != start) {\r
-                       if (rank < fFilterIndex.get(current)) {\r
-                               end = current;\r
-                               current = (start + end) / 2;\r
-                       } else {\r
-                               start = current;\r
-                               current = (start + end) / 2;\r
-                       }\r
-               }\r
-               startRank = fFilterIndex.get(current);\r
-       }\r
-\r
-       final int index = current * fCache.length;\r
-\r
-       class DataRequest<T extends ITmfEvent> extends TmfDataRequest<T> {\r
-               int fRank;\r
-               int fIndex;\r
-\r
-               DataRequest(Class<T> dataType, int start, int nbRequested) {\r
-                       super(dataType, start, nbRequested);\r
-                       fRank = start;\r
-                       fIndex = index;\r
-               }\r
-\r
-                       @Override\r
-                       public void handleData(T event) {\r
-                               super.handleData(event);\r
-                               if (isCancelled()) {\r
+    public int getFilteredEventIndex(final long rank) {\r
+        int current;\r
+        int startRank;\r
+        TmfDataRequest<ITmfEvent> request;\r
+        final ITmfFilter filter = fFilter;\r
+        synchronized (this) {\r
+            int start = 0;\r
+            int end = fFilterIndex.size();\r
+\r
+            if ((fCacheEndIndex - fCacheStartIndex) > 1) {\r
+                if (rank < fCache[0].rank) {\r
+                    end = (fCacheStartIndex / fCache.length) + 1;\r
+                } else if (rank > fCache[fCacheEndIndex - fCacheStartIndex - 1].rank) {\r
+                    start = fCacheEndIndex / fCache.length;\r
+                } else {\r
+                    for (int i = 0; i < (fCacheEndIndex - fCacheStartIndex); i++) {\r
+                        if (fCache[i].rank >= rank) {\r
+                            return fCacheStartIndex + i;\r
+                        }\r
+                    }\r
+                    return fCacheEndIndex;\r
+                }\r
+            }\r
+\r
+            current = (start + end) / 2;\r
+            while (current != start) {\r
+                if (rank < fFilterIndex.get(current)) {\r
+                    end = current;\r
+                    current = (start + end) / 2;\r
+                } else {\r
+                    start = current;\r
+                    current = (start + end) / 2;\r
+                }\r
+            }\r
+            startRank = fFilterIndex.size() > 0 ? fFilterIndex.get(current) : 0;\r
+        }\r
+\r
+        final int index = current * fCache.length;\r
+\r
+        class DataRequest<T extends ITmfEvent> extends TmfDataRequest<T> {\r
+            ITmfFilter fFilter;\r
+            int fRank;\r
+            int fIndex;\r
+\r
+            DataRequest(Class<T> dataType, ITmfFilter filter, int start, int nbRequested) {\r
+                super(dataType, start, nbRequested);\r
+                fFilter = filter;\r
+                fRank = start;\r
+                fIndex = index;\r
+            }\r
+\r
+            @Override\r
+            public void handleData(T event) {\r
+                super.handleData(event);\r
+                if (isCancelled()) {\r
                     return;\r
                 }\r
-                               if (fRank >= rank) {\r
-                                       cancel();\r
-                                       return;\r
-                               }\r
-                               fRank++;\r
-                               if (fFilter.matches(event)) {\r
-                                       fIndex++;\r
-                               }\r
-                       }\r
-\r
-                       public int getFilteredIndex() {\r
-                   return fIndex;\r
+                if (fRank >= rank) {\r
+                    cancel();\r
+                    return;\r
+                }\r
+                fRank++;\r
+                if (fFilter.matches(event)) {\r
+                    fIndex++;\r
+                }\r
+            }\r
+\r
+            public int getFilteredIndex() {\r
+                return fIndex;\r
             }\r
-       }\r
-\r
-       request = new DataRequest<ITmfEvent>(ITmfEvent.class, startRank, TmfDataRequest.ALL_DATA);\r
-               ((ITmfDataProvider<ITmfEvent>) fTrace).sendRequest(request);\r
-               try {\r
-                       request.waitForCompletion();\r
-                       return ((DataRequest<ITmfEvent>) request).getFilteredIndex();\r
-               } catch (InterruptedException e) {\r
-                   Activator.getDefault().logError("Filter request interrupted!", e); //$NON-NLS-1$\r
-               }\r
-       return 0;\r
+        }\r
+\r
+        request = new DataRequest<ITmfEvent>(ITmfEvent.class, filter, startRank, TmfDataRequest.ALL_DATA);\r
+        ((ITmfDataProvider<ITmfEvent>) fTrace).sendRequest(request);\r
+        try {\r
+            request.waitForCompletion();\r
+            return ((DataRequest<ITmfEvent>) request).getFilteredIndex();\r
+        } catch (InterruptedException e) {\r
+            Activator.getDefault().logError("Filter request interrupted!", e); //$NON-NLS-1$\r
+        }\r
+        return 0;\r
     }\r
 \r
     // ------------------------------------------------------------------------\r
@@ -221,23 +220,23 @@ public class TmfEventsCache {
         fCacheEndIndex   = index;\r
 \r
         job = new Job("Fetching Events") { //$NON-NLS-1$\r
-               private int startIndex = index;\r
-               private int skipCount = 0;\r
+            private int startIndex = index;\r
+            private int skipCount = 0;\r
             @Override\r
             @SuppressWarnings("unchecked")\r
             protected IStatus run(final IProgressMonitor monitor) {\r
 \r
-               int nbRequested;\r
-               if (fFilter == null) {\r
-                       nbRequested = fCache.length;\r
-               } else {\r
-                       nbRequested = TmfDataRequest.ALL_DATA;\r
-                       int i = index / fCache.length;\r
-                       if (i < fFilterIndex.size()) {\r
-                               startIndex = fFilterIndex.get(i);\r
-                               skipCount = index - (i * fCache.length);\r
-                       }\r
-               }\r
+                int nbRequested;\r
+                if (fFilter == null) {\r
+                    nbRequested = fCache.length;\r
+                } else {\r
+                    nbRequested = TmfDataRequest.ALL_DATA;\r
+                    int i = index / fCache.length;\r
+                    if (i < fFilterIndex.size()) {\r
+                        startIndex = fFilterIndex.get(i);\r
+                        skipCount = index - (i * fCache.length);\r
+                    }\r
+                }\r
 \r
                 TmfDataRequest<ITmfEvent> request = new TmfDataRequest<ITmfEvent>(ITmfEvent.class, startIndex, nbRequested) {\r
                     private int count = 0;\r
@@ -251,21 +250,21 @@ public class TmfEventsCache {
                         }\r
                         super.handleData(event);\r
                         if (event != null) {\r
-                               if (((fFilter == null) || fFilter.matches(event)) && (skipCount-- <= 0)) {\r
-                                       synchronized (TmfEventsCache.this) {\r
-                                               fCache[count] = new CachedEvent(event.clone(), rank);\r
-                                               count++;\r
-                                               fCacheEndIndex++;\r
-                                       }\r
+                            if (((fFilter == null) || fFilter.matches(event)) && (skipCount-- <= 0)) {\r
+                                synchronized (TmfEventsCache.this) {\r
+                                    fCache[count] = new CachedEvent(event.clone(), rank);\r
+                                    count++;\r
+                                    fCacheEndIndex++;\r
+                                }\r
                                 if (fFilter != null) {\r
-                                       fTable.cacheUpdated(false);\r
+                                    fTable.cacheUpdated(false);\r
                                 }\r
-                               }\r
+                            }\r
                         }\r
                         if (count >= fCache.length) {\r
-                               cancel();\r
+                            cancel();\r
                         } else if ((fFilter != null) && (count >= (fTable.getTable().getItemCount() - 3))) { // -1 for header row, -2 for top and bottom filter status rows\r
-                               cancel();\r
+                            cancel();\r
                         }\r
                         rank++;\r
                     }\r
@@ -282,7 +281,7 @@ public class TmfEventsCache {
 \r
                 // Flag the UI thread that the cache is ready\r
                 if (monitor.isCanceled()) {\r
-                       return Status.CANCEL_STATUS;\r
+                    return Status.CANCEL_STATUS;\r
                 } else {\r
                     return Status.OK_STATUS;\r
                 }\r
This page took 0.032415 seconds and 5 git commands to generate.