You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2016/03/03 12:48:42 UTC
ignite git commit: Improved RW lock.
Repository: ignite
Updated Branches:
refs/heads/bench-atomic-good-lock [created] 5b1e30451
Improved RW lock.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/5b1e3045
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/5b1e3045
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/5b1e3045
Branch: refs/heads/bench-atomic-good-lock
Commit: 5b1e30451bb1b4abac0a40907776be8abf61f2b8
Parents: c13339f
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Thu Mar 3 14:48:33 2016 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Thu Mar 3 14:48:33 2016 +0300
----------------------------------------------------------------------
.../util/StripedCompositeReadWriteLock.java | 14 ++++++--
.../org/apache/ignite/thread/IgniteThread.java | 34 ++++++++++++++++++--
.../ignite/thread/IgniteThreadFactory.java | 7 +++-
3 files changed, 49 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/5b1e3045/modules/core/src/main/java/org/apache/ignite/internal/util/StripedCompositeReadWriteLock.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/StripedCompositeReadWriteLock.java b/modules/core/src/main/java/org/apache/ignite/internal/util/StripedCompositeReadWriteLock.java
index e28a5f8..96445d8 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/StripedCompositeReadWriteLock.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/StripedCompositeReadWriteLock.java
@@ -17,6 +17,7 @@
package org.apache.ignite.internal.util;
+import org.apache.ignite.thread.IgniteThread;
import org.jetbrains.annotations.NotNull;
import java.util.concurrent.TimeUnit;
@@ -65,9 +66,18 @@ public class StripedCompositeReadWriteLock implements ReadWriteLock {
/** {@inheritDoc} */
@NotNull @Override public Lock readLock() {
- int idx = IDX.get() % locks.length;
+ int idx;
- return locks[idx].readLock();
+ if (Thread.currentThread() instanceof IgniteThread) {
+ idx = ((IgniteThread)Thread.currentThread()).groupIndex();
+
+ if (idx == IgniteThread.GRP_IDX_UNASSIGNED)
+ idx = IDX.get();
+ }
+ else
+ idx = IDX.get();
+
+ return locks[idx % locks.length].readLock();
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/5b1e3045/modules/core/src/main/java/org/apache/ignite/thread/IgniteThread.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/thread/IgniteThread.java b/modules/core/src/main/java/org/apache/ignite/thread/IgniteThread.java
index a9f1fbb..03ed589 100644
--- a/modules/core/src/main/java/org/apache/ignite/thread/IgniteThread.java
+++ b/modules/core/src/main/java/org/apache/ignite/thread/IgniteThread.java
@@ -33,6 +33,9 @@ import org.apache.ignite.internal.util.worker.GridWorker;
* <b>Note</b>: this class is intended for internal use only.
*/
public class IgniteThread extends Thread {
+ /** Index for unassigned thread. */
+ public static final int GRP_IDX_UNASSIGNED = -1;
+
/** Default thread's group. */
private static final ThreadGroup DFLT_GRP = new ThreadGroup("ignite");
@@ -42,13 +45,16 @@ public class IgniteThread extends Thread {
/** The name of the grid this thread belongs to. */
protected final String gridName;
+ /** Group index. */
+ private final int grpIdx;
+
/**
* Creates thread with given worker.
*
* @param worker Runnable to create thread with.
*/
public IgniteThread(GridWorker worker) {
- this(DFLT_GRP, worker.gridName(), worker.name(), worker);
+ this(DFLT_GRP, worker.gridName(), worker.name(), worker, GRP_IDX_UNASSIGNED);
}
/**
@@ -59,7 +65,19 @@ public class IgniteThread extends Thread {
* @param r Runnable to execute.
*/
public IgniteThread(String gridName, String threadName, Runnable r) {
- this(DFLT_GRP, gridName, threadName, r);
+ this(gridName, threadName, r, GRP_IDX_UNASSIGNED);
+ }
+
+ /**
+ * Creates grid thread with given name for a given grid.
+ *
+ * @param gridName Name of grid this thread is created for.
+ * @param threadName Name of thread.
+ * @param r Runnable to execute.
+ * @param grpIdx Index within a group.
+ */
+ public IgniteThread(String gridName, String threadName, Runnable r, int grpIdx) {
+ this(DFLT_GRP, gridName, threadName, r, grpIdx);
}
/**
@@ -70,11 +88,13 @@ public class IgniteThread extends Thread {
* @param gridName Name of grid this thread is created for.
* @param threadName Name of thread.
* @param r Runnable to execute.
+ * @param grpIdx Thread index within a group.
*/
- public IgniteThread(ThreadGroup grp, String gridName, String threadName, Runnable r) {
+ public IgniteThread(ThreadGroup grp, String gridName, String threadName, Runnable r, int grpIdx) {
super(grp, r, createName(cntr.incrementAndGet(), threadName, gridName));
this.gridName = gridName;
+ this.grpIdx = grpIdx;
}
/**
@@ -86,6 +106,7 @@ public class IgniteThread extends Thread {
super(threadGrp, threadName);
this.gridName = gridName;
+ this.grpIdx = GRP_IDX_UNASSIGNED;
}
/**
@@ -98,6 +119,13 @@ public class IgniteThread extends Thread {
}
/**
+ * @return Group index.
+ */
+ public int groupIndex() {
+ return grpIdx;
+ }
+
+ /**
* Creates new thread name.
*
* @param num Thread number.
http://git-wip-us.apache.org/repos/asf/ignite/blob/5b1e3045/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadFactory.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadFactory.java b/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadFactory.java
index cd0a9cc..55557dd 100644
--- a/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadFactory.java
+++ b/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadFactory.java
@@ -18,6 +18,8 @@
package org.apache.ignite.thread;
import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.atomic.AtomicInteger;
+
import org.jetbrains.annotations.NotNull;
/**
@@ -31,6 +33,9 @@ public class IgniteThreadFactory implements ThreadFactory {
/** Thread name. */
private final String threadName;
+ /** Index generator for threads. */
+ private final AtomicInteger idxGen = new AtomicInteger();
+
/**
* Constructs new thread factory for given grid. All threads will belong
* to the same default thread group.
@@ -55,6 +60,6 @@ public class IgniteThreadFactory implements ThreadFactory {
/** {@inheritDoc} */
@Override public Thread newThread(@NotNull Runnable r) {
- return new IgniteThread(gridName, threadName, r);
+ return new IgniteThread(gridName, threadName, r, idxGen.incrementAndGet());
}
}
\ No newline at end of file