From fda65f0ca94d55cd5cfaba8adc54d5fde2c02496 Mon Sep 17 00:00:00 2001
From: Quinn Klassen <klassenq@gmail.com>
Date: Mon, 8 Jul 2024 10:10:31 -0700
Subject: [PATCH] Add isHeld to lock interface

---
 .../java/io/temporal/internal/sync/WorkflowLockImpl.java   | 5 +++++
 .../src/main/java/io/temporal/workflow/WorkflowLock.java   | 7 +++++++
 .../temporal/internal/sync/WorkflowInternalLockTest.java   | 4 ++++
 3 files changed, 16 insertions(+)

diff --git a/temporal-sdk/src/main/java/io/temporal/internal/sync/WorkflowLockImpl.java b/temporal-sdk/src/main/java/io/temporal/internal/sync/WorkflowLockImpl.java
index d29d7ce7d4..9cf6d34e21 100644
--- a/temporal-sdk/src/main/java/io/temporal/internal/sync/WorkflowLockImpl.java
+++ b/temporal-sdk/src/main/java/io/temporal/internal/sync/WorkflowLockImpl.java
@@ -74,4 +74,9 @@ public void unlock() {
     Preconditions.checkState(locked, "WorkflowLock.unlock called when not locked");
     locked = false;
   }
+
+  @Override
+  public boolean isHeld() {
+    return locked;
+  }
 }
diff --git a/temporal-sdk/src/main/java/io/temporal/workflow/WorkflowLock.java b/temporal-sdk/src/main/java/io/temporal/workflow/WorkflowLock.java
index 3b76d35596..a13ac52f2e 100644
--- a/temporal-sdk/src/main/java/io/temporal/workflow/WorkflowLock.java
+++ b/temporal-sdk/src/main/java/io/temporal/workflow/WorkflowLock.java
@@ -57,4 +57,11 @@ public interface WorkflowLock {
 
   /** Releases the lock. */
   void unlock();
+
+  /**
+   * Checks if a lock is held.
+   *
+   * @return true if the lock is held and false otherwise.
+   */
+  boolean isHeld();
 }
diff --git a/temporal-sdk/src/test/java/io/temporal/internal/sync/WorkflowInternalLockTest.java b/temporal-sdk/src/test/java/io/temporal/internal/sync/WorkflowInternalLockTest.java
index 0b9911499f..f0408238ba 100644
--- a/temporal-sdk/src/test/java/io/temporal/internal/sync/WorkflowInternalLockTest.java
+++ b/temporal-sdk/src/test/java/io/temporal/internal/sync/WorkflowInternalLockTest.java
@@ -66,6 +66,8 @@ public void testThreadInterleaving() {
               WorkflowLock l2 = WorkflowInternal.newWorkflowLock();
               trace.add("root begin");
               l2.lock();
+              trace.add("l1.isHeld " + l1.isHeld());
+              trace.add("l2.isHeld " + l2.isHeld());
               WorkflowThread.newThread(
                       () -> {
                         trace.add("thread1 begin");
@@ -96,6 +98,8 @@ public void testThreadInterleaving() {
     String[] expected =
         new String[] {
           "root begin",
+          "l1.isHeld false",
+          "l2.isHeld true",
           "root done",
           "thread1 begin",
           "thread1 lock 1 success",