- 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
pull/1/head
orbiter 14 years ago
parent 48b78e9ff4
commit 3d043ce9d6

@ -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 <http://www.gnu.org/licenses/>.
*/
package net.yacy.cora.storage;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Random; import java.util.Random;
import java.util.concurrent.BlockingQueue; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
/** /**
* an abstraction of the quicksort from the java.util.Array class * an abstraction of the quicksort from the java.util.Array class
* @author admin * @author admin
* *
*/ */
@SuppressWarnings({ "rawtypes", "unchecked" })
public class Array { public class Array {
private final static int SORT_JOBS = Runtime.getRuntime().availableProcessors() + 1; private final static int SORT_JOBS = Math.max(1, Runtime.getRuntime().availableProcessors() / 2);
@SuppressWarnings({ "unchecked", "rawtypes" })
private final static SortJob<?> POISON_JOB_WORKER = new SortJob(null, 0, 0, 0, 0, null); private final static SortJob<?> POISON_JOB_WORKER = new SortJob(null, 0, 0, 0, 0, null);
@SuppressWarnings({ "unchecked", "rawtypes" }) private static BlockingQueue<SortJob<?>> sortJobs = null;
private final static BlockingQueue<SortJob<?>> sortJobs = new LinkedBlockingQueue();
static { static {
for (int i = 0; i < SORT_JOBS; i++) { if (SORT_JOBS > 1) {
new SortJobWorker().start(); for (int i = 0; i < SORT_JOBS; i++) {
new SortJobWorker().start();
}
sortJobs = new LinkedBlockingQueue();
} }
} }
public static void terminate() { public static void terminate() {
for (int i = 0; i < SORT_JOBS; i++) { if (SORT_JOBS > 1 && sortJobs != null) {
try { for (int i = 0; i < SORT_JOBS; i++) {
sortJobs.put(POISON_JOB_WORKER); try {
} catch (final InterruptedException e) {} 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 <A> void sort(final Sortable<A> x) { public static <A> void sort(final Sortable<A> x) {
UpDownLatch latch; UpDownLatch latch;
final boolean threaded = false;//x.size() > 100000; final boolean threaded = false;//x.size() > 100000;
@ -156,8 +142,8 @@ public class Array {
if ((s = b - a) > 1) { if ((s = b - a) > 1) {
final SortJob<A> nextJob = new SortJob<A>(job.x, job.o, s, job.f, job.depth + 1, job.latch); final SortJob<A> nextJob = new SortJob<A>(job.x, job.o, s, job.f, job.depth + 1, job.latch);
if (threaded) try { if (threaded) try {
job.latch.countUp();
sortJobs.put(nextJob); sortJobs.put(nextJob);
job.latch.countUp();
} catch (final InterruptedException e) { } catch (final InterruptedException e) {
} else { } else {
sort(nextJob, threaded); sort(nextJob, threaded);
@ -166,8 +152,8 @@ public class Array {
if ((s = d - c) > 1) { if ((s = d - c) > 1) {
final SortJob<A> nextJob = new SortJob<A>(job.x, n - s, s, job.x.buffer(), job.depth + 1, job.latch); final SortJob<A> nextJob = new SortJob<A>(job.x, n - s, s, job.x.buffer(), job.depth + 1, job.latch);
if (threaded) try { if (threaded) try {
job.latch.countUp();
sortJobs.put(nextJob); sortJobs.put(nextJob);
job.latch.countUp();
} catch (final InterruptedException e) { } catch (final InterruptedException e) {
} else { } else {
sort(nextJob, threaded); sort(nextJob, threaded);

@ -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 <http://www.gnu.org/licenses/>.
*/
package net.yacy.cora.storage;
import java.util.Comparator;
public interface Sortable<A> extends Comparator<A> {
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);
}

@ -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 <http://www.gnu.org/licenses/>.
*/
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);
}
}

@ -34,13 +34,13 @@ import java.util.concurrent.Callable;
import net.yacy.cora.document.ASCII; import net.yacy.cora.document.ASCII;
import net.yacy.cora.document.UTF8; 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.index.Row.Entry;
import net.yacy.kelondro.logging.Log; import net.yacy.kelondro.logging.Log;
import net.yacy.kelondro.order.Array;
import net.yacy.kelondro.order.Base64Order; import net.yacy.kelondro.order.Base64Order;
import net.yacy.kelondro.order.ByteOrder; import net.yacy.kelondro.order.ByteOrder;
import net.yacy.kelondro.order.NaturalOrder; import net.yacy.kelondro.order.NaturalOrder;
import net.yacy.kelondro.order.Sortable;
import net.yacy.kelondro.util.FileUtils; import net.yacy.kelondro.util.FileUtils;
import net.yacy.kelondro.util.MemoryControl; import net.yacy.kelondro.util.MemoryControl;
import net.yacy.kelondro.util.kelondroException; import net.yacy.kelondro.util.kelondroException;
@ -613,7 +613,7 @@ public class RowCollection implements Sortable<Row.Entry>, Iterable<Row.Entry>,
} }
public final void sort() { public final void sort() {
net.yacy.kelondro.order.Array.sort(this); net.yacy.cora.storage.Array.sort(this);
this.sortBound = size(); this.sortBound = size();
} }

@ -1,17 +0,0 @@
package net.yacy.kelondro.order;
import java.util.Comparator;
public interface Sortable<A> extends Comparator<A> {
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);
}

@ -50,6 +50,7 @@ import net.yacy.cora.document.ASCII;
import net.yacy.cora.protocol.ClientIdentification; import net.yacy.cora.protocol.ClientIdentification;
import net.yacy.cora.protocol.RequestHeader; import net.yacy.cora.protocol.RequestHeader;
import net.yacy.cora.protocol.http.HTTPClient; import net.yacy.cora.protocol.http.HTTPClient;
import net.yacy.cora.storage.Array;
import net.yacy.cora.storage.OrderedScoreMap; import net.yacy.cora.storage.OrderedScoreMap;
import net.yacy.cora.storage.ScoreMap; import net.yacy.cora.storage.ScoreMap;
import net.yacy.gui.YaCyApp; 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.Word;
import net.yacy.kelondro.data.word.WordReference; import net.yacy.kelondro.data.word.WordReference;
import net.yacy.kelondro.logging.Log; import net.yacy.kelondro.logging.Log;
import net.yacy.kelondro.order.Array;
import net.yacy.kelondro.order.Base64Order; import net.yacy.kelondro.order.Base64Order;
import net.yacy.kelondro.rwi.Reference; import net.yacy.kelondro.rwi.Reference;
import net.yacy.kelondro.rwi.ReferenceContainer; import net.yacy.kelondro.rwi.ReferenceContainer;

Loading…
Cancel
Save