ascherbakoff commented on code in PR #4540:
URL: https://github.com/apache/ignite-3/pull/4540#discussion_r1810342482


##########
modules/core/src/main/java/org/apache/ignite/internal/util/StripedCompositeReadWriteLock.java:
##########
@@ -0,0 +1,244 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.util;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+/**
+ * ReadWriteLock with striping mechanics. Compared to {@link 
ReentrantReadWriteLock} it has slightly improved performance of
+ * {@link ReadWriteLock#readLock()} operations at the cost of {@link 
ReadWriteLock#writeLock()} operations and memory consumption. It also
+ * supports reentrancy semantics like {@link ReentrantReadWriteLock}.
+ */
+public class StripedCompositeReadWriteLock implements ReadWriteLock {
+    /** Index generator. */
+    private static final AtomicInteger IDX_GEN = new AtomicInteger();
+
+    /** Index. */
+    private static final ThreadLocal<Integer> IDX = ThreadLocal.withInitial(() 
-> IDX_GEN.incrementAndGet());
+
+    /** Locks. */
+    private final ReentrantReadWriteLock[] locks;
+
+    /** Composite write lock. */
+    private final WriteLock writeLock;
+
+    /**
+     * Creates a new instance with given concurrency level.
+     *
+     * @param concurrencyLvl Number of internal read locks.
+     */
+    public StripedCompositeReadWriteLock(int concurrencyLvl) {
+        locks = new ReadLock[concurrencyLvl];
+
+        for (int i = 0; i < concurrencyLvl; i++) {
+            locks[i] = new ReadLock();
+        }
+
+        writeLock = new WriteLock();
+    }
+
+    /**
+     * Gets current index.
+     *
+     * @return Index of current thread stripe.
+     */
+    private int curIdx() {
+        int idx = IDX.get();
+
+        return idx % locks.length;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public Lock readLock() {
+        return locks[curIdx()].readLock();
+    }
+
+    /**
+     * Get a lock by stripe.
+     *
+     * @param idx Stripe index.
+     * @return The lock.
+     */
+    public Lock readLock(int idx) {
+        return locks[idx].readLock();
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public Lock writeLock() {
+        return writeLock;
+    }
+
+    /**
+     * Queries if the write lock is held by the current thread.
+     *
+     * @return {@code true} if the current thread holds the write lock and 
{@code false} otherwise
+     */
+    public boolean isWriteLockedByCurrentThread() {
+        return locks[locks.length - 1].isWriteLockedByCurrentThread();
+    }
+
+    /**
+     * Queries the number of reentrant read holds on this lock by the current 
thread.  A reader thread has a hold on a lock for each lock
+     * action that is not matched by an unlock action.
+     *
+     * @return the number of holds on the read lock by the current thread, or 
zero if the read lock is not held by the current thread
+     */
+    public int getReadHoldCount() {
+        return locks[curIdx()].getReadHoldCount();
+    }
+
+    /**
+     * Read lock.
+     */
+    @SuppressWarnings("unused")
+    private static class ReadLock extends ReentrantReadWriteLock {
+        private long p0;
+
+        private long p1;
+
+        private long p2;
+
+        private long p3;
+
+        private long p4;
+
+        private long p5;
+
+        private long p6;
+
+        private long p7;

Review Comment:
   I've blindly copied it from AI2. Seems it's to prevent false sharing.
   But it actually does nothing useful so I've removed it.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscr...@ignite.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to