From 3d043ce9d6f97b5bf6daac760fb98430e623a117 Mon Sep 17 00:00:00 2001 From: orbiter Date: Sat, 16 Jul 2011 19:13:30 +0000 Subject: [PATCH] - refactoring - do not start worker threads in Array class if concurrency is not used git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@7844 6c8d7289-2bf4-0310-a012-ef5d649a1542 --- .../order => cora/storage}/Array.java | 98 ++++++++----------- source/net/yacy/cora/storage/Sortable.java | 41 ++++++++ source/net/yacy/cora/storage/UpDownLatch.java | 69 +++++++++++++ .../yacy/kelondro/index/RowCollection.java | 6 +- source/net/yacy/kelondro/order/Sortable.java | 17 ---- source/net/yacy/yacy.java | 2 +- 6 files changed, 156 insertions(+), 77 deletions(-) rename source/net/yacy/{kelondro/order => cora/storage}/Array.java (79%) create mode 100644 source/net/yacy/cora/storage/Sortable.java create mode 100644 source/net/yacy/cora/storage/UpDownLatch.java delete mode 100644 source/net/yacy/kelondro/order/Sortable.java diff --git a/source/net/yacy/kelondro/order/Array.java b/source/net/yacy/cora/storage/Array.java similarity index 79% rename from source/net/yacy/kelondro/order/Array.java rename to source/net/yacy/cora/storage/Array.java index 0c9def3e1..e9c6a4415 100644 --- a/source/net/yacy/kelondro/order/Array.java +++ b/source/net/yacy/cora/storage/Array.java @@ -1,35 +1,63 @@ -package net.yacy.kelondro.order; +/** + * Array + * Copyright 2011 by Michael Peter Christen, mc@yacy.net, Frankfurt a. M., Germany + * First released 16.07.2011 at http://yacy.net + * + * $LastChangedDate: 2011-05-30 10:53:58 +0200 (Mo, 30 Mai 2011) $ + * $LastChangedRevision: 7759 $ + * $LastChangedBy: orbiter $ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + +package net.yacy.cora.storage; import java.util.ArrayList; import java.util.Random; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.locks.AbstractQueuedSynchronizer; + /** * an abstraction of the quicksort from the java.util.Array class * @author admin * */ +@SuppressWarnings({ "rawtypes", "unchecked" }) public class Array { - private final static int SORT_JOBS = Runtime.getRuntime().availableProcessors() + 1; - @SuppressWarnings({ "unchecked", "rawtypes" }) + private final static int SORT_JOBS = Math.max(1, Runtime.getRuntime().availableProcessors() / 2); private final static SortJob POISON_JOB_WORKER = new SortJob(null, 0, 0, 0, 0, null); - @SuppressWarnings({ "unchecked", "rawtypes" }) - private final static BlockingQueue> sortJobs = new LinkedBlockingQueue(); + private static BlockingQueue> sortJobs = null; static { - for (int i = 0; i < SORT_JOBS; i++) { - new SortJobWorker().start(); + if (SORT_JOBS > 1) { + for (int i = 0; i < SORT_JOBS; i++) { + new SortJobWorker().start(); + } + sortJobs = new LinkedBlockingQueue(); } } public static void terminate() { - for (int i = 0; i < SORT_JOBS; i++) { - try { - sortJobs.put(POISON_JOB_WORKER); - } catch (final InterruptedException e) {} + if (SORT_JOBS > 1 && sortJobs != null) { + for (int i = 0; i < SORT_JOBS; i++) { + try { + sortJobs.put(POISON_JOB_WORKER); + } catch (final InterruptedException e) {} + } } } @@ -46,48 +74,6 @@ public class Array { } } - public static final class UpDownLatch extends AbstractQueuedSynchronizer { - - private static final long serialVersionUID = 1L; - - public UpDownLatch(final int count) { - setState(count); - } - - public int getCount() { - return getState(); - } - - public int tryAcquireShared(final int acquires) { - return getState() == 0? 1 : -1; - } - - public boolean tryReleaseShared(final int releases) { - // Decrement count; signal when transition to zero - for (;;) { - final int c = getState(); - if (c == 0) return false; - final int nextc = c-1; - if (compareAndSetState(c, nextc)) return nextc == 0; - } - } - - public void countUp() { - for (;;) { - final int c = getState(); - if (compareAndSetState(c, c + 1)) return; - } - } - - public void countDown() { - releaseShared(1); - } - - public void await() throws InterruptedException { - acquireSharedInterruptibly(1); - } - } - public static void sort(final Sortable x) { UpDownLatch latch; final boolean threaded = false;//x.size() > 100000; @@ -156,8 +142,8 @@ public class Array { if ((s = b - a) > 1) { final SortJob nextJob = new SortJob(job.x, job.o, s, job.f, job.depth + 1, job.latch); if (threaded) try { - job.latch.countUp(); sortJobs.put(nextJob); + job.latch.countUp(); } catch (final InterruptedException e) { } else { sort(nextJob, threaded); @@ -166,8 +152,8 @@ public class Array { if ((s = d - c) > 1) { final SortJob nextJob = new SortJob(job.x, n - s, s, job.x.buffer(), job.depth + 1, job.latch); if (threaded) try { - job.latch.countUp(); sortJobs.put(nextJob); + job.latch.countUp(); } catch (final InterruptedException e) { } else { sort(nextJob, threaded); diff --git a/source/net/yacy/cora/storage/Sortable.java b/source/net/yacy/cora/storage/Sortable.java new file mode 100644 index 000000000..8a96e4f35 --- /dev/null +++ b/source/net/yacy/cora/storage/Sortable.java @@ -0,0 +1,41 @@ +/** + * Sortable + * Copyright 2011 by Michael Peter Christen, mc@yacy.net, Frankfurt a. M., Germany + * First released 16.07.2011 at http://yacy.net + * + * $LastChangedDate: 2011-05-30 10:53:58 +0200 (Mo, 30 Mai 2011) $ + * $LastChangedRevision: 7759 $ + * $LastChangedBy: orbiter $ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + +package net.yacy.cora.storage; + +import java.util.Comparator; + +public interface Sortable extends Comparator { + + public int size(); + + public A get(final int index, final boolean clone); + + public void delete(int i); + + public A buffer(); + + public void swap(int i, int j, A buffer); + +} diff --git a/source/net/yacy/cora/storage/UpDownLatch.java b/source/net/yacy/cora/storage/UpDownLatch.java new file mode 100644 index 000000000..2da9be7f9 --- /dev/null +++ b/source/net/yacy/cora/storage/UpDownLatch.java @@ -0,0 +1,69 @@ +/** + * UpDownLatch + * Copyright 2011 by Michael Peter Christen, mc@yacy.net, Frankfurt a. M., Germany + * First released 16.07.2011 at http://yacy.net + * + * $LastChangedDate: 2011-05-30 10:53:58 +0200 (Mo, 30 Mai 2011) $ + * $LastChangedRevision: 7759 $ + * $LastChangedBy: orbiter $ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + +package net.yacy.cora.storage; + +import java.util.concurrent.locks.AbstractQueuedSynchronizer; + +public class UpDownLatch extends AbstractQueuedSynchronizer { + + private static final long serialVersionUID = 1L; + + public UpDownLatch(final int count) { + setState(count); + } + + public int getCount() { + return getState(); + } + + public int tryAcquireShared(final int acquires) { + return getState() == 0? 1 : -1; + } + + public boolean tryReleaseShared(final int releases) { + // Decrement count; signal when transition to zero + for (;;) { + final int c = getState(); + if (c == 0) return false; + final int nextc = c-1; + if (compareAndSetState(c, nextc)) return nextc == 0; + } + } + + public void countUp() { + for (;;) { + final int c = getState(); + if (compareAndSetState(c, c + 1)) return; + } + } + + public void countDown() { + releaseShared(1); + } + + public void await() throws InterruptedException { + acquireSharedInterruptibly(1); + } +} diff --git a/source/net/yacy/kelondro/index/RowCollection.java b/source/net/yacy/kelondro/index/RowCollection.java index d2b25e091..417f21cc6 100644 --- a/source/net/yacy/kelondro/index/RowCollection.java +++ b/source/net/yacy/kelondro/index/RowCollection.java @@ -34,13 +34,13 @@ import java.util.concurrent.Callable; import net.yacy.cora.document.ASCII; import net.yacy.cora.document.UTF8; +import net.yacy.cora.storage.Array; +import net.yacy.cora.storage.Sortable; import net.yacy.kelondro.index.Row.Entry; import net.yacy.kelondro.logging.Log; -import net.yacy.kelondro.order.Array; import net.yacy.kelondro.order.Base64Order; import net.yacy.kelondro.order.ByteOrder; import net.yacy.kelondro.order.NaturalOrder; -import net.yacy.kelondro.order.Sortable; import net.yacy.kelondro.util.FileUtils; import net.yacy.kelondro.util.MemoryControl; import net.yacy.kelondro.util.kelondroException; @@ -613,7 +613,7 @@ public class RowCollection implements Sortable, Iterable, } public final void sort() { - net.yacy.kelondro.order.Array.sort(this); + net.yacy.cora.storage.Array.sort(this); this.sortBound = size(); } diff --git a/source/net/yacy/kelondro/order/Sortable.java b/source/net/yacy/kelondro/order/Sortable.java deleted file mode 100644 index 509e64f8e..000000000 --- a/source/net/yacy/kelondro/order/Sortable.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.yacy.kelondro.order; - -import java.util.Comparator; - -public interface Sortable extends Comparator { - - public int size(); - - public A get(final int index, final boolean clone); - - public void delete(int i); - - public A buffer(); - - public void swap(int i, int j, A buffer); - -} diff --git a/source/net/yacy/yacy.java b/source/net/yacy/yacy.java index 177699b0b..b5c75d8da 100644 --- a/source/net/yacy/yacy.java +++ b/source/net/yacy/yacy.java @@ -50,6 +50,7 @@ import net.yacy.cora.document.ASCII; import net.yacy.cora.protocol.ClientIdentification; import net.yacy.cora.protocol.RequestHeader; import net.yacy.cora.protocol.http.HTTPClient; +import net.yacy.cora.storage.Array; import net.yacy.cora.storage.OrderedScoreMap; import net.yacy.cora.storage.ScoreMap; import net.yacy.gui.YaCyApp; @@ -59,7 +60,6 @@ import net.yacy.kelondro.data.meta.URIMetadataRow; import net.yacy.kelondro.data.word.Word; import net.yacy.kelondro.data.word.WordReference; import net.yacy.kelondro.logging.Log; -import net.yacy.kelondro.order.Array; import net.yacy.kelondro.order.Base64Order; import net.yacy.kelondro.rwi.Reference; import net.yacy.kelondro.rwi.ReferenceContainer;