/*
 * kmp_lock.cpp -- lock-related functions
 */

//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include <stddef.h>
#include <atomic>

#include "kmp.h"
#include "kmp_i18n.h"
#include "kmp_io.h"
#include "kmp_itt.h"
#include "kmp_lock.h"
#include "kmp_wait_release.h"
#include "kmp_wrapper_getpid.h"

#if KMP_USE_FUTEX
#include <sys/syscall.h>
#include <unistd.h>
// We should really include <futex.h>, but that causes compatibility problems on
// different Linux* OS distributions that either require that you include (or
// break when you try to include) <pci/types.h>. Since all we need is the two
// macros below (which are part of the kernel ABI, so can't change) we just
// define the constants here and don't include <futex.h>
#ifndef FUTEX_WAIT
#define FUTEX_WAIT 0
#endif
#ifndef FUTEX_WAKE
#define FUTEX_WAKE 1
#endif
#endif

/* Implement spin locks for internal library use.             */
/* The algorithm implemented is Lamport's bakery lock [1974]. */

void __kmp_validate_locks(void) {
  int i;
  kmp_uint32 x, y;

  /* Check to make sure unsigned arithmetic does wraps properly */
  x = ~((kmp_uint32)0) - 2;
  y = x - 2;

  for (i = 0; i < 8; ++i, ++x, ++y) {
    kmp_uint32 z = (x - y);
    KMP_ASSERT(z == 2);
  }

  KMP_ASSERT(offsetof(kmp_base_queuing_lock, tail_id) % 8 == 0);
}

/* ------------------------------------------------------------------------ */
/* test and set locks */

// For the non-nested locks, we can only assume that the first 4 bytes were
// allocated, since gcc only allocates 4 bytes for omp_lock_t, and the Intel
// compiler only allocates a 4 byte pointer on IA-32 architecture.  On
// Windows* OS on Intel(R) 64, we can assume that all 8 bytes were allocated.
//
// gcc reserves >= 8 bytes for nested locks, so we can assume that the
// entire 8 bytes were allocated for nested locks on all 64-bit platforms.

static kmp_int32 __kmp_get_tas_lock_owner(kmp_tas_lock_t *lck) {
  return KMP_LOCK_STRIP(KMP_ATOMIC_LD_RLX(&lck->lk.poll)) - 1;
}

static inline bool __kmp_is_tas_lock_nestable(kmp_tas_lock_t *lck) {
  return lck->lk.depth_locked != -1;
}

__forceinline static int
__kmp_acquire_tas_lock_timed_template(kmp_tas_lock_t *lck, kmp_int32 gtid) {
  KMP_MB();

#ifdef USE_LOCK_PROFILE
  kmp_uint32 curr = KMP_LOCK_STRIP(lck->lk.poll);
  if ((curr != 0) && (curr != gtid + 1))
    __kmp_printf("LOCK CONTENTION: %p\n", lck);
/* else __kmp_printf( "." );*/
#endif /* USE_LOCK_PROFILE */

  kmp_int32 tas_free = KMP_LOCK_FREE(tas);
  kmp_int32 tas_busy = KMP_LOCK_BUSY(gtid + 1, tas);

  if (KMP_ATOMIC_LD_RLX(&lck->lk.poll) == tas_free &&
      __kmp_atomic_compare_store_acq(&lck->lk.poll, tas_free, tas_busy)) {
    KMP_FSYNC_ACQUIRED(lck);
    return KMP_LOCK_ACQUIRED_FIRST;
  }

  kmp_uint32 spins;
  KMP_FSYNC_PREPARE(lck);
  KMP_INIT_YIELD(spins);
  kmp_backoff_t backoff = __kmp_spin_backoff_params;
  do {
    __kmp_spin_backoff(&backoff);
    KMP_YIELD_OVERSUB_ELSE_SPIN(spins);
  } while (KMP_ATOMIC_LD_RLX(&lck->lk.poll) != tas_free ||
           !__kmp_atomic_compare_store_acq(&lck->lk.poll, tas_free, tas_busy));
  KMP_FSYNC_ACQUIRED(lck);
  return KMP_LOCK_ACQUIRED_FIRST;
}

int __kmp_acquire_tas_lock(kmp_tas_lock_t *lck, kmp_int32 gtid) {
  int retval = __kmp_acquire_tas_lock_timed_template(lck, gtid);
  return retval;
}

static int __kmp_acquire_tas_lock_with_checks(kmp_tas_lock_t *lck,
                                              kmp_int32 gtid) {
  char const *const func = "omp_set_lock";
  if ((sizeof(kmp_tas_lock_t) <= OMP_LOCK_T_SIZE) &&
      __kmp_is_tas_lock_nestable(lck)) {
    KMP_FATAL(LockNestableUsedAsSimple, func);
  }
  if ((gtid >= 0) && (__kmp_get_tas_lock_owner(lck) == gtid)) {
    KMP_FATAL(LockIsAlreadyOwned, func);
  }
  return __kmp_acquire_tas_lock(lck, gtid);
}

int __kmp_test_tas_lock(kmp_tas_lock_t *lck, kmp_int32 gtid) {
  kmp_int32 tas_free = KMP_LOCK_FREE(tas);
  kmp_int32 tas_busy = KMP_LOCK_BUSY(gtid + 1, tas);
  if (KMP_ATOMIC_LD_RLX(&lck->lk.poll) == tas_free &&
      __kmp_atomic_compare_store_acq(&lck->lk.poll, tas_free, tas_busy)) {
    KMP_FSYNC_ACQUIRED(lck);
    return TRUE;
  }
  return FALSE;
}

static int __kmp_test_tas_lock_with_checks(kmp_tas_lock_t *lck,
                                           kmp_int32 gtid) {
  char const *const func = "omp_test_lock";
  if ((sizeof(kmp_tas_lock_t) <= OMP_LOCK_T_SIZE) &&
      __kmp_is_tas_lock_nestable(lck)) {
    KMP_FATAL(LockNestableUsedAsSimple, func);
  }
  return __kmp_test_tas_lock(lck, gtid);
}

int __kmp_release_tas_lock(kmp_tas_lock_t *lck, kmp_int32 gtid) {
  KMP_MB(); /* Flush all pending memory write invalidates.  */

  KMP_FSYNC_RELEASING(lck);
  KMP_ATOMIC_ST_REL(&lck->lk.poll, KMP_LOCK_FREE(tas));
  KMP_MB(); /* Flush all pending memory write invalidates.  */

  KMP_YIELD_OVERSUB();
  return KMP_LOCK_RELEASED;
}

static int __kmp_release_tas_lock_with_checks(kmp_tas_lock_t *lck,
                                              kmp_int32 gtid) {
  char const *const func = "omp_unset_lock";
  KMP_MB(); /* in case another processor initialized lock */
  if ((sizeof(kmp_tas_lock_t) <= OMP_LOCK_T_SIZE) &&
      __kmp_is_tas_lock_nestable(lck)) {
    KMP_FATAL(LockNestableUsedAsSimple, func);
  }
  if (__kmp_get_tas_lock_owner(lck) == -1) {
    KMP_FATAL(LockUnsettingFree, func);
  }
  if ((gtid >= 0) && (__kmp_get_tas_lock_owner(lck) >= 0) &&
      (__kmp_get_tas_lock_owner(lck) != gtid)) {
    KMP_FATAL(LockUnsettingSetByAnother, func);
  }
  return __kmp_release_tas_lock(lck, gtid);
}

void __kmp_init_tas_lock(kmp_tas_lock_t *lck) {
  lck->lk.poll = KMP_LOCK_FREE(tas);
}

void __kmp_destroy_tas_lock(kmp_tas_lock_t *lck) { lck->lk.poll = 0; }

static void __kmp_destroy_tas_lock_with_checks(kmp_tas_lock_t *lck) {
  char const *const func = "omp_destroy_lock";
  if ((sizeof(kmp_tas_lock_t) <= OMP_LOCK_T_SIZE) &&
      __kmp_is_tas_lock_nestable(lck)) {
    KMP_FATAL(LockNestableUsedAsSimple, func);
  }
  if (__kmp_get_tas_lock_owner(lck) != -1) {
    KMP_FATAL(LockStillOwned, func);
  }
  __kmp_destroy_tas_lock(lck);
}

// nested test and set locks

int __kmp_acquire_nested_tas_lock(kmp_tas_lock_t *lck, kmp_int32 gtid) {
  KMP_DEBUG_ASSERT(gtid >= 0);

  if (__kmp_get_tas_lock_owner(lck) == gtid) {
    lck->lk.depth_locked += 1;
    return KMP_LOCK_ACQUIRED_NEXT;
  } else {
    __kmp_acquire_tas_lock_timed_template(lck, gtid);
    lck->lk.depth_locked = 1;
    return KMP_LOCK_ACQUIRED_FIRST;
  }
}

static int __kmp_acquire_nested_tas_lock_with_checks(kmp_tas_lock_t *lck,
                                                     kmp_int32 gtid) {
  char const *const func = "omp_set_nest_lock";
  if (!__kmp_is_tas_lock_nestable(lck)) {
    KMP_FATAL(LockSimpleUsedAsNestable, func);
  }
  return __kmp_acquire_nested_tas_lock(lck, gtid);
}

int __kmp_test_nested_tas_lock(kmp_tas_lock_t *lck, kmp_int32 gtid) {
  int retval;

  KMP_DEBUG_ASSERT(gtid >= 0);

  if (__kmp_get_tas_lock_owner(lck) == gtid) {
    retval = ++lck->lk.depth_locked;
  } else if (!__kmp_test_tas_lock(lck, gtid)) {
    retval = 0;
  } else {
    KMP_MB();
    retval = lck->lk.depth_locked = 1;
  }
  return retval;
}

static int __kmp_test_nested_tas_lock_with_checks(kmp_tas_lock_t *lck,
                                                  kmp_int32 gtid) {
  char const *const func = "omp_test_nest_lock";
  if (!__kmp_is_tas_lock_nestable(lck)) {
    KMP_FATAL(LockSimpleUsedAsNestable, func);
  }
  return __kmp_test_nested_tas_lock(lck, gtid);
}

int __kmp_release_nested_tas_lock(kmp_tas_lock_t *lck, kmp_int32 gtid) {
  KMP_DEBUG_ASSERT(gtid >= 0);

  KMP_MB();
  if (--(lck->lk.depth_locked) == 0) {
    __kmp_release_tas_lock(lck, gtid);
    return KMP_LOCK_RELEASED;
  }
  return KMP_LOCK_STILL_HELD;
}

static int __kmp_release_nested_tas_lock_with_checks(kmp_tas_lock_t *lck,
                                                     kmp_int32 gtid) {
  char const *const func = "omp_unset_nest_lock";
  KMP_MB(); /* in case another processor initialized lock */
  if (!__kmp_is_tas_lock_nestable(lck)) {
    KMP_FATAL(LockSimpleUsedAsNestable, func);
  }
  if (__kmp_get_tas_lock_owner(lck) == -1) {
    KMP_FATAL(LockUnsettingFree, func);
  }
  if (__kmp_get_tas_lock_owner(lck) != gtid) {
    KMP_FATAL(LockUnsettingSetByAnother, func);
  }
  return __kmp_release_nested_tas_lock(lck, gtid);
}

void __kmp_init_nested_tas_lock(kmp_tas_lock_t *lck) {
  __kmp_init_tas_lock(lck);
  lck->lk.depth_locked = 0; // >= 0 for nestable locks, -1 for simple locks
}

void __kmp_destroy_nested_tas_lock(kmp_tas_lock_t *lck) {
  __kmp_destroy_tas_lock(lck);
  lck->lk.depth_locked = 0;
}

static void __kmp_destroy_nested_tas_lock_with_checks(kmp_tas_lock_t *lck) {
  char const *const func = "omp_destroy_nest_lock";
  if (!__kmp_is_tas_lock_nestable(lck)) {
    KMP_FATAL(LockSimpleUsedAsNestable, func);
  }
  if (__kmp_get_tas_lock_owner(lck) != -1) {
    KMP_FATAL(LockStillOwned, func);
  }
  __kmp_destroy_nested_tas_lock(lck);
}

#if KMP_USE_FUTEX

/* ------------------------------------------------------------------------ */
/* futex locks */

// futex locks are really just test and set locks, with a different method
// of handling contention.  They take the same amount of space as test and
// set locks, and are allocated the same way (i.e. use the area allocated by
// the compiler for non-nested locks / allocate nested locks on the heap).

static kmp_int32 __kmp_get_futex_lock_owner(kmp_futex_lock_t *lck) {
  return KMP_LOCK_STRIP((TCR_4(lck->lk.poll) >> 1)) - 1;
}

static inline bool __kmp_is_futex_lock_nestable(kmp_futex_lock_t *lck) {
  return lck->lk.depth_locked != -1;
}

__forceinline static int
__kmp_acquire_futex_lock_timed_template(kmp_futex_lock_t *lck, kmp_int32 gtid) {
  kmp_int32 gtid_code = (gtid + 1) << 1;

  KMP_MB();

#ifdef USE_LOCK_PROFILE
  kmp_uint32 curr = KMP_LOCK_STRIP(TCR_4(lck->lk.poll));
  if ((curr != 0) && (curr != gtid_code))
    __kmp_printf("LOCK CONTENTION: %p\n", lck);
/* else __kmp_printf( "." );*/
#endif /* USE_LOCK_PROFILE */

  KMP_FSYNC_PREPARE(lck);
  KA_TRACE(1000, ("__kmp_acquire_futex_lock: lck:%p(0x%x), T#%d entering\n",
                  lck, lck->lk.poll, gtid));

  kmp_int32 poll_val;

  while ((poll_val = KMP_COMPARE_AND_STORE_RET32(
              &(lck->lk.poll), KMP_LOCK_FREE(futex),
              KMP_LOCK_BUSY(gtid_code, futex))) != KMP_LOCK_FREE(futex)) {

    kmp_int32 cond = KMP_LOCK_STRIP(poll_val) & 1;
    KA_TRACE(
        1000,
        ("__kmp_acquire_futex_lock: lck:%p, T#%d poll_val = 0x%x cond = 0x%x\n",
         lck, gtid, poll_val, cond));

    // NOTE: if you try to use the following condition for this branch
    //
    // if ( poll_val & 1 == 0 )
    //
    // Then the 12.0 compiler has a bug where the following block will
    // always be skipped, regardless of the value of the LSB of poll_val.
    if (!cond) {
      // Try to set the lsb in the poll to indicate to the owner
      // thread that they need to wake this thread up.
      if (!KMP_COMPARE_AND_STORE_REL32(&(lck->lk.poll), poll_val,
                                       poll_val | KMP_LOCK_BUSY(1, futex))) {
        KA_TRACE(
            1000,
            ("__kmp_acquire_futex_lock: lck:%p(0x%x), T#%d can't set bit 0\n",
             lck, lck->lk.poll, gtid));
        continue;
      }
      poll_val |= KMP_LOCK_BUSY(1, futex);

      KA_TRACE(1000,
               ("__kmp_acquire_futex_lock: lck:%p(0x%x), T#%d bit 0 set\n", lck,
                lck->lk.poll, gtid));
    }

    KA_TRACE(
        1000,
        ("__kmp_acquire_futex_lock: lck:%p, T#%d before futex_wait(0x%x)\n",
         lck, gtid, poll_val));

    long rc;
    if ((rc = syscall(__NR_futex, &(lck->lk.poll), FUTEX_WAIT, poll_val, NULL,
                      NULL, 0)) != 0) {
      KA_TRACE(1000, ("__kmp_acquire_futex_lock: lck:%p, T#%d futex_wait(0x%x) "
                      "failed (rc=%ld errno=%d)\n",
                      lck, gtid, poll_val, rc, errno));
      continue;
    }

    KA_TRACE(1000,
             ("__kmp_acquire_futex_lock: lck:%p, T#%d after futex_wait(0x%x)\n",
              lck, gtid, poll_val));
    // This thread has now done a successful futex wait call and was entered on
    // the OS futex queue.  We must now perform a futex wake call when releasing
    // the lock, as we have no idea how many other threads are in the queue.
    gtid_code |= 1;
  }

  KMP_FSYNC_ACQUIRED(lck);
  KA_TRACE(1000, ("__kmp_acquire_futex_lock: lck:%p(0x%x), T#%d exiting\n", lck,
                  lck->lk.poll, gtid));
  return KMP_LOCK_ACQUIRED_FIRST;
}

int __kmp_acquire_futex_lock(kmp_futex_lock_t *lck, kmp_int32 gtid) {
  int retval = __kmp_acquire_futex_lock_timed_template(lck, gtid);
  return retval;
}

static int __kmp_acquire_futex_lock_with_checks(kmp_futex_lock_t *lck,
                                                kmp_int32 gtid) {
  char const *const func = "omp_set_lock";
  if ((sizeof(kmp_futex_lock_t) <= OMP_LOCK_T_SIZE) &&
      __kmp_is_futex_lock_nestable(lck)) {
    KMP_FATAL(LockNestableUsedAsSimple, func);
  }
  if ((gtid >= 0) && (__kmp_get_futex_lock_owner(lck) == gtid)) {
    KMP_FATAL(LockIsAlreadyOwned, func);
  }
  return __kmp_acquire_futex_lock(lck, gtid);
}

int __kmp_test_futex_lock(kmp_futex_lock_t *lck, kmp_int32 gtid) {
  if (KMP_COMPARE_AND_STORE_ACQ32(&(lck->lk.poll), KMP_LOCK_FREE(futex),
                                  KMP_LOCK_BUSY((gtid + 1) << 1, futex))) {
    KMP_FSYNC_ACQUIRED(lck);
    return TRUE;
  }
  return FALSE;
}

static int __kmp_test_futex_lock_with_checks(kmp_futex_lock_t *lck,
                                             kmp_int32 gtid) {
  char const *const func = "omp_test_lock";
  if ((sizeof(kmp_futex_lock_t) <= OMP_LOCK_T_SIZE) &&
      __kmp_is_futex_lock_nestable(lck)) {
    KMP_FATAL(LockNestableUsedAsSimple, func);
  }
  return __kmp_test_futex_lock(lck, gtid);
}

int __kmp_release_futex_lock(kmp_futex_lock_t *lck, kmp_int32 gtid) {
  KMP_MB(); /* Flush all pending memory write invalidates.  */

  KA_TRACE(1000, ("__kmp_release_futex_lock: lck:%p(0x%x), T#%d entering\n",
                  lck, lck->lk.poll, gtid));

  KMP_FSYNC_RELEASING(lck);

  kmp_int32 poll_val = KMP_XCHG_FIXED32(&(lck->lk.poll), KMP_LOCK_FREE(futex));

  KA_TRACE(1000,
           ("__kmp_release_futex_lock: lck:%p, T#%d released poll_val = 0x%x\n",
            lck, gtid, poll_val));

  if (KMP_LOCK_STRIP(poll_val) & 1) {
    KA_TRACE(1000,
             ("__kmp_release_futex_lock: lck:%p, T#%d futex_wake 1 thread\n",
              lck, gtid));
    syscall(__NR_futex, &(lck->lk.poll), FUTEX_WAKE, KMP_LOCK_BUSY(1, futex),
            NULL, NULL, 0);
  }

  KMP_MB(); /* Flush all pending memory write invalidates.  */

  KA_TRACE(1000, ("__kmp_release_futex_lock: lck:%p(0x%x), T#%d exiting\n", lck,
                  lck->lk.poll, gtid));

  KMP_YIELD_OVERSUB();
  return KMP_LOCK_RELEASED;
}

static int __kmp_release_futex_lock_with_checks(kmp_futex_lock_t *lck,
                                                kmp_int32 gtid) {
  char const *const func = "omp_unset_lock";
  KMP_MB(); /* in case another processor initialized lock */
  if ((sizeof(kmp_futex_lock_t) <= OMP_LOCK_T_SIZE) &&
      __kmp_is_futex_lock_nestable(lck)) {
    KMP_FATAL(LockNestableUsedAsSimple, func);
  }
  if (__kmp_get_futex_lock_owner(lck) == -1) {
    KMP_FATAL(LockUnsettingFree, func);
  }
  if ((gtid >= 0) && (__kmp_get_futex_lock_owner(lck) >= 0) &&
      (__kmp_get_futex_lock_owner(lck) != gtid)) {
    KMP_FATAL(LockUnsettingSetByAnother, func);
  }
  return __kmp_release_futex_lock(lck, gtid);
}

void __kmp_init_futex_lock(kmp_futex_lock_t *lck) {
  TCW_4(lck->lk.poll, KMP_LOCK_FREE(futex));
}

void __kmp_destroy_futex_lock(kmp_futex_lock_t *lck) { lck->lk.poll = 0; }

static void __kmp_destroy_futex_lock_with_checks(kmp_futex_lock_t *lck) {
  char const *const func = "omp_destroy_lock";
  if ((sizeof(kmp_futex_lock_t) <= OMP_LOCK_T_SIZE) &&
      __kmp_is_futex_lock_nestable(lck)) {
    KMP_FATAL(LockNestableUsedAsSimple, func);
  }
  if (__kmp_get_futex_lock_owner(lck) != -1) {
    KMP_FATAL(LockStillOwned, func);
  }
  __kmp_destroy_futex_lock(lck);
}

// nested futex locks

int __kmp_acquire_nested_futex_lock(kmp_futex_lock_t *lck, kmp_int32 gtid) {
  KMP_DEBUG_ASSERT(gtid >= 0);

  if (__kmp_get_futex_lock_owner(lck) == gtid) {
    lck->lk.depth_locked += 1;
    return KMP_LOCK_ACQUIRED_NEXT;
  } else {
    __kmp_acquire_futex_lock_timed_template(lck, gtid);
    lck->lk.depth_locked = 1;
    return KMP_LOCK_ACQUIRED_FIRST;
  }
}

static int __kmp_acquire_nested_futex_lock_with_checks(kmp_futex_lock_t *lck,
                                                       kmp_int32 gtid) {
  char const *const func = "omp_set_nest_lock";
  if (!__kmp_is_futex_lock_nestable(lck)) {
    KMP_FATAL(LockSimpleUsedAsNestable, func);
  }
  return __kmp_acquire_nested_futex_lock(lck, gtid);
}

int __kmp_test_nested_futex_lock(kmp_futex_lock_t *lck, kmp_int32 gtid) {
  int retval;

  KMP_DEBUG_ASSERT(gtid >= 0);

  if (__kmp_get_futex_lock_owner(lck) == gtid) {
    retval = ++lck->lk.depth_locked;
  } else if (!__kmp_test_futex_lock(lck, gtid)) {
    retval = 0;
  } else {
    KMP_MB();
    retval = lck->lk.depth_locked = 1;
  }
  return retval;
}

static int __kmp_test_nested_futex_lock_with_checks(kmp_futex_lock_t *lck,
                                                    kmp_int32 gtid) {
  char const *const func = "omp_test_nest_lock";
  if (!__kmp_is_futex_lock_nestable(lck)) {
    KMP_FATAL(LockSimpleUsedAsNestable, func);
  }
  return __kmp_test_nested_futex_lock(lck, gtid);
}

int __kmp_release_nested_futex_lock(kmp_futex_lock_t *lck, kmp_int32 gtid) {
  KMP_DEBUG_ASSERT(gtid >= 0);

  KMP_MB();
  if (--(lck->lk.depth_locked) == 0) {
    __kmp_release_futex_lock(lck, gtid);
    return KMP_LOCK_RELEASED;
  }
  return KMP_LOCK_STILL_HELD;
}

static int __kmp_release_nested_futex_lock_with_checks(kmp_futex_lock_t *lck,
                                                       kmp_int32 gtid) {
  char const *const func = "omp_unset_nest_lock";
  KMP_MB(); /* in case another processor initialized lock */
  if (!__kmp_is_futex_lock_nestable(lck)) {
    KMP_FATAL(LockSimpleUsedAsNestable, func);
  }
  if (__kmp_get_futex_lock_owner(lck) == -1) {
    KMP_FATAL(LockUnsettingFree, func);
  }
  if (__kmp_get_futex_lock_owner(lck) != gtid) {
    KMP_FATAL(LockUnsettingSetByAnother, func);
  }
  return __kmp_release_nested_futex_lock(lck, gtid);
}

void __kmp_init_nested_futex_lock(kmp_futex_lock_t *lck) {
  __kmp_init_futex_lock(lck);
  lck->lk.depth_locked = 0; // >= 0 for nestable locks, -1 for simple locks
}

void __kmp_destroy_nested_futex_lock(kmp_futex_lock_t *lck) {
  __kmp_destroy_futex_lock(lck);
  lck->lk.depth_locked = 0;
}

static void __kmp_destroy_nested_futex_lock_with_checks(kmp_futex_lock_t *lck) {
  char const *const func = "omp_destroy_nest_lock";
  if (!__kmp_is_futex_lock_nestable(lck)) {
    KMP_FATAL(LockSimpleUsedAsNestable, func);
  }
  if (__kmp_get_futex_lock_owner(lck) != -1) {
    KMP_FATAL(LockStillOwned, func);
  }
  __kmp_destroy_nested_futex_lock(lck);
}

#endif // KMP_USE_FUTEX

/* ------------------------------------------------------------------------ */
/* ticket (bakery) locks */

static kmp_int32 __kmp_get_ticket_lock_owner(kmp_ticket_lock_t *lck) {
  return std::atomic_load_explicit(&lck->lk.owner_id,
                                   std::memory_order_relaxed) -
         1;
}

static inline bool __kmp_is_ticket_lock_nestable(kmp_ticket_lock_t *lck) {
  return std::atomic_load_explicit(&lck->lk.depth_locked,
                                   std::memory_order_relaxed) != -1;
}

static kmp_uint32 __kmp_bakery_check(void *now_serving, kmp_uint32 my_ticket) {
  return std::atomic_load_explicit((std::atomic<unsigned> *)now_serving,
                                   std::memory_order_acquire) == my_ticket;
}

__forceinline static int
__kmp_acquire_ticket_lock_timed_template(kmp_ticket_lock_t *lck,
                                         kmp_int32 gtid) {
  kmp_uint32 my_ticket = std::atomic_fetch_add_explicit(
      &lck->lk.next_ticket, 1U, std::memory_order_relaxed);

#ifdef USE_LOCK_PROFILE
  if (std::atomic_load_explicit(&lck->lk.now_serving,
                                std::memory_order_relaxed) != my_ticket)
    __kmp_printf("LOCK CONTENTION: %p\n", lck);
/* else __kmp_printf( "." );*/
#endif /* USE_LOCK_PROFILE */

  if (std::atomic_load_explicit(&lck->lk.now_serving,
                                std::memory_order_acquire) == my_ticket) {
    return KMP_LOCK_ACQUIRED_FIRST;
  }
  KMP_WAIT_PTR(&lck->lk.now_serving, my_ticket, __kmp_bakery_check, lck);
  return KMP_LOCK_ACQUIRED_FIRST;
}

int __kmp_acquire_ticket_lock(kmp_ticket_lock_t *lck, kmp_int32 gtid) {
  int retval = __kmp_acquire_ticket_lock_timed_template(lck, gtid);
  return retval;
}

static int __kmp_acquire_ticket_lock_with_checks(kmp_ticket_lock_t *lck,
                                                 kmp_int32 gtid) {
  char const *const func = "omp_set_lock";

  if (!std::atomic_load_explicit(&lck->lk.initialized,
                                 std::memory_order_relaxed)) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (lck->lk.self != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (__kmp_is_ticket_lock_nestable(lck)) {
    KMP_FATAL(LockNestableUsedAsSimple, func);
  }
  if ((gtid >= 0) && (__kmp_get_ticket_lock_owner(lck) == gtid)) {
    KMP_FATAL(LockIsAlreadyOwned, func);
  }

  __kmp_acquire_ticket_lock(lck, gtid);

  std::atomic_store_explicit(&lck->lk.owner_id, gtid + 1,
                             std::memory_order_relaxed);
  return KMP_LOCK_ACQUIRED_FIRST;
}

int __kmp_test_ticket_lock(kmp_ticket_lock_t *lck, kmp_int32 gtid) {
  kmp_uint32 my_ticket = std::atomic_load_explicit(&lck->lk.next_ticket,
                                                   std::memory_order_relaxed);

  if (std::atomic_load_explicit(&lck->lk.now_serving,
                                std::memory_order_relaxed) == my_ticket) {
    kmp_uint32 next_ticket = my_ticket + 1;
    if (std::atomic_compare_exchange_strong_explicit(
            &lck->lk.next_ticket, &my_ticket, next_ticket,
            std::memory_order_acquire, std::memory_order_acquire)) {
      return TRUE;
    }
  }
  return FALSE;
}

static int __kmp_test_ticket_lock_with_checks(kmp_ticket_lock_t *lck,
                                              kmp_int32 gtid) {
  char const *const func = "omp_test_lock";

  if (!std::atomic_load_explicit(&lck->lk.initialized,
                                 std::memory_order_relaxed)) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (lck->lk.self != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (__kmp_is_ticket_lock_nestable(lck)) {
    KMP_FATAL(LockNestableUsedAsSimple, func);
  }

  int retval = __kmp_test_ticket_lock(lck, gtid);

  if (retval) {
    std::atomic_store_explicit(&lck->lk.owner_id, gtid + 1,
                               std::memory_order_relaxed);
  }
  return retval;
}

int __kmp_release_ticket_lock(kmp_ticket_lock_t *lck, kmp_int32 gtid) {
  kmp_uint32 distance = std::atomic_load_explicit(&lck->lk.next_ticket,
                                                  std::memory_order_relaxed) -
                        std::atomic_load_explicit(&lck->lk.now_serving,
                                                  std::memory_order_relaxed);

  std::atomic_fetch_add_explicit(&lck->lk.now_serving, 1U,
                                 std::memory_order_release);

  KMP_YIELD(distance >
            (kmp_uint32)(__kmp_avail_proc ? __kmp_avail_proc : __kmp_xproc));
  return KMP_LOCK_RELEASED;
}

static int __kmp_release_ticket_lock_with_checks(kmp_ticket_lock_t *lck,
                                                 kmp_int32 gtid) {
  char const *const func = "omp_unset_lock";

  if (!std::atomic_load_explicit(&lck->lk.initialized,
                                 std::memory_order_relaxed)) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (lck->lk.self != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (__kmp_is_ticket_lock_nestable(lck)) {
    KMP_FATAL(LockNestableUsedAsSimple, func);
  }
  if (__kmp_get_ticket_lock_owner(lck) == -1) {
    KMP_FATAL(LockUnsettingFree, func);
  }
  if ((gtid >= 0) && (__kmp_get_ticket_lock_owner(lck) >= 0) &&
      (__kmp_get_ticket_lock_owner(lck) != gtid)) {
    KMP_FATAL(LockUnsettingSetByAnother, func);
  }
  std::atomic_store_explicit(&lck->lk.owner_id, 0, std::memory_order_relaxed);
  return __kmp_release_ticket_lock(lck, gtid);
}

void __kmp_init_ticket_lock(kmp_ticket_lock_t *lck) {
  lck->lk.location = NULL;
  lck->lk.self = lck;
  std::atomic_store_explicit(&lck->lk.next_ticket, 0U,
                             std::memory_order_relaxed);
  std::atomic_store_explicit(&lck->lk.now_serving, 0U,
                             std::memory_order_relaxed);
  std::atomic_store_explicit(
      &lck->lk.owner_id, 0,
      std::memory_order_relaxed); // no thread owns the lock.
  std::atomic_store_explicit(
      &lck->lk.depth_locked, -1,
      std::memory_order_relaxed); // -1 => not a nested lock.
  std::atomic_store_explicit(&lck->lk.initialized, true,
                             std::memory_order_release);
}

void __kmp_destroy_ticket_lock(kmp_ticket_lock_t *lck) {
  std::atomic_store_explicit(&lck->lk.initialized, false,
                             std::memory_order_release);
  lck->lk.self = NULL;
  lck->lk.location = NULL;
  std::atomic_store_explicit(&lck->lk.next_ticket, 0U,
                             std::memory_order_relaxed);
  std::atomic_store_explicit(&lck->lk.now_serving, 0U,
                             std::memory_order_relaxed);
  std::atomic_store_explicit(&lck->lk.owner_id, 0, std::memory_order_relaxed);
  std::atomic_store_explicit(&lck->lk.depth_locked, -1,
                             std::memory_order_relaxed);
}

static void __kmp_destroy_ticket_lock_with_checks(kmp_ticket_lock_t *lck) {
  char const *const func = "omp_destroy_lock";

  if (!std::atomic_load_explicit(&lck->lk.initialized,
                                 std::memory_order_relaxed)) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (lck->lk.self != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (__kmp_is_ticket_lock_nestable(lck)) {
    KMP_FATAL(LockNestableUsedAsSimple, func);
  }
  if (__kmp_get_ticket_lock_owner(lck) != -1) {
    KMP_FATAL(LockStillOwned, func);
  }
  __kmp_destroy_ticket_lock(lck);
}

// nested ticket locks

int __kmp_acquire_nested_ticket_lock(kmp_ticket_lock_t *lck, kmp_int32 gtid) {
  KMP_DEBUG_ASSERT(gtid >= 0);

  if (__kmp_get_ticket_lock_owner(lck) == gtid) {
    std::atomic_fetch_add_explicit(&lck->lk.depth_locked, 1,
                                   std::memory_order_relaxed);
    return KMP_LOCK_ACQUIRED_NEXT;
  } else {
    __kmp_acquire_ticket_lock_timed_template(lck, gtid);
    std::atomic_store_explicit(&lck->lk.depth_locked, 1,
                               std::memory_order_relaxed);
    std::atomic_store_explicit(&lck->lk.owner_id, gtid + 1,
                               std::memory_order_relaxed);
    return KMP_LOCK_ACQUIRED_FIRST;
  }
}

static int __kmp_acquire_nested_ticket_lock_with_checks(kmp_ticket_lock_t *lck,
                                                        kmp_int32 gtid) {
  char const *const func = "omp_set_nest_lock";

  if (!std::atomic_load_explicit(&lck->lk.initialized,
                                 std::memory_order_relaxed)) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (lck->lk.self != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (!__kmp_is_ticket_lock_nestable(lck)) {
    KMP_FATAL(LockSimpleUsedAsNestable, func);
  }
  return __kmp_acquire_nested_ticket_lock(lck, gtid);
}

int __kmp_test_nested_ticket_lock(kmp_ticket_lock_t *lck, kmp_int32 gtid) {
  int retval;

  KMP_DEBUG_ASSERT(gtid >= 0);

  if (__kmp_get_ticket_lock_owner(lck) == gtid) {
    retval = std::atomic_fetch_add_explicit(&lck->lk.depth_locked, 1,
                                            std::memory_order_relaxed) +
             1;
  } else if (!__kmp_test_ticket_lock(lck, gtid)) {
    retval = 0;
  } else {
    std::atomic_store_explicit(&lck->lk.depth_locked, 1,
                               std::memory_order_relaxed);
    std::atomic_store_explicit(&lck->lk.owner_id, gtid + 1,
                               std::memory_order_relaxed);
    retval = 1;
  }
  return retval;
}

static int __kmp_test_nested_ticket_lock_with_checks(kmp_ticket_lock_t *lck,
                                                     kmp_int32 gtid) {
  char const *const func = "omp_test_nest_lock";

  if (!std::atomic_load_explicit(&lck->lk.initialized,
                                 std::memory_order_relaxed)) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (lck->lk.self != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (!__kmp_is_ticket_lock_nestable(lck)) {
    KMP_FATAL(LockSimpleUsedAsNestable, func);
  }
  return __kmp_test_nested_ticket_lock(lck, gtid);
}

int __kmp_release_nested_ticket_lock(kmp_ticket_lock_t *lck, kmp_int32 gtid) {
  KMP_DEBUG_ASSERT(gtid >= 0);

  if ((std::atomic_fetch_add_explicit(&lck->lk.depth_locked, -1,
                                      std::memory_order_relaxed) -
       1) == 0) {
    std::atomic_store_explicit(&lck->lk.owner_id, 0, std::memory_order_relaxed);
    __kmp_release_ticket_lock(lck, gtid);
    return KMP_LOCK_RELEASED;
  }
  return KMP_LOCK_STILL_HELD;
}

static int __kmp_release_nested_ticket_lock_with_checks(kmp_ticket_lock_t *lck,
                                                        kmp_int32 gtid) {
  char const *const func = "omp_unset_nest_lock";

  if (!std::atomic_load_explicit(&lck->lk.initialized,
                                 std::memory_order_relaxed)) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (lck->lk.self != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (!__kmp_is_ticket_lock_nestable(lck)) {
    KMP_FATAL(LockSimpleUsedAsNestable, func);
  }
  if (__kmp_get_ticket_lock_owner(lck) == -1) {
    KMP_FATAL(LockUnsettingFree, func);
  }
  if (__kmp_get_ticket_lock_owner(lck) != gtid) {
    KMP_FATAL(LockUnsettingSetByAnother, func);
  }
  return __kmp_release_nested_ticket_lock(lck, gtid);
}

void __kmp_init_nested_ticket_lock(kmp_ticket_lock_t *lck) {
  __kmp_init_ticket_lock(lck);
  std::atomic_store_explicit(&lck->lk.depth_locked, 0,
                             std::memory_order_relaxed);
  // >= 0 for nestable locks, -1 for simple locks
}

void __kmp_destroy_nested_ticket_lock(kmp_ticket_lock_t *lck) {
  __kmp_destroy_ticket_lock(lck);
  std::atomic_store_explicit(&lck->lk.depth_locked, 0,
                             std::memory_order_relaxed);
}

static void
__kmp_destroy_nested_ticket_lock_with_checks(kmp_ticket_lock_t *lck) {
  char const *const func = "omp_destroy_nest_lock";

  if (!std::atomic_load_explicit(&lck->lk.initialized,
                                 std::memory_order_relaxed)) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (lck->lk.self != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (!__kmp_is_ticket_lock_nestable(lck)) {
    KMP_FATAL(LockSimpleUsedAsNestable, func);
  }
  if (__kmp_get_ticket_lock_owner(lck) != -1) {
    KMP_FATAL(LockStillOwned, func);
  }
  __kmp_destroy_nested_ticket_lock(lck);
}

// access functions to fields which don't exist for all lock kinds.

static const ident_t *__kmp_get_ticket_lock_location(kmp_ticket_lock_t *lck) {
  return lck->lk.location;
}

static void __kmp_set_ticket_lock_location(kmp_ticket_lock_t *lck,
                                           const ident_t *loc) {
  lck->lk.location = loc;
}

static kmp_lock_flags_t __kmp_get_ticket_lock_flags(kmp_ticket_lock_t *lck) {
  return lck->lk.flags;
}

static void __kmp_set_ticket_lock_flags(kmp_ticket_lock_t *lck,
                                        kmp_lock_flags_t flags) {
  lck->lk.flags = flags;
}

/* ------------------------------------------------------------------------ */
/* queuing locks */

/* First the states
   (head,tail) =              0, 0  means lock is unheld, nobody on queue
                 UINT_MAX or -1, 0  means lock is held, nobody on queue
                              h, h  means lock held or about to transition,
                                    1 element on queue
                              h, t  h <> t, means lock is held or about to
                                    transition, >1 elements on queue

   Now the transitions
      Acquire(0,0)  = -1 ,0
      Release(0,0)  = Error
      Acquire(-1,0) =  h ,h    h > 0
      Release(-1,0) =  0 ,0
      Acquire(h,h)  =  h ,t    h > 0, t > 0, h <> t
      Release(h,h)  = -1 ,0    h > 0
      Acquire(h,t)  =  h ,t'   h > 0, t > 0, t' > 0, h <> t, h <> t', t <> t'
      Release(h,t)  =  h',t    h > 0, t > 0, h <> t, h <> h', h' maybe = t

   And pictorially

           +-----+
           | 0, 0|------- release -------> Error
           +-----+
             |  ^
      acquire|  |release
             |  |
             |  |
             v  |
           +-----+
           |-1, 0|
           +-----+
             |  ^
      acquire|  |release
             |  |
             |  |
             v  |
           +-----+
           | h, h|
           +-----+
             |  ^
      acquire|  |release
             |  |
             |  |
             v  |
           +-----+
           | h, t|----- acquire, release loopback ---+
           +-----+                                   |
                ^                                    |
                |                                    |
                +------------------------------------+
 */

#ifdef DEBUG_QUEUING_LOCKS

/* Stuff for circular trace buffer */
#define TRACE_BUF_ELE 1024
static char traces[TRACE_BUF_ELE][128] = {0};
static int tc = 0;
#define TRACE_LOCK(X, Y)                                                       \
  KMP_SNPRINTF(traces[tc++ % TRACE_BUF_ELE], 128, "t%d at %s\n", X, Y);
#define TRACE_LOCK_T(X, Y, Z)                                                  \
  KMP_SNPRINTF(traces[tc++ % TRACE_BUF_ELE], 128, "t%d at %s%d\n", X, Y, Z);
#define TRACE_LOCK_HT(X, Y, Z, Q)                                              \
  KMP_SNPRINTF(traces[tc++ % TRACE_BUF_ELE], 128, "t%d at %s %d,%d\n", X, Y,   \
               Z, Q);

static void __kmp_dump_queuing_lock(kmp_info_t *this_thr, kmp_int32 gtid,
                                    kmp_queuing_lock_t *lck, kmp_int32 head_id,
                                    kmp_int32 tail_id) {
  kmp_int32 t, i;

  __kmp_printf_no_lock("\n__kmp_dump_queuing_lock: TRACE BEGINS HERE! \n");

  i = tc % TRACE_BUF_ELE;
  __kmp_printf_no_lock("%s\n", traces[i]);
  i = (i + 1) % TRACE_BUF_ELE;
  while (i != (tc % TRACE_BUF_ELE)) {
    __kmp_printf_no_lock("%s", traces[i]);
    i = (i + 1) % TRACE_BUF_ELE;
  }
  __kmp_printf_no_lock("\n");

  __kmp_printf_no_lock("\n__kmp_dump_queuing_lock: gtid+1:%d, spin_here:%d, "
                       "next_wait:%d, head_id:%d, tail_id:%d\n",
                       gtid + 1, this_thr->th.th_spin_here,
                       this_thr->th.th_next_waiting, head_id, tail_id);

  __kmp_printf_no_lock("\t\thead: %d ", lck->lk.head_id);

  if (lck->lk.head_id >= 1) {
    t = __kmp_threads[lck->lk.head_id - 1]->th.th_next_waiting;
    while (t > 0) {
      __kmp_printf_no_lock("-> %d ", t);
      t = __kmp_threads[t - 1]->th.th_next_waiting;
    }
  }
  __kmp_printf_no_lock(";  tail: %d ", lck->lk.tail_id);
  __kmp_printf_no_lock("\n\n");
}

#endif /* DEBUG_QUEUING_LOCKS */

static kmp_int32 __kmp_get_queuing_lock_owner(kmp_queuing_lock_t *lck) {
  return TCR_4(lck->lk.owner_id) - 1;
}

static inline bool __kmp_is_queuing_lock_nestable(kmp_queuing_lock_t *lck) {
  return lck->lk.depth_locked != -1;
}

/* Acquire a lock using a the queuing lock implementation */
template <bool takeTime>
/* [TLW] The unused template above is left behind because of what BEB believes
   is a potential compiler problem with __forceinline. */
__forceinline static int
__kmp_acquire_queuing_lock_timed_template(kmp_queuing_lock_t *lck,
                                          kmp_int32 gtid) {
  kmp_info_t *this_thr = __kmp_thread_from_gtid(gtid);
  volatile kmp_int32 *head_id_p = &lck->lk.head_id;
  volatile kmp_int32 *tail_id_p = &lck->lk.tail_id;
  volatile kmp_uint32 *spin_here_p;

#if OMPT_SUPPORT
  ompt_state_t prev_state = ompt_state_undefined;
#endif

  KA_TRACE(1000,
           ("__kmp_acquire_queuing_lock: lck:%p, T#%d entering\n", lck, gtid));

  KMP_FSYNC_PREPARE(lck);
  KMP_DEBUG_ASSERT(this_thr != NULL);
  spin_here_p = &this_thr->th.th_spin_here;

#ifdef DEBUG_QUEUING_LOCKS
  TRACE_LOCK(gtid + 1, "acq ent");
  if (*spin_here_p)
    __kmp_dump_queuing_lock(this_thr, gtid, lck, *head_id_p, *tail_id_p);
  if (this_thr->th.th_next_waiting != 0)
    __kmp_dump_queuing_lock(this_thr, gtid, lck, *head_id_p, *tail_id_p);
#endif
  KMP_DEBUG_ASSERT(!*spin_here_p);
  KMP_DEBUG_ASSERT(this_thr->th.th_next_waiting == 0);

  /* The following st.rel to spin_here_p needs to precede the cmpxchg.acq to
     head_id_p that may follow, not just in execution order, but also in
     visibility order. This way, when a releasing thread observes the changes to
     the queue by this thread, it can rightly assume that spin_here_p has
     already been set to TRUE, so that when it sets spin_here_p to FALSE, it is
     not premature.  If the releasing thread sets spin_here_p to FALSE before
     this thread sets it to TRUE, this thread will hang. */
  *spin_here_p = TRUE; /* before enqueuing to prevent race */

  while (1) {
    kmp_int32 enqueued;
    kmp_int32 head;
    kmp_int32 tail;

    head = *head_id_p;

    switch (head) {

    case -1: {
#ifdef DEBUG_QUEUING_LOCKS
      tail = *tail_id_p;
      TRACE_LOCK_HT(gtid + 1, "acq read: ", head, tail);
#endif
      tail = 0; /* to make sure next link asynchronously read is not set
                accidentally; this assignment prevents us from entering the
                if ( t > 0 ) condition in the enqueued case below, which is not
                necessary for this state transition */

      /* try (-1,0)->(tid,tid) */
      enqueued = KMP_COMPARE_AND_STORE_ACQ64((volatile kmp_int64 *)tail_id_p,
                                             KMP_PACK_64(-1, 0),
                                             KMP_PACK_64(gtid + 1, gtid + 1));
#ifdef DEBUG_QUEUING_LOCKS
      if (enqueued)
        TRACE_LOCK(gtid + 1, "acq enq: (-1,0)->(tid,tid)");
#endif
    } break;

    default: {
      tail = *tail_id_p;
      KMP_DEBUG_ASSERT(tail != gtid + 1);

#ifdef DEBUG_QUEUING_LOCKS
      TRACE_LOCK_HT(gtid + 1, "acq read: ", head, tail);
#endif

      if (tail == 0) {
        enqueued = FALSE;
      } else {
        /* try (h,t) or (h,h)->(h,tid) */
        enqueued = KMP_COMPARE_AND_STORE_ACQ32(tail_id_p, tail, gtid + 1);

#ifdef DEBUG_QUEUING_LOCKS
        if (enqueued)
          TRACE_LOCK(gtid + 1, "acq enq: (h,t)->(h,tid)");
#endif
      }
    } break;

    case 0: /* empty queue */
    {
      kmp_int32 grabbed_lock;

#ifdef DEBUG_QUEUING_LOCKS
      tail = *tail_id_p;
      TRACE_LOCK_HT(gtid + 1, "acq read: ", head, tail);
#endif
      /* try (0,0)->(-1,0) */

      /* only legal transition out of head = 0 is head = -1 with no change to
       * tail */
      grabbed_lock = KMP_COMPARE_AND_STORE_ACQ32(head_id_p, 0, -1);

      if (grabbed_lock) {

        *spin_here_p = FALSE;

        KA_TRACE(
            1000,
            ("__kmp_acquire_queuing_lock: lck:%p, T#%d exiting: no queuing\n",
             lck, gtid));
#ifdef DEBUG_QUEUING_LOCKS
        TRACE_LOCK_HT(gtid + 1, "acq exit: ", head, 0);
#endif

#if OMPT_SUPPORT
        if (ompt_enabled.enabled && prev_state != ompt_state_undefined) {
          /* change the state before clearing wait_id */
          this_thr->th.ompt_thread_info.state = prev_state;
          this_thr->th.ompt_thread_info.wait_id = 0;
        }
#endif

        KMP_FSYNC_ACQUIRED(lck);
        return KMP_LOCK_ACQUIRED_FIRST; /* lock holder cannot be on queue */
      }
      enqueued = FALSE;
    } break;
    }

#if OMPT_SUPPORT
    if (ompt_enabled.enabled && prev_state == ompt_state_undefined) {
      /* this thread will spin; set wait_id before entering wait state */
      prev_state = this_thr->th.ompt_thread_info.state;
      this_thr->th.ompt_thread_info.wait_id = (uint64_t)lck;
      this_thr->th.ompt_thread_info.state = ompt_state_wait_lock;
    }
#endif

    if (enqueued) {
      if (tail > 0) {
        kmp_info_t *tail_thr = __kmp_thread_from_gtid(tail - 1);
        KMP_ASSERT(tail_thr != NULL);
        tail_thr->th.th_next_waiting = gtid + 1;
        /* corresponding wait for this write in release code */
      }
      KA_TRACE(1000,
               ("__kmp_acquire_queuing_lock: lck:%p, T#%d waiting for lock\n",
                lck, gtid));

      KMP_MB();
      // ToDo: Use __kmp_wait_sleep or similar when blocktime != inf
      KMP_WAIT(spin_here_p, FALSE, KMP_EQ, lck);
      // Synchronize writes to both runtime thread structures
      // and writes in user code.
      KMP_MB();

#ifdef DEBUG_QUEUING_LOCKS
      TRACE_LOCK(gtid + 1, "acq spin");

      if (this_thr->th.th_next_waiting != 0)
        __kmp_dump_queuing_lock(this_thr, gtid, lck, *head_id_p, *tail_id_p);
#endif
      KMP_DEBUG_ASSERT(this_thr->th.th_next_waiting == 0);
      KA_TRACE(1000, ("__kmp_acquire_queuing_lock: lck:%p, T#%d exiting: after "
                      "waiting on queue\n",
                      lck, gtid));

#ifdef DEBUG_QUEUING_LOCKS
      TRACE_LOCK(gtid + 1, "acq exit 2");
#endif

#if OMPT_SUPPORT
      /* change the state before clearing wait_id */
      this_thr->th.ompt_thread_info.state = prev_state;
      this_thr->th.ompt_thread_info.wait_id = 0;
#endif

      /* got lock, we were dequeued by the thread that released lock */
      return KMP_LOCK_ACQUIRED_FIRST;
    }

    /* Yield if number of threads > number of logical processors */
    /* ToDo: Not sure why this should only be in oversubscription case,
       maybe should be traditional YIELD_INIT/YIELD_WHEN loop */
    KMP_YIELD_OVERSUB();

#ifdef DEBUG_QUEUING_LOCKS
    TRACE_LOCK(gtid + 1, "acq retry");
#endif
  }
  KMP_ASSERT2(0, "should not get here");
  return KMP_LOCK_ACQUIRED_FIRST;
}

int __kmp_acquire_queuing_lock(kmp_queuing_lock_t *lck, kmp_int32 gtid) {
  KMP_DEBUG_ASSERT(gtid >= 0);

  int retval = __kmp_acquire_queuing_lock_timed_template<false>(lck, gtid);
  return retval;
}

static int __kmp_acquire_queuing_lock_with_checks(kmp_queuing_lock_t *lck,
                                                  kmp_int32 gtid) {
  char const *const func = "omp_set_lock";
  if (lck->lk.initialized != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (__kmp_is_queuing_lock_nestable(lck)) {
    KMP_FATAL(LockNestableUsedAsSimple, func);
  }
  if (__kmp_get_queuing_lock_owner(lck) == gtid) {
    KMP_FATAL(LockIsAlreadyOwned, func);
  }

  __kmp_acquire_queuing_lock(lck, gtid);

  lck->lk.owner_id = gtid + 1;
  return KMP_LOCK_ACQUIRED_FIRST;
}

int __kmp_test_queuing_lock(kmp_queuing_lock_t *lck, kmp_int32 gtid) {
  volatile kmp_int32 *head_id_p = &lck->lk.head_id;
  kmp_int32 head;
#ifdef KMP_DEBUG
  kmp_info_t *this_thr;
#endif

  KA_TRACE(1000, ("__kmp_test_queuing_lock: T#%d entering\n", gtid));
  KMP_DEBUG_ASSERT(gtid >= 0);
#ifdef KMP_DEBUG
  this_thr = __kmp_thread_from_gtid(gtid);
  KMP_DEBUG_ASSERT(this_thr != NULL);
  KMP_DEBUG_ASSERT(!this_thr->th.th_spin_here);
#endif

  head = *head_id_p;

  if (head == 0) { /* nobody on queue, nobody holding */
    /* try (0,0)->(-1,0) */
    if (KMP_COMPARE_AND_STORE_ACQ32(head_id_p, 0, -1)) {
      KA_TRACE(1000,
               ("__kmp_test_queuing_lock: T#%d exiting: holding lock\n", gtid));
      KMP_FSYNC_ACQUIRED(lck);
      return TRUE;
    }
  }

  KA_TRACE(1000,
           ("__kmp_test_queuing_lock: T#%d exiting: without lock\n", gtid));
  return FALSE;
}

static int __kmp_test_queuing_lock_with_checks(kmp_queuing_lock_t *lck,
                                               kmp_int32 gtid) {
  char const *const func = "omp_test_lock";
  if (lck->lk.initialized != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (__kmp_is_queuing_lock_nestable(lck)) {
    KMP_FATAL(LockNestableUsedAsSimple, func);
  }

  int retval = __kmp_test_queuing_lock(lck, gtid);

  if (retval) {
    lck->lk.owner_id = gtid + 1;
  }
  return retval;
}

int __kmp_release_queuing_lock(kmp_queuing_lock_t *lck, kmp_int32 gtid) {
  volatile kmp_int32 *head_id_p = &lck->lk.head_id;
  volatile kmp_int32 *tail_id_p = &lck->lk.tail_id;

  KA_TRACE(1000,
           ("__kmp_release_queuing_lock: lck:%p, T#%d entering\n", lck, gtid));
  KMP_DEBUG_ASSERT(gtid >= 0);
#if KMP_DEBUG || DEBUG_QUEUING_LOCKS
  kmp_info_t *this_thr = __kmp_thread_from_gtid(gtid);
#endif
  KMP_DEBUG_ASSERT(this_thr != NULL);
#ifdef DEBUG_QUEUING_LOCKS
  TRACE_LOCK(gtid + 1, "rel ent");

  if (this_thr->th.th_spin_here)
    __kmp_dump_queuing_lock(this_thr, gtid, lck, *head_id_p, *tail_id_p);
  if (this_thr->th.th_next_waiting != 0)
    __kmp_dump_queuing_lock(this_thr, gtid, lck, *head_id_p, *tail_id_p);
#endif
  KMP_DEBUG_ASSERT(!this_thr->th.th_spin_here);
  KMP_DEBUG_ASSERT(this_thr->th.th_next_waiting == 0);

  KMP_FSYNC_RELEASING(lck);

  while (1) {
    kmp_int32 dequeued;
    kmp_int32 head;
    kmp_int32 tail;

    head = *head_id_p;

#ifdef DEBUG_QUEUING_LOCKS
    tail = *tail_id_p;
    TRACE_LOCK_HT(gtid + 1, "rel read: ", head, tail);
    if (head == 0)
      __kmp_dump_queuing_lock(this_thr, gtid, lck, head, tail);
#endif
    KMP_DEBUG_ASSERT(head !=
                     0); /* holding the lock, head must be -1 or queue head */

    if (head == -1) { /* nobody on queue */
      /* try (-1,0)->(0,0) */
      if (KMP_COMPARE_AND_STORE_REL32(head_id_p, -1, 0)) {
        KA_TRACE(
            1000,
            ("__kmp_release_queuing_lock: lck:%p, T#%d exiting: queue empty\n",
             lck, gtid));
#ifdef DEBUG_QUEUING_LOCKS
        TRACE_LOCK_HT(gtid + 1, "rel exit: ", 0, 0);
#endif

#if OMPT_SUPPORT
/* nothing to do - no other thread is trying to shift blame */
#endif
        return KMP_LOCK_RELEASED;
      }
      dequeued = FALSE;
    } else {
      KMP_MB();
      tail = *tail_id_p;
      if (head == tail) { /* only one thread on the queue */
#ifdef DEBUG_QUEUING_LOCKS
        if (head <= 0)
          __kmp_dump_queuing_lock(this_thr, gtid, lck, head, tail);
#endif
        KMP_DEBUG_ASSERT(head > 0);

        /* try (h,h)->(-1,0) */
        dequeued = KMP_COMPARE_AND_STORE_REL64(
            RCAST(volatile kmp_int64 *, tail_id_p), KMP_PACK_64(head, head),
            KMP_PACK_64(-1, 0));
#ifdef DEBUG_QUEUING_LOCKS
        TRACE_LOCK(gtid + 1, "rel deq: (h,h)->(-1,0)");
#endif

      } else {
        volatile kmp_int32 *waiting_id_p;
        kmp_info_t *head_thr = __kmp_thread_from_gtid(head - 1);
        KMP_DEBUG_ASSERT(head_thr != NULL);
        waiting_id_p = &head_thr->th.th_next_waiting;

/* Does this require synchronous reads? */
#ifdef DEBUG_QUEUING_LOCKS
        if (head <= 0 || tail <= 0)
          __kmp_dump_queuing_lock(this_thr, gtid, lck, head, tail);
#endif
        KMP_DEBUG_ASSERT(head > 0 && tail > 0);

        /* try (h,t)->(h',t) or (t,t) */
        KMP_MB();
        /* make sure enqueuing thread has time to update next waiting thread
         * field */
        *head_id_p =
            KMP_WAIT((volatile kmp_uint32 *)waiting_id_p, 0, KMP_NEQ, NULL);
#ifdef DEBUG_QUEUING_LOCKS
        TRACE_LOCK(gtid + 1, "rel deq: (h,t)->(h',t)");
#endif
        dequeued = TRUE;
      }
    }

    if (dequeued) {
      kmp_info_t *head_thr = __kmp_thread_from_gtid(head - 1);
      KMP_DEBUG_ASSERT(head_thr != NULL);

/* Does this require synchronous reads? */
#ifdef DEBUG_QUEUING_LOCKS
      if (head <= 0 || tail <= 0)
        __kmp_dump_queuing_lock(this_thr, gtid, lck, head, tail);
#endif
      KMP_DEBUG_ASSERT(head > 0 && tail > 0);

      /* For clean code only. Thread not released until next statement prevents
         race with acquire code. */
      head_thr->th.th_next_waiting = 0;
#ifdef DEBUG_QUEUING_LOCKS
      TRACE_LOCK_T(gtid + 1, "rel nw=0 for t=", head);
#endif

      KMP_MB();
      /* reset spin value */
      head_thr->th.th_spin_here = FALSE;

      KA_TRACE(1000, ("__kmp_release_queuing_lock: lck:%p, T#%d exiting: after "
                      "dequeuing\n",
                      lck, gtid));
#ifdef DEBUG_QUEUING_LOCKS
      TRACE_LOCK(gtid + 1, "rel exit 2");
#endif
      return KMP_LOCK_RELEASED;
    }
    /* KMP_CPU_PAUSE(); don't want to make releasing thread hold up acquiring
       threads */

#ifdef DEBUG_QUEUING_LOCKS
    TRACE_LOCK(gtid + 1, "rel retry");
#endif

  } /* while */
  KMP_ASSERT2(0, "should not get here");
  return KMP_LOCK_RELEASED;
}

static int __kmp_release_queuing_lock_with_checks(kmp_queuing_lock_t *lck,
                                                  kmp_int32 gtid) {
  char const *const func = "omp_unset_lock";
  KMP_MB(); /* in case another processor initialized lock */
  if (lck->lk.initialized != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (__kmp_is_queuing_lock_nestable(lck)) {
    KMP_FATAL(LockNestableUsedAsSimple, func);
  }
  if (__kmp_get_queuing_lock_owner(lck) == -1) {
    KMP_FATAL(LockUnsettingFree, func);
  }
  if (__kmp_get_queuing_lock_owner(lck) != gtid) {
    KMP_FATAL(LockUnsettingSetByAnother, func);
  }
  lck->lk.owner_id = 0;
  return __kmp_release_queuing_lock(lck, gtid);
}

void __kmp_init_queuing_lock(kmp_queuing_lock_t *lck) {
  lck->lk.location = NULL;
  lck->lk.head_id = 0;
  lck->lk.tail_id = 0;
  lck->lk.next_ticket = 0;
  lck->lk.now_serving = 0;
  lck->lk.owner_id = 0; // no thread owns the lock.
  lck->lk.depth_locked = -1; // >= 0 for nestable locks, -1 for simple locks.
  lck->lk.initialized = lck;

  KA_TRACE(1000, ("__kmp_init_queuing_lock: lock %p initialized\n", lck));
}

void __kmp_destroy_queuing_lock(kmp_queuing_lock_t *lck) {
  lck->lk.initialized = NULL;
  lck->lk.location = NULL;
  lck->lk.head_id = 0;
  lck->lk.tail_id = 0;
  lck->lk.next_ticket = 0;
  lck->lk.now_serving = 0;
  lck->lk.owner_id = 0;
  lck->lk.depth_locked = -1;
}

static void __kmp_destroy_queuing_lock_with_checks(kmp_queuing_lock_t *lck) {
  char const *const func = "omp_destroy_lock";
  if (lck->lk.initialized != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (__kmp_is_queuing_lock_nestable(lck)) {
    KMP_FATAL(LockNestableUsedAsSimple, func);
  }
  if (__kmp_get_queuing_lock_owner(lck) != -1) {
    KMP_FATAL(LockStillOwned, func);
  }
  __kmp_destroy_queuing_lock(lck);
}

// nested queuing locks

int __kmp_acquire_nested_queuing_lock(kmp_queuing_lock_t *lck, kmp_int32 gtid) {
  KMP_DEBUG_ASSERT(gtid >= 0);

  if (__kmp_get_queuing_lock_owner(lck) == gtid) {
    lck->lk.depth_locked += 1;
    return KMP_LOCK_ACQUIRED_NEXT;
  } else {
    __kmp_acquire_queuing_lock_timed_template<false>(lck, gtid);
    KMP_MB();
    lck->lk.depth_locked = 1;
    KMP_MB();
    lck->lk.owner_id = gtid + 1;
    return KMP_LOCK_ACQUIRED_FIRST;
  }
}

static int
__kmp_acquire_nested_queuing_lock_with_checks(kmp_queuing_lock_t *lck,
                                              kmp_int32 gtid) {
  char const *const func = "omp_set_nest_lock";
  if (lck->lk.initialized != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (!__kmp_is_queuing_lock_nestable(lck)) {
    KMP_FATAL(LockSimpleUsedAsNestable, func);
  }
  return __kmp_acquire_nested_queuing_lock(lck, gtid);
}

int __kmp_test_nested_queuing_lock(kmp_queuing_lock_t *lck, kmp_int32 gtid) {
  int retval;

  KMP_DEBUG_ASSERT(gtid >= 0);

  if (__kmp_get_queuing_lock_owner(lck) == gtid) {
    retval = ++lck->lk.depth_locked;
  } else if (!__kmp_test_queuing_lock(lck, gtid)) {
    retval = 0;
  } else {
    KMP_MB();
    retval = lck->lk.depth_locked = 1;
    KMP_MB();
    lck->lk.owner_id = gtid + 1;
  }
  return retval;
}

static int __kmp_test_nested_queuing_lock_with_checks(kmp_queuing_lock_t *lck,
                                                      kmp_int32 gtid) {
  char const *const func = "omp_test_nest_lock";
  if (lck->lk.initialized != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (!__kmp_is_queuing_lock_nestable(lck)) {
    KMP_FATAL(LockSimpleUsedAsNestable, func);
  }
  return __kmp_test_nested_queuing_lock(lck, gtid);
}

int __kmp_release_nested_queuing_lock(kmp_queuing_lock_t *lck, kmp_int32 gtid) {
  KMP_DEBUG_ASSERT(gtid >= 0);

  KMP_MB();
  if (--(lck->lk.depth_locked) == 0) {
    KMP_MB();
    lck->lk.owner_id = 0;
    __kmp_release_queuing_lock(lck, gtid);
    return KMP_LOCK_RELEASED;
  }
  return KMP_LOCK_STILL_HELD;
}

static int
__kmp_release_nested_queuing_lock_with_checks(kmp_queuing_lock_t *lck,
                                              kmp_int32 gtid) {
  char const *const func = "omp_unset_nest_lock";
  KMP_MB(); /* in case another processor initialized lock */
  if (lck->lk.initialized != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (!__kmp_is_queuing_lock_nestable(lck)) {
    KMP_FATAL(LockSimpleUsedAsNestable, func);
  }
  if (__kmp_get_queuing_lock_owner(lck) == -1) {
    KMP_FATAL(LockUnsettingFree, func);
  }
  if (__kmp_get_queuing_lock_owner(lck) != gtid) {
    KMP_FATAL(LockUnsettingSetByAnother, func);
  }
  return __kmp_release_nested_queuing_lock(lck, gtid);
}

void __kmp_init_nested_queuing_lock(kmp_queuing_lock_t *lck) {
  __kmp_init_queuing_lock(lck);
  lck->lk.depth_locked = 0; // >= 0 for nestable locks, -1 for simple locks
}

void __kmp_destroy_nested_queuing_lock(kmp_queuing_lock_t *lck) {
  __kmp_destroy_queuing_lock(lck);
  lck->lk.depth_locked = 0;
}

static void
__kmp_destroy_nested_queuing_lock_with_checks(kmp_queuing_lock_t *lck) {
  char const *const func = "omp_destroy_nest_lock";
  if (lck->lk.initialized != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (!__kmp_is_queuing_lock_nestable(lck)) {
    KMP_FATAL(LockSimpleUsedAsNestable, func);
  }
  if (__kmp_get_queuing_lock_owner(lck) != -1) {
    KMP_FATAL(LockStillOwned, func);
  }
  __kmp_destroy_nested_queuing_lock(lck);
}

// access functions to fields which don't exist for all lock kinds.

static const ident_t *__kmp_get_queuing_lock_location(kmp_queuing_lock_t *lck) {
  return lck->lk.location;
}

static void __kmp_set_queuing_lock_location(kmp_queuing_lock_t *lck,
                                            const ident_t *loc) {
  lck->lk.location = loc;
}

static kmp_lock_flags_t __kmp_get_queuing_lock_flags(kmp_queuing_lock_t *lck) {
  return lck->lk.flags;
}

static void __kmp_set_queuing_lock_flags(kmp_queuing_lock_t *lck,
                                         kmp_lock_flags_t flags) {
  lck->lk.flags = flags;
}

#if KMP_USE_ADAPTIVE_LOCKS

/* RTM Adaptive locks */

#if KMP_HAVE_RTM_INTRINSICS
#include <immintrin.h>
#define SOFT_ABORT_MASK (_XABORT_RETRY | _XABORT_CONFLICT | _XABORT_EXPLICIT)

#else

// Values from the status register after failed speculation.
#define _XBEGIN_STARTED (~0u)
#define _XABORT_EXPLICIT (1 << 0)
#define _XABORT_RETRY (1 << 1)
#define _XABORT_CONFLICT (1 << 2)
#define _XABORT_CAPACITY (1 << 3)
#define _XABORT_DEBUG (1 << 4)
#define _XABORT_NESTED (1 << 5)
#define _XABORT_CODE(x) ((unsigned char)(((x) >> 24) & 0xFF))

// Aborts for which it's worth trying again immediately
#define SOFT_ABORT_MASK (_XABORT_RETRY | _XABORT_CONFLICT | _XABORT_EXPLICIT)

#define STRINGIZE_INTERNAL(arg) #arg
#define STRINGIZE(arg) STRINGIZE_INTERNAL(arg)

// Access to RTM instructions
/*A version of XBegin which returns -1 on speculation, and the value of EAX on
  an abort. This is the same definition as the compiler intrinsic that will be
  supported at some point. */
static __inline int _xbegin() {
  int res = -1;

#if KMP_OS_WINDOWS
#if KMP_ARCH_X86_64
  _asm {
        _emit 0xC7
        _emit 0xF8
        _emit 2
        _emit 0
        _emit 0
        _emit 0
        jmp   L2
        mov   res, eax
    L2:
  }
#else /* IA32 */
  _asm {
        _emit 0xC7
        _emit 0xF8
        _emit 2
        _emit 0
        _emit 0
        _emit 0
        jmp   L2
        mov   res, eax
    L2:
  }
#endif // KMP_ARCH_X86_64
#else
  /* Note that %eax must be noted as killed (clobbered), because the XSR is
     returned in %eax(%rax) on abort.  Other register values are restored, so
     don't need to be killed.

     We must also mark 'res' as an input and an output, since otherwise
     'res=-1' may be dropped as being dead, whereas we do need the assignment on
     the successful (i.e., non-abort) path. */
  __asm__ volatile("1: .byte  0xC7; .byte 0xF8;\n"
                   "   .long  1f-1b-6\n"
                   "    jmp   2f\n"
                   "1:  movl  %%eax,%0\n"
                   "2:"
                   : "+r"(res)::"memory", "%eax");
#endif // KMP_OS_WINDOWS
  return res;
}

/* Transaction end */
static __inline void _xend() {
#if KMP_OS_WINDOWS
  __asm {
        _emit 0x0f
        _emit 0x01
        _emit 0xd5
  }
#else
  __asm__ volatile(".byte 0x0f; .byte 0x01; .byte 0xd5" ::: "memory");
#endif
}

/* This is a macro, the argument must be a single byte constant which can be
   evaluated by the inline assembler, since it is emitted as a byte into the
   assembly code. */
// clang-format off
#if KMP_OS_WINDOWS
#define _xabort(ARG) _asm _emit 0xc6 _asm _emit 0xf8 _asm _emit ARG
#else
#define _xabort(ARG)                                                           \
  __asm__ volatile(".byte 0xC6; .byte 0xF8; .byte " STRINGIZE(ARG):::"memory");
#endif
// clang-format on
#endif // KMP_COMPILER_ICC && __INTEL_COMPILER >= 1300

// Statistics is collected for testing purpose
#if KMP_DEBUG_ADAPTIVE_LOCKS

// We accumulate speculative lock statistics when the lock is destroyed. We
// keep locks that haven't been destroyed in the liveLocks list so that we can
// grab their statistics too.
static kmp_adaptive_lock_statistics_t destroyedStats;

// To hold the list of live locks.
static kmp_adaptive_lock_info_t liveLocks;

// A lock so we can safely update the list of locks.
static kmp_bootstrap_lock_t chain_lock =
    KMP_BOOTSTRAP_LOCK_INITIALIZER(chain_lock);

// Initialize the list of stats.
void __kmp_init_speculative_stats() {
  kmp_adaptive_lock_info_t *lck = &liveLocks;

  memset(CCAST(kmp_adaptive_lock_statistics_t *, &(lck->stats)), 0,
         sizeof(lck->stats));
  lck->stats.next = lck;
  lck->stats.prev = lck;

  KMP_ASSERT(lck->stats.next->stats.prev == lck);
  KMP_ASSERT(lck->stats.prev->stats.next == lck);

  __kmp_init_bootstrap_lock(&chain_lock);
}

// Insert the lock into the circular list
static void __kmp_remember_lock(kmp_adaptive_lock_info_t *lck) {
  __kmp_acquire_bootstrap_lock(&chain_lock);

  lck->stats.next = liveLocks.stats.next;
  lck->stats.prev = &liveLocks;

  liveLocks.stats.next = lck;
  lck->stats.next->stats.prev = lck;

  KMP_ASSERT(lck->stats.next->stats.prev == lck);
  KMP_ASSERT(lck->stats.prev->stats.next == lck);

  __kmp_release_bootstrap_lock(&chain_lock);
}

static void __kmp_forget_lock(kmp_adaptive_lock_info_t *lck) {
  KMP_ASSERT(lck->stats.next->stats.prev == lck);
  KMP_ASSERT(lck->stats.prev->stats.next == lck);

  kmp_adaptive_lock_info_t *n = lck->stats.next;
  kmp_adaptive_lock_info_t *p = lck->stats.prev;

  n->stats.prev = p;
  p->stats.next = n;
}

static void __kmp_zero_speculative_stats(kmp_adaptive_lock_info_t *lck) {
  memset(CCAST(kmp_adaptive_lock_statistics_t *, &lck->stats), 0,
         sizeof(lck->stats));
  __kmp_remember_lock(lck);
}

static void __kmp_add_stats(kmp_adaptive_lock_statistics_t *t,
                            kmp_adaptive_lock_info_t *lck) {
  kmp_adaptive_lock_statistics_t volatile *s = &lck->stats;

  t->nonSpeculativeAcquireAttempts += lck->acquire_attempts;
  t->successfulSpeculations += s->successfulSpeculations;
  t->hardFailedSpeculations += s->hardFailedSpeculations;
  t->softFailedSpeculations += s->softFailedSpeculations;
  t->nonSpeculativeAcquires += s->nonSpeculativeAcquires;
  t->lemmingYields += s->lemmingYields;
}

static void __kmp_accumulate_speculative_stats(kmp_adaptive_lock_info_t *lck) {
  __kmp_acquire_bootstrap_lock(&chain_lock);

  __kmp_add_stats(&destroyedStats, lck);
  __kmp_forget_lock(lck);

  __kmp_release_bootstrap_lock(&chain_lock);
}

static float percent(kmp_uint32 count, kmp_uint32 total) {
  return (total == 0) ? 0.0 : (100.0 * count) / total;
}

void __kmp_print_speculative_stats() {
  kmp_adaptive_lock_statistics_t total = destroyedStats;
  kmp_adaptive_lock_info_t *lck;

  for (lck = liveLocks.stats.next; lck != &liveLocks; lck = lck->stats.next) {
    __kmp_add_stats(&total, lck);
  }
  kmp_adaptive_lock_statistics_t *t = &total;
  kmp_uint32 totalSections =
      t->nonSpeculativeAcquires + t->successfulSpeculations;
  kmp_uint32 totalSpeculations = t->successfulSpeculations +
                                 t->hardFailedSpeculations +
                                 t->softFailedSpeculations;
  if (totalSections <= 0)
    return;

  kmp_safe_raii_file_t statsFile;
  if (strcmp(__kmp_speculative_statsfile, "-") == 0) {
    statsFile.set_stdout();
  } else {
    size_t buffLen = KMP_STRLEN(__kmp_speculative_statsfile) + 20;
    char buffer[buffLen];
    KMP_SNPRINTF(&buffer[0], buffLen, __kmp_speculative_statsfile,
                 (kmp_int32)getpid());
    statsFile.open(buffer, "w");
  }

  fprintf(statsFile, "Speculative lock statistics (all approximate!)\n");
  fprintf(statsFile,
          " Lock parameters: \n"
          "   max_soft_retries               : %10d\n"
          "   max_badness                    : %10d\n",
          __kmp_adaptive_backoff_params.max_soft_retries,
          __kmp_adaptive_backoff_params.max_badness);
  fprintf(statsFile, " Non-speculative acquire attempts : %10d\n",
          t->nonSpeculativeAcquireAttempts);
  fprintf(statsFile, " Total critical sections          : %10d\n",
          totalSections);
  fprintf(statsFile, " Successful speculations          : %10d (%5.1f%%)\n",
          t->successfulSpeculations,
          percent(t->successfulSpeculations, totalSections));
  fprintf(statsFile, " Non-speculative acquires         : %10d (%5.1f%%)\n",
          t->nonSpeculativeAcquires,
          percent(t->nonSpeculativeAcquires, totalSections));
  fprintf(statsFile, " Lemming yields                   : %10d\n\n",
          t->lemmingYields);

  fprintf(statsFile, " Speculative acquire attempts     : %10d\n",
          totalSpeculations);
  fprintf(statsFile, " Successes                        : %10d (%5.1f%%)\n",
          t->successfulSpeculations,
          percent(t->successfulSpeculations, totalSpeculations));
  fprintf(statsFile, " Soft failures                    : %10d (%5.1f%%)\n",
          t->softFailedSpeculations,
          percent(t->softFailedSpeculations, totalSpeculations));
  fprintf(statsFile, " Hard failures                    : %10d (%5.1f%%)\n",
          t->hardFailedSpeculations,
          percent(t->hardFailedSpeculations, totalSpeculations));
}

#define KMP_INC_STAT(lck, stat) (lck->lk.adaptive.stats.stat++)
#else
#define KMP_INC_STAT(lck, stat)

#endif // KMP_DEBUG_ADAPTIVE_LOCKS

static inline bool __kmp_is_unlocked_queuing_lock(kmp_queuing_lock_t *lck) {
  // It is enough to check that the head_id is zero.
  // We don't also need to check the tail.
  bool res = lck->lk.head_id == 0;

// We need a fence here, since we must ensure that no memory operations
// from later in this thread float above that read.
#if KMP_COMPILER_ICC
  _mm_mfence();
#else
  __sync_synchronize();
#endif

  return res;
}

// Functions for manipulating the badness
static __inline void
__kmp_update_badness_after_success(kmp_adaptive_lock_t *lck) {
  // Reset the badness to zero so we eagerly try to speculate again
  lck->lk.adaptive.badness = 0;
  KMP_INC_STAT(lck, successfulSpeculations);
}

// Create a bit mask with one more set bit.
static __inline void __kmp_step_badness(kmp_adaptive_lock_t *lck) {
  kmp_uint32 newBadness = (lck->lk.adaptive.badness << 1) | 1;
  if (newBadness > lck->lk.adaptive.max_badness) {
    return;
  } else {
    lck->lk.adaptive.badness = newBadness;
  }
}

// Check whether speculation should be attempted.
KMP_ATTRIBUTE_TARGET_RTM
static __inline int __kmp_should_speculate(kmp_adaptive_lock_t *lck,
                                           kmp_int32 gtid) {
  kmp_uint32 badness = lck->lk.adaptive.badness;
  kmp_uint32 attempts = lck->lk.adaptive.acquire_attempts;
  int res = (attempts & badness) == 0;
  return res;
}

// Attempt to acquire only the speculative lock.
// Does not back off to the non-speculative lock.
KMP_ATTRIBUTE_TARGET_RTM
static int __kmp_test_adaptive_lock_only(kmp_adaptive_lock_t *lck,
                                         kmp_int32 gtid) {
  int retries = lck->lk.adaptive.max_soft_retries;

  // We don't explicitly count the start of speculation, rather we record the
  // results (success, hard fail, soft fail). The sum of all of those is the
  // total number of times we started speculation since all speculations must
  // end one of those ways.
  do {
    kmp_uint32 status = _xbegin();
    // Switch this in to disable actual speculation but exercise at least some
    // of the rest of the code. Useful for debugging...
    // kmp_uint32 status = _XABORT_NESTED;

    if (status == _XBEGIN_STARTED) {
      /* We have successfully started speculation. Check that no-one acquired
         the lock for real between when we last looked and now. This also gets
         the lock cache line into our read-set, which we need so that we'll
         abort if anyone later claims it for real. */
      if (!__kmp_is_unlocked_queuing_lock(GET_QLK_PTR(lck))) {
        // Lock is now visibly acquired, so someone beat us to it. Abort the
        // transaction so we'll restart from _xbegin with the failure status.
        _xabort(0x01);
        KMP_ASSERT2(0, "should not get here");
      }
      return 1; // Lock has been acquired (speculatively)
    } else {
      // We have aborted, update the statistics
      if (status & SOFT_ABORT_MASK) {
        KMP_INC_STAT(lck, softFailedSpeculations);
        // and loop round to retry.
      } else {
        KMP_INC_STAT(lck, hardFailedSpeculations);
        // Give up if we had a hard failure.
        break;
      }
    }
  } while (retries--); // Loop while we have retries, and didn't fail hard.

  // Either we had a hard failure or we didn't succeed softly after
  // the full set of attempts, so back off the badness.
  __kmp_step_badness(lck);
  return 0;
}

// Attempt to acquire the speculative lock, or back off to the non-speculative
// one if the speculative lock cannot be acquired.
// We can succeed speculatively, non-speculatively, or fail.
static int __kmp_test_adaptive_lock(kmp_adaptive_lock_t *lck, kmp_int32 gtid) {
  // First try to acquire the lock speculatively
  if (__kmp_should_speculate(lck, gtid) &&
      __kmp_test_adaptive_lock_only(lck, gtid))
    return 1;

  // Speculative acquisition failed, so try to acquire it non-speculatively.
  // Count the non-speculative acquire attempt
  lck->lk.adaptive.acquire_attempts++;

  // Use base, non-speculative lock.
  if (__kmp_test_queuing_lock(GET_QLK_PTR(lck), gtid)) {
    KMP_INC_STAT(lck, nonSpeculativeAcquires);
    return 1; // Lock is acquired (non-speculatively)
  } else {
    return 0; // Failed to acquire the lock, it's already visibly locked.
  }
}

static int __kmp_test_adaptive_lock_with_checks(kmp_adaptive_lock_t *lck,
                                                kmp_int32 gtid) {
  char const *const func = "omp_test_lock";
  if (lck->lk.qlk.initialized != GET_QLK_PTR(lck)) {
    KMP_FATAL(LockIsUninitialized, func);
  }

  int retval = __kmp_test_adaptive_lock(lck, gtid);

  if (retval) {
    lck->lk.qlk.owner_id = gtid + 1;
  }
  return retval;
}

// Block until we can acquire a speculative, adaptive lock. We check whether we
// should be trying to speculate. If we should be, we check the real lock to see
// if it is free, and, if not, pause without attempting to acquire it until it
// is. Then we try the speculative acquire. This means that although we suffer
// from lemmings a little (because all we can't acquire the lock speculatively
// until the queue of threads waiting has cleared), we don't get into a state
// where we can never acquire the lock speculatively (because we force the queue
// to clear by preventing new arrivals from entering the queue). This does mean
// that when we're trying to break lemmings, the lock is no longer fair. However
// OpenMP makes no guarantee that its locks are fair, so this isn't a real
// problem.
static void __kmp_acquire_adaptive_lock(kmp_adaptive_lock_t *lck,
                                        kmp_int32 gtid) {
  if (__kmp_should_speculate(lck, gtid)) {
    if (__kmp_is_unlocked_queuing_lock(GET_QLK_PTR(lck))) {
      if (__kmp_test_adaptive_lock_only(lck, gtid))
        return;
      // We tried speculation and failed, so give up.
    } else {
      // We can't try speculation until the lock is free, so we pause here
      // (without suspending on the queueing lock, to allow it to drain, then
      // try again. All other threads will also see the same result for
      // shouldSpeculate, so will be doing the same if they try to claim the
      // lock from now on.
      while (!__kmp_is_unlocked_queuing_lock(GET_QLK_PTR(lck))) {
        KMP_INC_STAT(lck, lemmingYields);
        KMP_YIELD(TRUE);
      }

      if (__kmp_test_adaptive_lock_only(lck, gtid))
        return;
    }
  }

  // Speculative acquisition failed, so acquire it non-speculatively.
  // Count the non-speculative acquire attempt
  lck->lk.adaptive.acquire_attempts++;

  __kmp_acquire_queuing_lock_timed_template<FALSE>(GET_QLK_PTR(lck), gtid);
  // We have acquired the base lock, so count that.
  KMP_INC_STAT(lck, nonSpeculativeAcquires);
}

static void __kmp_acquire_adaptive_lock_with_checks(kmp_adaptive_lock_t *lck,
                                                    kmp_int32 gtid) {
  char const *const func = "omp_set_lock";
  if (lck->lk.qlk.initialized != GET_QLK_PTR(lck)) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (__kmp_get_queuing_lock_owner(GET_QLK_PTR(lck)) == gtid) {
    KMP_FATAL(LockIsAlreadyOwned, func);
  }

  __kmp_acquire_adaptive_lock(lck, gtid);

  lck->lk.qlk.owner_id = gtid + 1;
}

KMP_ATTRIBUTE_TARGET_RTM
static int __kmp_release_adaptive_lock(kmp_adaptive_lock_t *lck,
                                       kmp_int32 gtid) {
  if (__kmp_is_unlocked_queuing_lock(GET_QLK_PTR(
          lck))) { // If the lock doesn't look claimed we must be speculating.
    // (Or the user's code is buggy and they're releasing without locking;
    // if we had XTEST we'd be able to check that case...)
    _xend(); // Exit speculation
    __kmp_update_badness_after_success(lck);
  } else { // Since the lock *is* visibly locked we're not speculating,
    // so should use the underlying lock's release scheme.
    __kmp_release_queuing_lock(GET_QLK_PTR(lck), gtid);
  }
  return KMP_LOCK_RELEASED;
}

static int __kmp_release_adaptive_lock_with_checks(kmp_adaptive_lock_t *lck,
                                                   kmp_int32 gtid) {
  char const *const func = "omp_unset_lock";
  KMP_MB(); /* in case another processor initialized lock */
  if (lck->lk.qlk.initialized != GET_QLK_PTR(lck)) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (__kmp_get_queuing_lock_owner(GET_QLK_PTR(lck)) == -1) {
    KMP_FATAL(LockUnsettingFree, func);
  }
  if (__kmp_get_queuing_lock_owner(GET_QLK_PTR(lck)) != gtid) {
    KMP_FATAL(LockUnsettingSetByAnother, func);
  }
  lck->lk.qlk.owner_id = 0;
  __kmp_release_adaptive_lock(lck, gtid);
  return KMP_LOCK_RELEASED;
}

static void __kmp_init_adaptive_lock(kmp_adaptive_lock_t *lck) {
  __kmp_init_queuing_lock(GET_QLK_PTR(lck));
  lck->lk.adaptive.badness = 0;
  lck->lk.adaptive.acquire_attempts = 0; // nonSpeculativeAcquireAttempts = 0;
  lck->lk.adaptive.max_soft_retries =
      __kmp_adaptive_backoff_params.max_soft_retries;
  lck->lk.adaptive.max_badness = __kmp_adaptive_backoff_params.max_badness;
#if KMP_DEBUG_ADAPTIVE_LOCKS
  __kmp_zero_speculative_stats(&lck->lk.adaptive);
#endif
  KA_TRACE(1000, ("__kmp_init_adaptive_lock: lock %p initialized\n", lck));
}

static void __kmp_destroy_adaptive_lock(kmp_adaptive_lock_t *lck) {
#if KMP_DEBUG_ADAPTIVE_LOCKS
  __kmp_accumulate_speculative_stats(&lck->lk.adaptive);
#endif
  __kmp_destroy_queuing_lock(GET_QLK_PTR(lck));
  // Nothing needed for the speculative part.
}

static void __kmp_destroy_adaptive_lock_with_checks(kmp_adaptive_lock_t *lck) {
  char const *const func = "omp_destroy_lock";
  if (lck->lk.qlk.initialized != GET_QLK_PTR(lck)) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (__kmp_get_queuing_lock_owner(GET_QLK_PTR(lck)) != -1) {
    KMP_FATAL(LockStillOwned, func);
  }
  __kmp_destroy_adaptive_lock(lck);
}

#endif // KMP_USE_ADAPTIVE_LOCKS

/* ------------------------------------------------------------------------ */
/* DRDPA ticket locks                                                */
/* "DRDPA" means Dynamically Reconfigurable Distributed Polling Area */

static kmp_int32 __kmp_get_drdpa_lock_owner(kmp_drdpa_lock_t *lck) {
  return lck->lk.owner_id - 1;
}

static inline bool __kmp_is_drdpa_lock_nestable(kmp_drdpa_lock_t *lck) {
  return lck->lk.depth_locked != -1;
}

__forceinline static int
__kmp_acquire_drdpa_lock_timed_template(kmp_drdpa_lock_t *lck, kmp_int32 gtid) {
  kmp_uint64 ticket = KMP_ATOMIC_INC(&lck->lk.next_ticket);
  kmp_uint64 mask = lck->lk.mask; // atomic load
  std::atomic<kmp_uint64> *polls = lck->lk.polls;

#ifdef USE_LOCK_PROFILE
  if (polls[ticket & mask] != ticket)
    __kmp_printf("LOCK CONTENTION: %p\n", lck);
/* else __kmp_printf( "." );*/
#endif /* USE_LOCK_PROFILE */

  // Now spin-wait, but reload the polls pointer and mask, in case the
  // polling area has been reconfigured.  Unless it is reconfigured, the
  // reloads stay in L1 cache and are cheap.
  //
  // Keep this code in sync with KMP_WAIT, in kmp_dispatch.cpp !!!
  // The current implementation of KMP_WAIT doesn't allow for mask
  // and poll to be re-read every spin iteration.
  kmp_uint32 spins;
  KMP_FSYNC_PREPARE(lck);
  KMP_INIT_YIELD(spins);
  while (polls[ticket & mask] < ticket) { // atomic load
    KMP_YIELD_OVERSUB_ELSE_SPIN(spins);
    // Re-read the mask and the poll pointer from the lock structure.
    //
    // Make certain that "mask" is read before "polls" !!!
    //
    // If another thread picks reconfigures the polling area and updates their
    // values, and we get the new value of mask and the old polls pointer, we
    // could access memory beyond the end of the old polling area.
    mask = lck->lk.mask; // atomic load
    polls = lck->lk.polls; // atomic load
  }

  // Critical section starts here
  KMP_FSYNC_ACQUIRED(lck);
  KA_TRACE(1000, ("__kmp_acquire_drdpa_lock: ticket #%lld acquired lock %p\n",
                  ticket, lck));
  lck->lk.now_serving = ticket; // non-volatile store

  // Deallocate a garbage polling area if we know that we are the last
  // thread that could possibly access it.
  //
  // The >= check is in case __kmp_test_drdpa_lock() allocated the cleanup
  // ticket.
  if ((lck->lk.old_polls != NULL) && (ticket >= lck->lk.cleanup_ticket)) {
    __kmp_free(lck->lk.old_polls);
    lck->lk.old_polls = NULL;
    lck->lk.cleanup_ticket = 0;
  }

  // Check to see if we should reconfigure the polling area.
  // If there is still a garbage polling area to be deallocated from a
  // previous reconfiguration, let a later thread reconfigure it.
  if (lck->lk.old_polls == NULL) {
    bool reconfigure = false;
    std::atomic<kmp_uint64> *old_polls = polls;
    kmp_uint32 num_polls = TCR_4(lck->lk.num_polls);

    if (TCR_4(__kmp_nth) >
        (__kmp_avail_proc ? __kmp_avail_proc : __kmp_xproc)) {
      // We are in oversubscription mode.  Contract the polling area
      // down to a single location, if that hasn't been done already.
      if (num_polls > 1) {
        reconfigure = true;
        num_polls = TCR_4(lck->lk.num_polls);
        mask = 0;
        num_polls = 1;
        polls = (std::atomic<kmp_uint64> *)__kmp_allocate(num_polls *
                                                          sizeof(*polls));
        polls[0] = ticket;
      }
    } else {
      // We are in under/fully subscribed mode.  Check the number of
      // threads waiting on the lock.  The size of the polling area
      // should be at least the number of threads waiting.
      kmp_uint64 num_waiting = TCR_8(lck->lk.next_ticket) - ticket - 1;
      if (num_waiting > num_polls) {
        kmp_uint32 old_num_polls = num_polls;
        reconfigure = true;
        do {
          mask = (mask << 1) | 1;
          num_polls *= 2;
        } while (num_polls <= num_waiting);

        // Allocate the new polling area, and copy the relevant portion
        // of the old polling area to the new area.  __kmp_allocate()
        // zeroes the memory it allocates, and most of the old area is
        // just zero padding, so we only copy the release counters.
        polls = (std::atomic<kmp_uint64> *)__kmp_allocate(num_polls *
                                                          sizeof(*polls));
        kmp_uint32 i;
        for (i = 0; i < old_num_polls; i++) {
          polls[i].store(old_polls[i]);
        }
      }
    }

    if (reconfigure) {
      // Now write the updated fields back to the lock structure.
      //
      // Make certain that "polls" is written before "mask" !!!
      //
      // If another thread picks up the new value of mask and the old polls
      // pointer , it could access memory beyond the end of the old polling
      // area.
      //
      // On x86, we need memory fences.
      KA_TRACE(1000, ("__kmp_acquire_drdpa_lock: ticket #%lld reconfiguring "
                      "lock %p to %d polls\n",
                      ticket, lck, num_polls));

      lck->lk.old_polls = old_polls;
      lck->lk.polls = polls; // atomic store

      KMP_MB();

      lck->lk.num_polls = num_polls;
      lck->lk.mask = mask; // atomic store

      KMP_MB();

      // Only after the new polling area and mask have been flushed
      // to main memory can we update the cleanup ticket field.
      //
      // volatile load / non-volatile store
      lck->lk.cleanup_ticket = lck->lk.next_ticket;
    }
  }
  return KMP_LOCK_ACQUIRED_FIRST;
}

int __kmp_acquire_drdpa_lock(kmp_drdpa_lock_t *lck, kmp_int32 gtid) {
  int retval = __kmp_acquire_drdpa_lock_timed_template(lck, gtid);
  return retval;
}

static int __kmp_acquire_drdpa_lock_with_checks(kmp_drdpa_lock_t *lck,
                                                kmp_int32 gtid) {
  char const *const func = "omp_set_lock";
  if (lck->lk.initialized != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (__kmp_is_drdpa_lock_nestable(lck)) {
    KMP_FATAL(LockNestableUsedAsSimple, func);
  }
  if ((gtid >= 0) && (__kmp_get_drdpa_lock_owner(lck) == gtid)) {
    KMP_FATAL(LockIsAlreadyOwned, func);
  }

  __kmp_acquire_drdpa_lock(lck, gtid);

  lck->lk.owner_id = gtid + 1;
  return KMP_LOCK_ACQUIRED_FIRST;
}

int __kmp_test_drdpa_lock(kmp_drdpa_lock_t *lck, kmp_int32 gtid) {
  // First get a ticket, then read the polls pointer and the mask.
  // The polls pointer must be read before the mask!!! (See above)
  kmp_uint64 ticket = lck->lk.next_ticket; // atomic load
  std::atomic<kmp_uint64> *polls = lck->lk.polls;
  kmp_uint64 mask = lck->lk.mask; // atomic load
  if (polls[ticket & mask] == ticket) {
    kmp_uint64 next_ticket = ticket + 1;
    if (__kmp_atomic_compare_store_acq(&lck->lk.next_ticket, ticket,
                                       next_ticket)) {
      KMP_FSYNC_ACQUIRED(lck);
      KA_TRACE(1000, ("__kmp_test_drdpa_lock: ticket #%lld acquired lock %p\n",
                      ticket, lck));
      lck->lk.now_serving = ticket; // non-volatile store

      // Since no threads are waiting, there is no possibility that we would
      // want to reconfigure the polling area.  We might have the cleanup ticket
      // value (which says that it is now safe to deallocate old_polls), but
      // we'll let a later thread which calls __kmp_acquire_lock do that - this
      // routine isn't supposed to block, and we would risk blocks if we called
      // __kmp_free() to do the deallocation.
      return TRUE;
    }
  }
  return FALSE;
}

static int __kmp_test_drdpa_lock_with_checks(kmp_drdpa_lock_t *lck,
                                             kmp_int32 gtid) {
  char const *const func = "omp_test_lock";
  if (lck->lk.initialized != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (__kmp_is_drdpa_lock_nestable(lck)) {
    KMP_FATAL(LockNestableUsedAsSimple, func);
  }

  int retval = __kmp_test_drdpa_lock(lck, gtid);

  if (retval) {
    lck->lk.owner_id = gtid + 1;
  }
  return retval;
}

int __kmp_release_drdpa_lock(kmp_drdpa_lock_t *lck, kmp_int32 gtid) {
  // Read the ticket value from the lock data struct, then the polls pointer and
  // the mask.  The polls pointer must be read before the mask!!! (See above)
  kmp_uint64 ticket = lck->lk.now_serving + 1; // non-atomic load
  std::atomic<kmp_uint64> *polls = lck->lk.polls; // atomic load
  kmp_uint64 mask = lck->lk.mask; // atomic load
  KA_TRACE(1000, ("__kmp_release_drdpa_lock: ticket #%lld released lock %p\n",
                  ticket - 1, lck));
  KMP_FSYNC_RELEASING(lck);
  polls[ticket & mask] = ticket; // atomic store
  return KMP_LOCK_RELEASED;
}

static int __kmp_release_drdpa_lock_with_checks(kmp_drdpa_lock_t *lck,
                                                kmp_int32 gtid) {
  char const *const func = "omp_unset_lock";
  KMP_MB(); /* in case another processor initialized lock */
  if (lck->lk.initialized != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (__kmp_is_drdpa_lock_nestable(lck)) {
    KMP_FATAL(LockNestableUsedAsSimple, func);
  }
  if (__kmp_get_drdpa_lock_owner(lck) == -1) {
    KMP_FATAL(LockUnsettingFree, func);
  }
  if ((gtid >= 0) && (__kmp_get_drdpa_lock_owner(lck) >= 0) &&
      (__kmp_get_drdpa_lock_owner(lck) != gtid)) {
    KMP_FATAL(LockUnsettingSetByAnother, func);
  }
  lck->lk.owner_id = 0;
  return __kmp_release_drdpa_lock(lck, gtid);
}

void __kmp_init_drdpa_lock(kmp_drdpa_lock_t *lck) {
  lck->lk.location = NULL;
  lck->lk.mask = 0;
  lck->lk.num_polls = 1;
  lck->lk.polls = (std::atomic<kmp_uint64> *)__kmp_allocate(
      lck->lk.num_polls * sizeof(*(lck->lk.polls)));
  lck->lk.cleanup_ticket = 0;
  lck->lk.old_polls = NULL;
  lck->lk.next_ticket = 0;
  lck->lk.now_serving = 0;
  lck->lk.owner_id = 0; // no thread owns the lock.
  lck->lk.depth_locked = -1; // >= 0 for nestable locks, -1 for simple locks.
  lck->lk.initialized = lck;

  KA_TRACE(1000, ("__kmp_init_drdpa_lock: lock %p initialized\n", lck));
}

void __kmp_destroy_drdpa_lock(kmp_drdpa_lock_t *lck) {
  lck->lk.initialized = NULL;
  lck->lk.location = NULL;
  if (lck->lk.polls.load() != NULL) {
    __kmp_free(lck->lk.polls.load());
    lck->lk.polls = NULL;
  }
  if (lck->lk.old_polls != NULL) {
    __kmp_free(lck->lk.old_polls);
    lck->lk.old_polls = NULL;
  }
  lck->lk.mask = 0;
  lck->lk.num_polls = 0;
  lck->lk.cleanup_ticket = 0;
  lck->lk.next_ticket = 0;
  lck->lk.now_serving = 0;
  lck->lk.owner_id = 0;
  lck->lk.depth_locked = -1;
}

static void __kmp_destroy_drdpa_lock_with_checks(kmp_drdpa_lock_t *lck) {
  char const *const func = "omp_destroy_lock";
  if (lck->lk.initialized != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (__kmp_is_drdpa_lock_nestable(lck)) {
    KMP_FATAL(LockNestableUsedAsSimple, func);
  }
  if (__kmp_get_drdpa_lock_owner(lck) != -1) {
    KMP_FATAL(LockStillOwned, func);
  }
  __kmp_destroy_drdpa_lock(lck);
}

// nested drdpa ticket locks

int __kmp_acquire_nested_drdpa_lock(kmp_drdpa_lock_t *lck, kmp_int32 gtid) {
  KMP_DEBUG_ASSERT(gtid >= 0);

  if (__kmp_get_drdpa_lock_owner(lck) == gtid) {
    lck->lk.depth_locked += 1;
    return KMP_LOCK_ACQUIRED_NEXT;
  } else {
    __kmp_acquire_drdpa_lock_timed_template(lck, gtid);
    KMP_MB();
    lck->lk.depth_locked = 1;
    KMP_MB();
    lck->lk.owner_id = gtid + 1;
    return KMP_LOCK_ACQUIRED_FIRST;
  }
}

static void __kmp_acquire_nested_drdpa_lock_with_checks(kmp_drdpa_lock_t *lck,
                                                        kmp_int32 gtid) {
  char const *const func = "omp_set_nest_lock";
  if (lck->lk.initialized != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (!__kmp_is_drdpa_lock_nestable(lck)) {
    KMP_FATAL(LockSimpleUsedAsNestable, func);
  }
  __kmp_acquire_nested_drdpa_lock(lck, gtid);
}

int __kmp_test_nested_drdpa_lock(kmp_drdpa_lock_t *lck, kmp_int32 gtid) {
  int retval;

  KMP_DEBUG_ASSERT(gtid >= 0);

  if (__kmp_get_drdpa_lock_owner(lck) == gtid) {
    retval = ++lck->lk.depth_locked;
  } else if (!__kmp_test_drdpa_lock(lck, gtid)) {
    retval = 0;
  } else {
    KMP_MB();
    retval = lck->lk.depth_locked = 1;
    KMP_MB();
    lck->lk.owner_id = gtid + 1;
  }
  return retval;
}

static int __kmp_test_nested_drdpa_lock_with_checks(kmp_drdpa_lock_t *lck,
                                                    kmp_int32 gtid) {
  char const *const func = "omp_test_nest_lock";
  if (lck->lk.initialized != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (!__kmp_is_drdpa_lock_nestable(lck)) {
    KMP_FATAL(LockSimpleUsedAsNestable, func);
  }
  return __kmp_test_nested_drdpa_lock(lck, gtid);
}

int __kmp_release_nested_drdpa_lock(kmp_drdpa_lock_t *lck, kmp_int32 gtid) {
  KMP_DEBUG_ASSERT(gtid >= 0);

  KMP_MB();
  if (--(lck->lk.depth_locked) == 0) {
    KMP_MB();
    lck->lk.owner_id = 0;
    __kmp_release_drdpa_lock(lck, gtid);
    return KMP_LOCK_RELEASED;
  }
  return KMP_LOCK_STILL_HELD;
}

static int __kmp_release_nested_drdpa_lock_with_checks(kmp_drdpa_lock_t *lck,
                                                       kmp_int32 gtid) {
  char const *const func = "omp_unset_nest_lock";
  KMP_MB(); /* in case another processor initialized lock */
  if (lck->lk.initialized != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (!__kmp_is_drdpa_lock_nestable(lck)) {
    KMP_FATAL(LockSimpleUsedAsNestable, func);
  }
  if (__kmp_get_drdpa_lock_owner(lck) == -1) {
    KMP_FATAL(LockUnsettingFree, func);
  }
  if (__kmp_get_drdpa_lock_owner(lck) != gtid) {
    KMP_FATAL(LockUnsettingSetByAnother, func);
  }
  return __kmp_release_nested_drdpa_lock(lck, gtid);
}

void __kmp_init_nested_drdpa_lock(kmp_drdpa_lock_t *lck) {
  __kmp_init_drdpa_lock(lck);
  lck->lk.depth_locked = 0; // >= 0 for nestable locks, -1 for simple locks
}

void __kmp_destroy_nested_drdpa_lock(kmp_drdpa_lock_t *lck) {
  __kmp_destroy_drdpa_lock(lck);
  lck->lk.depth_locked = 0;
}

static void __kmp_destroy_nested_drdpa_lock_with_checks(kmp_drdpa_lock_t *lck) {
  char const *const func = "omp_destroy_nest_lock";
  if (lck->lk.initialized != lck) {
    KMP_FATAL(LockIsUninitialized, func);
  }
  if (!__kmp_is_drdpa_lock_nestable(lck)) {
    KMP_FATAL(LockSimpleUsedAsNestable, func);
  }
  if (__kmp_get_drdpa_lock_owner(lck) != -1) {
    KMP_FATAL(LockStillOwned, func);
  }
  __kmp_destroy_nested_drdpa_lock(lck);
}

// access functions to fields which don't exist for all lock kinds.

static const ident_t *__kmp_get_drdpa_lock_location(kmp_drdpa_lock_t *lck) {
  return lck->lk.location;
}

static void __kmp_set_drdpa_lock_location(kmp_drdpa_lock_t *lck,
                                          const ident_t *loc) {
  lck->lk.location = loc;
}

static kmp_lock_flags_t __kmp_get_drdpa_lock_flags(kmp_drdpa_lock_t *lck) {
  return lck->lk.flags;
}

static void __kmp_set_drdpa_lock_flags(kmp_drdpa_lock_t *lck,
                                       kmp_lock_flags_t flags) {
  lck->lk.flags = flags;
}

// Time stamp counter
#if KMP_ARCH_X86 || KMP_ARCH_X86_64
#define __kmp_tsc() __kmp_hardware_timestamp()
// Runtime's default backoff parameters
kmp_backoff_t __kmp_spin_backoff_params = {1, 4096, 100};
#else
// Use nanoseconds for other platforms
extern kmp_uint64 __kmp_now_nsec();
kmp_backoff_t __kmp_spin_backoff_params = {1, 256, 100};
#define __kmp_tsc() __kmp_now_nsec()
#endif

// A useful predicate for dealing with timestamps that may wrap.
// Is a before b? Since the timestamps may wrap, this is asking whether it's
// shorter to go clockwise from a to b around the clock-face, or anti-clockwise.
// Times where going clockwise is less distance than going anti-clockwise
// are in the future, others are in the past. e.g. a = MAX-1, b = MAX+1 (=0),
// then a > b (true) does not mean a reached b; whereas signed(a) = -2,
// signed(b) = 0 captures the actual difference
static inline bool before(kmp_uint64 a, kmp_uint64 b) {
  return ((kmp_int64)b - (kmp_int64)a) > 0;
}

// Truncated binary exponential backoff function
void __kmp_spin_backoff(kmp_backoff_t *boff) {
  // We could flatten this loop, but making it a nested loop gives better result
  kmp_uint32 i;
  for (i = boff->step; i > 0; i--) {
    kmp_uint64 goal = __kmp_tsc() + boff->min_tick;
    do {
      KMP_CPU_PAUSE();
    } while (before(__kmp_tsc(), goal));
  }
  boff->step = (boff->step << 1 | 1) & (boff->max_backoff - 1);
}

#if KMP_USE_DYNAMIC_LOCK

// Direct lock initializers. It simply writes a tag to the low 8 bits of the
// lock word.
static void __kmp_init_direct_lock(kmp_dyna_lock_t *lck,
                                   kmp_dyna_lockseq_t seq) {
  TCW_4(*lck, KMP_GET_D_TAG(seq));
  KA_TRACE(
      20,
      ("__kmp_init_direct_lock: initialized direct lock with type#%d\n", seq));
}

#if KMP_USE_TSX

// HLE lock functions - imported from the testbed runtime.
#define HLE_ACQUIRE ".byte 0xf2;"
#define HLE_RELEASE ".byte 0xf3;"

static inline kmp_uint32 swap4(kmp_uint32 volatile *p, kmp_uint32 v) {
  __asm__ volatile(HLE_ACQUIRE "xchg %1,%0" : "+r"(v), "+m"(*p) : : "memory");
  return v;
}

static void __kmp_destroy_hle_lock(kmp_dyna_lock_t *lck) { TCW_4(*lck, 0); }

static void __kmp_destroy_hle_lock_with_checks(kmp_dyna_lock_t *lck) {
  TCW_4(*lck, 0);
}

static void __kmp_acquire_hle_lock(kmp_dyna_lock_t *lck, kmp_int32 gtid) {
  // Use gtid for KMP_LOCK_BUSY if necessary
  if (swap4(lck, KMP_LOCK_BUSY(1, hle)) != KMP_LOCK_FREE(hle)) {
    int delay = 1;
    do {
      while (*(kmp_uint32 volatile *)lck != KMP_LOCK_FREE(hle)) {
        for (int i = delay; i != 0; --i)
          KMP_CPU_PAUSE();
        delay = ((delay << 1) | 1) & 7;
      }
    } while (swap4(lck, KMP_LOCK_BUSY(1, hle)) != KMP_LOCK_FREE(hle));
  }
}

static void __kmp_acquire_hle_lock_with_checks(kmp_dyna_lock_t *lck,
                                               kmp_int32 gtid) {
  __kmp_acquire_hle_lock(lck, gtid); // TODO: add checks
}

static int __kmp_release_hle_lock(kmp_dyna_lock_t *lck, kmp_int32 gtid) {
  __asm__ volatile(HLE_RELEASE "movl %1,%0"
                   : "=m"(*lck)
                   : "r"(KMP_LOCK_FREE(hle))
                   : "memory");
  return KMP_LOCK_RELEASED;
}

static int __kmp_release_hle_lock_with_checks(kmp_dyna_lock_t *lck,
                                              kmp_int32 gtid) {
  return __kmp_release_hle_lock(lck, gtid); // TODO: add checks
}

static int __kmp_test_hle_lock(kmp_dyna_lock_t *lck, kmp_int32 gtid) {
  return swap4(lck, KMP_LOCK_BUSY(1, hle)) == KMP_LOCK_FREE(hle);
}

static int __kmp_test_hle_lock_with_checks(kmp_dyna_lock_t *lck,
                                           kmp_int32 gtid) {
  return __kmp_test_hle_lock(lck, gtid); // TODO: add checks
}

static void __kmp_init_rtm_queuing_lock(kmp_queuing_lock_t *lck) {
  __kmp_init_queuing_lock(lck);
}

static void __kmp_destroy_rtm_queuing_lock(kmp_queuing_lock_t *lck) {
  __kmp_destroy_queuing_lock(lck);
}

static void
__kmp_destroy_rtm_queuing_lock_with_checks(kmp_queuing_lock_t *lck) {
  __kmp_destroy_queuing_lock_with_checks(lck);
}

KMP_ATTRIBUTE_TARGET_RTM
static void __kmp_acquire_rtm_queuing_lock(kmp_queuing_lock_t *lck,
                                           kmp_int32 gtid) {
  unsigned retries = 3, status;
  do {
    status = _xbegin();
    if (status == _XBEGIN_STARTED) {
      if (__kmp_is_unlocked_queuing_lock(lck))
        return;
      _xabort(0xff);
    }
    if ((status & _XABORT_EXPLICIT) && _XABORT_CODE(status) == 0xff) {
      // Wait until lock becomes free
      while (!__kmp_is_unlocked_queuing_lock(lck)) {
        KMP_YIELD(TRUE);
      }
    } else if (!(status & _XABORT_RETRY))
      break;
  } while (retries--);

  // Fall-back non-speculative lock (xchg)
  __kmp_acquire_queuing_lock(lck, gtid);
}

static void __kmp_acquire_rtm_queuing_lock_with_checks(kmp_queuing_lock_t *lck,
                                                       kmp_int32 gtid) {
  __kmp_acquire_rtm_queuing_lock(lck, gtid);
}

KMP_ATTRIBUTE_TARGET_RTM
static int __kmp_release_rtm_queuing_lock(kmp_queuing_lock_t *lck,
                                          kmp_int32 gtid) {
  if (__kmp_is_unlocked_queuing_lock(lck)) {
    // Releasing from speculation
    _xend();
  } else {
    // Releasing from a real lock
    __kmp_release_queuing_lock(lck, gtid);
  }
  return KMP_LOCK_RELEASED;
}

static int __kmp_release_rtm_queuing_lock_with_checks(kmp_queuing_lock_t *lck,
                                                      kmp_int32 gtid) {
  return __kmp_release_rtm_queuing_lock(lck, gtid);
}

KMP_ATTRIBUTE_TARGET_RTM
static int __kmp_test_rtm_queuing_lock(kmp_queuing_lock_t *lck,
                                       kmp_int32 gtid) {
  unsigned retries = 3, status;
  do {
    status = _xbegin();
    if (status == _XBEGIN_STARTED && __kmp_is_unlocked_queuing_lock(lck)) {
      return 1;
    }
    if (!(status & _XABORT_RETRY))
      break;
  } while (retries--);

  return __kmp_test_queuing_lock(lck, gtid);
}

static int __kmp_test_rtm_queuing_lock_with_checks(kmp_queuing_lock_t *lck,
                                                   kmp_int32 gtid) {
  return __kmp_test_rtm_queuing_lock(lck, gtid);
}

// Reuse kmp_tas_lock_t for TSX lock which use RTM with fall-back spin lock.
typedef kmp_tas_lock_t kmp_rtm_spin_lock_t;

static void __kmp_destroy_rtm_spin_lock(kmp_rtm_spin_lock_t *lck) {
  KMP_ATOMIC_ST_REL(&lck->lk.poll, 0);
}

static void __kmp_destroy_rtm_spin_lock_with_checks(kmp_rtm_spin_lock_t *lck) {
  __kmp_destroy_rtm_spin_lock(lck);
}

KMP_ATTRIBUTE_TARGET_RTM
static int __kmp_acquire_rtm_spin_lock(kmp_rtm_spin_lock_t *lck,
                                       kmp_int32 gtid) {
  unsigned retries = 3, status;
  kmp_int32 lock_free = KMP_LOCK_FREE(rtm_spin);
  kmp_int32 lock_busy = KMP_LOCK_BUSY(1, rtm_spin);
  do {
    status = _xbegin();
    if (status == _XBEGIN_STARTED) {
      if (KMP_ATOMIC_LD_RLX(&lck->lk.poll) == lock_free)
        return KMP_LOCK_ACQUIRED_FIRST;
      _xabort(0xff);
    }
    if ((status & _XABORT_EXPLICIT) && _XABORT_CODE(status) == 0xff) {
      // Wait until lock becomes free
      while (KMP_ATOMIC_LD_RLX(&lck->lk.poll) != lock_free) {
        KMP_YIELD(TRUE);
      }
    } else if (!(status & _XABORT_RETRY))
      break;
  } while (retries--);

  // Fall-back spin lock
  KMP_FSYNC_PREPARE(lck);
  kmp_backoff_t backoff = __kmp_spin_backoff_params;
  while (KMP_ATOMIC_LD_RLX(&lck->lk.poll) != lock_free ||
         !__kmp_atomic_compare_store_acq(&lck->lk.poll, lock_free, lock_busy)) {
    __kmp_spin_backoff(&backoff);
  }
  KMP_FSYNC_ACQUIRED(lck);
  return KMP_LOCK_ACQUIRED_FIRST;
}

static int __kmp_acquire_rtm_spin_lock_with_checks(kmp_rtm_spin_lock_t *lck,
                                                   kmp_int32 gtid) {
  return __kmp_acquire_rtm_spin_lock(lck, gtid);
}

KMP_ATTRIBUTE_TARGET_RTM
static int __kmp_release_rtm_spin_lock(kmp_rtm_spin_lock_t *lck,
                                       kmp_int32 gtid) {
  if (KMP_ATOMIC_LD_RLX(&lck->lk.poll) == KMP_LOCK_FREE(rtm_spin)) {
    // Releasing from speculation
    _xend();
  } else {
    // Releasing from a real lock
    KMP_FSYNC_RELEASING(lck);
    KMP_ATOMIC_ST_REL(&lck->lk.poll, KMP_LOCK_FREE(rtm_spin));
  }
  return KMP_LOCK_RELEASED;
}

static int __kmp_release_rtm_spin_lock_with_checks(kmp_rtm_spin_lock_t *lck,
                                                   kmp_int32 gtid) {
  return __kmp_release_rtm_spin_lock(lck, gtid);
}

KMP_ATTRIBUTE_TARGET_RTM
static int __kmp_test_rtm_spin_lock(kmp_rtm_spin_lock_t *lck, kmp_int32 gtid) {
  unsigned retries = 3, status;
  kmp_int32 lock_free = KMP_LOCK_FREE(rtm_spin);
  kmp_int32 lock_busy = KMP_LOCK_BUSY(1, rtm_spin);
  do {
    status = _xbegin();
    if (status == _XBEGIN_STARTED &&
        KMP_ATOMIC_LD_RLX(&lck->lk.poll) == lock_free) {
      return TRUE;
    }
    if (!(status & _XABORT_RETRY))
      break;
  } while (retries--);

  if (KMP_ATOMIC_LD_RLX(&lck->lk.poll) == lock_free &&
      __kmp_atomic_compare_store_acq(&lck->lk.poll, lock_free, lock_busy)) {
    KMP_FSYNC_ACQUIRED(lck);
    return TRUE;
  }
  return FALSE;
}

static int __kmp_test_rtm_spin_lock_with_checks(kmp_rtm_spin_lock_t *lck,
                                                kmp_int32 gtid) {
  return __kmp_test_rtm_spin_lock(lck, gtid);
}

#endif // KMP_USE_TSX

// Entry functions for indirect locks (first element of direct lock jump tables)
static void __kmp_init_indirect_lock(kmp_dyna_lock_t *l,
                                     kmp_dyna_lockseq_t tag);
static void __kmp_destroy_indirect_lock(kmp_dyna_lock_t *lock);
static int __kmp_set_indirect_lock(kmp_dyna_lock_t *lock, kmp_int32);
static int __kmp_unset_indirect_lock(kmp_dyna_lock_t *lock, kmp_int32);
static int __kmp_test_indirect_lock(kmp_dyna_lock_t *lock, kmp_int32);
static int __kmp_set_indirect_lock_with_checks(kmp_dyna_lock_t *lock,
                                               kmp_int32);
static int __kmp_unset_indirect_lock_with_checks(kmp_dyna_lock_t *lock,
                                                 kmp_int32);
static int __kmp_test_indirect_lock_with_checks(kmp_dyna_lock_t *lock,
                                                kmp_int32);

// Lock function definitions for the union parameter type
#define KMP_FOREACH_LOCK_KIND(m, a) m(ticket, a) m(queuing, a) m(drdpa, a)

#define expand1(lk, op)                                                        \
  static void __kmp_##op##_##lk##_##lock(kmp_user_lock_p lock) {               \
    __kmp_##op##_##lk##_##lock(&lock->lk);                                     \
  }
#define expand2(lk, op)                                                        \
  static int __kmp_##op##_##lk##_##lock(kmp_user_lock_p lock,                  \
                                        kmp_int32 gtid) {                      \
    return __kmp_##op##_##lk##_##lock(&lock->lk, gtid);                        \
  }
#define expand3(lk, op)                                                        \
  static void __kmp_set_##lk##_##lock_flags(kmp_user_lock_p lock,              \
                                            kmp_lock_flags_t flags) {          \
    __kmp_set_##lk##_lock_flags(&lock->lk, flags);                             \
  }
#define expand4(lk, op)                                                        \
  static void __kmp_set_##lk##_##lock_location(kmp_user_lock_p lock,           \
                                               const ident_t *loc) {           \
    __kmp_set_##lk##_lock_location(&lock->lk, loc);                            \
  }

KMP_FOREACH_LOCK_KIND(expand1, init)
KMP_FOREACH_LOCK_KIND(expand1, init_nested)
KMP_FOREACH_LOCK_KIND(expand1, destroy)
KMP_FOREACH_LOCK_KIND(expand1, destroy_nested)
KMP_FOREACH_LOCK_KIND(expand2, acquire)
KMP_FOREACH_LOCK_KIND(expand2, acquire_nested)
KMP_FOREACH_LOCK_KIND(expand2, release)
KMP_FOREACH_LOCK_KIND(expand2, release_nested)
KMP_FOREACH_LOCK_KIND(expand2, test)
KMP_FOREACH_LOCK_KIND(expand2, test_nested)
KMP_FOREACH_LOCK_KIND(expand3, )
KMP_FOREACH_LOCK_KIND(expand4, )

#undef expand1
#undef expand2
#undef expand3
#undef expand4

// Jump tables for the indirect lock functions
// Only fill in the odd entries, that avoids the need to shift out the low bit

// init functions
#define expand(l, op) 0, __kmp_init_direct_lock,
void (*__kmp_direct_init[])(kmp_dyna_lock_t *, kmp_dyna_lockseq_t) = {
    __kmp_init_indirect_lock, 0, KMP_FOREACH_D_LOCK(expand, init)};
#undef expand

// destroy functions
#define expand(l, op) 0, (void (*)(kmp_dyna_lock_t *))__kmp_##op##_##l##_lock,
static void (*direct_destroy[])(kmp_dyna_lock_t *) = {
    __kmp_destroy_indirect_lock, 0, KMP_FOREACH_D_LOCK(expand, destroy)};
#undef expand
#define expand(l, op)                                                          \
  0, (void (*)(kmp_dyna_lock_t *))__kmp_destroy_##l##_lock_with_checks,
static void (*direct_destroy_check[])(kmp_dyna_lock_t *) = {
    __kmp_destroy_indirect_lock, 0, KMP_FOREACH_D_LOCK(expand, destroy)};
#undef expand

// set/acquire functions
#define expand(l, op)                                                          \
  0, (int (*)(kmp_dyna_lock_t *, kmp_int32))__kmp_##op##_##l##_lock,
static int (*direct_set[])(kmp_dyna_lock_t *, kmp_int32) = {
    __kmp_set_indirect_lock, 0, KMP_FOREACH_D_LOCK(expand, acquire)};
#undef expand
#define expand(l, op)                                                          \
  0, (int (*)(kmp_dyna_lock_t *, kmp_int32))__kmp_##op##_##l##_lock_with_checks,
static int (*direct_set_check[])(kmp_dyna_lock_t *, kmp_int32) = {
    __kmp_set_indirect_lock_with_checks, 0,
    KMP_FOREACH_D_LOCK(expand, acquire)};
#undef expand

// unset/release and test functions
#define expand(l, op)                                                          \
  0, (int (*)(kmp_dyna_lock_t *, kmp_int32))__kmp_##op##_##l##_lock,
static int (*direct_unset[])(kmp_dyna_lock_t *, kmp_int32) = {
    __kmp_unset_indirect_lock, 0, KMP_FOREACH_D_LOCK(expand, release)};
static int (*direct_test[])(kmp_dyna_lock_t *, kmp_int32) = {
    __kmp_test_indirect_lock, 0, KMP_FOREACH_D_LOCK(expand, test)};
#undef expand
#define expand(l, op)                                                          \
  0, (int (*)(kmp_dyna_lock_t *, kmp_int32))__kmp_##op##_##l##_lock_with_checks,
static int (*direct_unset_check[])(kmp_dyna_lock_t *, kmp_int32) = {
    __kmp_unset_indirect_lock_with_checks, 0,
    KMP_FOREACH_D_LOCK(expand, release)};
static int (*direct_test_check[])(kmp_dyna_lock_t *, kmp_int32) = {
    __kmp_test_indirect_lock_with_checks, 0, KMP_FOREACH_D_LOCK(expand, test)};
#undef expand

// Exposes only one set of jump tables (*lock or *lock_with_checks).
void (**__kmp_direct_destroy)(kmp_dyna_lock_t *) = 0;
int (**__kmp_direct_set)(kmp_dyna_lock_t *, kmp_int32) = 0;
int (**__kmp_direct_unset)(kmp_dyna_lock_t *, kmp_int32) = 0;
int (**__kmp_direct_test)(kmp_dyna_lock_t *, kmp_int32) = 0;

// Jump tables for the indirect lock functions
#define expand(l, op) (void (*)(kmp_user_lock_p)) __kmp_##op##_##l##_##lock,
void (*__kmp_indirect_init[])(kmp_user_lock_p) = {
    KMP_FOREACH_I_LOCK(expand, init)};
#undef expand

#define expand(l, op) (void (*)(kmp_user_lock_p)) __kmp_##op##_##l##_##lock,
static void (*indirect_destroy[])(kmp_user_lock_p) = {
    KMP_FOREACH_I_LOCK(expand, destroy)};
#undef expand
#define expand(l, op)                                                          \
  (void (*)(kmp_user_lock_p)) __kmp_##op##_##l##_##lock_with_checks,
static void (*indirect_destroy_check[])(kmp_user_lock_p) = {
    KMP_FOREACH_I_LOCK(expand, destroy)};
#undef expand

// set/acquire functions
#define expand(l, op)                                                          \
  (int (*)(kmp_user_lock_p, kmp_int32)) __kmp_##op##_##l##_##lock,
static int (*indirect_set[])(kmp_user_lock_p,
                             kmp_int32) = {KMP_FOREACH_I_LOCK(expand, acquire)};
#undef expand
#define expand(l, op)                                                          \
  (int (*)(kmp_user_lock_p, kmp_int32)) __kmp_##op##_##l##_##lock_with_checks,
static int (*indirect_set_check[])(kmp_user_lock_p, kmp_int32) = {
    KMP_FOREACH_I_LOCK(expand, acquire)};
#undef expand

// unset/release and test functions
#define expand(l, op)                                                          \
  (int (*)(kmp_user_lock_p, kmp_int32)) __kmp_##op##_##l##_##lock,
static int (*indirect_unset[])(kmp_user_lock_p, kmp_int32) = {
    KMP_FOREACH_I_LOCK(expand, release)};
static int (*indirect_test[])(kmp_user_lock_p,
                              kmp_int32) = {KMP_FOREACH_I_LOCK(expand, test)};
#undef expand
#define expand(l, op)                                                          \
  (int (*)(kmp_user_lock_p, kmp_int32)) __kmp_##op##_##l##_##lock_with_checks,
static int (*indirect_unset_check[])(kmp_user_lock_p, kmp_int32) = {
    KMP_FOREACH_I_LOCK(expand, release)};
static int (*indirect_test_check[])(kmp_user_lock_p, kmp_int32) = {
    KMP_FOREACH_I_LOCK(expand, test)};
#undef expand

// Exposes only one jump tables (*lock or *lock_with_checks).
void (**__kmp_indirect_destroy)(kmp_user_lock_p) = 0;
int (**__kmp_indirect_set)(kmp_user_lock_p, kmp_int32) = 0;
int (**__kmp_indirect_unset)(kmp_user_lock_p, kmp_int32) = 0;
int (**__kmp_indirect_test)(kmp_user_lock_p, kmp_int32) = 0;

// Lock index table.
kmp_indirect_lock_table_t __kmp_i_lock_table;

// Size of indirect locks.
static kmp_uint32 __kmp_indirect_lock_size[KMP_NUM_I_LOCKS] = {0};

// Jump tables for lock accessor/modifier.
void (*__kmp_indirect_set_location[KMP_NUM_I_LOCKS])(kmp_user_lock_p,
                                                     const ident_t *) = {0};
void (*__kmp_indirect_set_flags[KMP_NUM_I_LOCKS])(kmp_user_lock_p,
                                                  kmp_lock_flags_t) = {0};
const ident_t *(*__kmp_indirect_get_location[KMP_NUM_I_LOCKS])(
    kmp_user_lock_p) = {0};
kmp_lock_flags_t (*__kmp_indirect_get_flags[KMP_NUM_I_LOCKS])(
    kmp_user_lock_p) = {0};

// Use different lock pools for different lock types.
static kmp_indirect_lock_t *__kmp_indirect_lock_pool[KMP_NUM_I_LOCKS] = {0};

// User lock allocator for dynamically dispatched indirect locks. Every entry of
// the indirect lock table holds the address and type of the allocated indirect
// lock (kmp_indirect_lock_t), and the size of the table doubles when it is
// full. A destroyed indirect lock object is returned to the reusable pool of
// locks, unique to each lock type.
kmp_indirect_lock_t *__kmp_allocate_indirect_lock(void **user_lock,
                                                  kmp_int32 gtid,
                                                  kmp_indirect_locktag_t tag) {
  kmp_indirect_lock_t *lck;
  kmp_lock_index_t idx, table_idx;

  __kmp_acquire_lock(&__kmp_global_lock, gtid);

  if (__kmp_indirect_lock_pool[tag] != NULL) {
    // Reuse the allocated and destroyed lock object
    lck = __kmp_indirect_lock_pool[tag];
    if (OMP_LOCK_T_SIZE < sizeof(void *))
      idx = lck->lock->pool.index;
    __kmp_indirect_lock_pool[tag] = (kmp_indirect_lock_t *)lck->lock->pool.next;
    KA_TRACE(20, ("__kmp_allocate_indirect_lock: reusing an existing lock %p\n",
                  lck));
  } else {
    kmp_uint32 row, col;
    kmp_indirect_lock_table_t *lock_table = &__kmp_i_lock_table;
    idx = 0;
    // Find location in list of lock tables to put new lock
    while (1) {
      table_idx = lock_table->next; // index within this table
      idx += lock_table->next; // global index within list of tables
      if (table_idx < lock_table->nrow_ptrs * KMP_I_LOCK_CHUNK) {
        row = table_idx / KMP_I_LOCK_CHUNK;
        col = table_idx % KMP_I_LOCK_CHUNK;
        // Allocate a new row of locks if necessary
        if (!lock_table->table[row]) {
          lock_table->table[row] = (kmp_indirect_lock_t *)__kmp_allocate(
              sizeof(kmp_indirect_lock_t) * KMP_I_LOCK_CHUNK);
        }
        break;
      }
      // Allocate a new lock table if necessary with double the capacity
      if (!lock_table->next_table) {
        kmp_indirect_lock_table_t *next_table =
            (kmp_indirect_lock_table_t *)__kmp_allocate(
                sizeof(kmp_indirect_lock_table_t));
        next_table->table = (kmp_indirect_lock_t **)__kmp_allocate(
            sizeof(kmp_indirect_lock_t *) * 2 * lock_table->nrow_ptrs);
        next_table->nrow_ptrs = 2 * lock_table->nrow_ptrs;
        next_table->next = 0;
        next_table->next_table = nullptr;
        lock_table->next_table = next_table;
      }
      lock_table = lock_table->next_table;
      KMP_ASSERT(lock_table);
    }
    lock_table->next++;

    lck = &lock_table->table[row][col];
    // Allocate a new base lock object
    lck->lock = (kmp_user_lock_p)__kmp_allocate(__kmp_indirect_lock_size[tag]);
    KA_TRACE(20,
             ("__kmp_allocate_indirect_lock: allocated a new lock %p\n", lck));
  }

  __kmp_release_lock(&__kmp_global_lock, gtid);

  lck->type = tag;

  if (OMP_LOCK_T_SIZE < sizeof(void *)) {
    *((kmp_lock_index_t *)user_lock) = idx
                                       << 1; // indirect lock word must be even
  } else {
    *((kmp_indirect_lock_t **)user_lock) = lck;
  }

  return lck;
}

// User lock lookup for dynamically dispatched locks.
static __forceinline kmp_indirect_lock_t *
__kmp_lookup_indirect_lock(void **user_lock, const char *func) {
  if (__kmp_env_consistency_check) {
    kmp_indirect_lock_t *lck = NULL;
    if (user_lock == NULL) {
      KMP_FATAL(LockIsUninitialized, func);
    }
    if (OMP_LOCK_T_SIZE < sizeof(void *)) {
      kmp_lock_index_t idx = KMP_EXTRACT_I_INDEX(user_lock);
      lck = __kmp_get_i_lock(idx);
    } else {
      lck = *((kmp_indirect_lock_t **)user_lock);
    }
    if (lck == NULL) {
      KMP_FATAL(LockIsUninitialized, func);
    }
    return lck;
  } else {
    if (OMP_LOCK_T_SIZE < sizeof(void *)) {
      return __kmp_get_i_lock(KMP_EXTRACT_I_INDEX(user_lock));
    } else {
      return *((kmp_indirect_lock_t **)user_lock);
    }
  }
}

static void __kmp_init_indirect_lock(kmp_dyna_lock_t *lock,
                                     kmp_dyna_lockseq_t seq) {
#if KMP_USE_ADAPTIVE_LOCKS
  if (seq == lockseq_adaptive && !__kmp_cpuinfo.flags.rtm) {
    KMP_WARNING(AdaptiveNotSupported, "kmp_lockseq_t", "adaptive");
    seq = lockseq_queuing;
  }
#endif
#if KMP_USE_TSX
  if (seq == lockseq_rtm_queuing && !__kmp_cpuinfo.flags.rtm) {
    seq = lockseq_queuing;
  }
#endif
  kmp_indirect_locktag_t tag = KMP_GET_I_TAG(seq);
  kmp_indirect_lock_t *l =
      __kmp_allocate_indirect_lock((void **)lock, __kmp_entry_gtid(), tag);
  KMP_I_LOCK_FUNC(l, init)(l->lock);
  KA_TRACE(
      20, ("__kmp_init_indirect_lock: initialized indirect lock with type#%d\n",
           seq));
}

static void __kmp_destroy_indirect_lock(kmp_dyna_lock_t *lock) {
  kmp_uint32 gtid = __kmp_entry_gtid();
  kmp_indirect_lock_t *l =
      __kmp_lookup_indirect_lock((void **)lock, "omp_destroy_lock");
  KMP_I_LOCK_FUNC(l, destroy)(l->lock);
  kmp_indirect_locktag_t tag = l->type;

  __kmp_acquire_lock(&__kmp_global_lock, gtid);

  // Use the base lock's space to keep the pool chain.
  l->lock->pool.next = (kmp_user_lock_p)__kmp_indirect_lock_pool[tag];
  if (OMP_LOCK_T_SIZE < sizeof(void *)) {
    l->lock->pool.index = KMP_EXTRACT_I_INDEX(lock);
  }
  __kmp_indirect_lock_pool[tag] = l;

  __kmp_release_lock(&__kmp_global_lock, gtid);
}

static int __kmp_set_indirect_lock(kmp_dyna_lock_t *lock, kmp_int32 gtid) {
  kmp_indirect_lock_t *l = KMP_LOOKUP_I_LOCK(lock);
  return KMP_I_LOCK_FUNC(l, set)(l->lock, gtid);
}

static int __kmp_unset_indirect_lock(kmp_dyna_lock_t *lock, kmp_int32 gtid) {
  kmp_indirect_lock_t *l = KMP_LOOKUP_I_LOCK(lock);
  return KMP_I_LOCK_FUNC(l, unset)(l->lock, gtid);
}

static int __kmp_test_indirect_lock(kmp_dyna_lock_t *lock, kmp_int32 gtid) {
  kmp_indirect_lock_t *l = KMP_LOOKUP_I_LOCK(lock);
  return KMP_I_LOCK_FUNC(l, test)(l->lock, gtid);
}

static int __kmp_set_indirect_lock_with_checks(kmp_dyna_lock_t *lock,
                                               kmp_int32 gtid) {
  kmp_indirect_lock_t *l =
      __kmp_lookup_indirect_lock((void **)lock, "omp_set_lock");
  return KMP_I_LOCK_FUNC(l, set)(l->lock, gtid);
}

static int __kmp_unset_indirect_lock_with_checks(kmp_dyna_lock_t *lock,
                                                 kmp_int32 gtid) {
  kmp_indirect_lock_t *l =
      __kmp_lookup_indirect_lock((void **)lock, "omp_unset_lock");
  return KMP_I_LOCK_FUNC(l, unset)(l->lock, gtid);
}

static int __kmp_test_indirect_lock_with_checks(kmp_dyna_lock_t *lock,
                                                kmp_int32 gtid) {
  kmp_indirect_lock_t *l =
      __kmp_lookup_indirect_lock((void **)lock, "omp_test_lock");
  return KMP_I_LOCK_FUNC(l, test)(l->lock, gtid);
}

kmp_dyna_lockseq_t __kmp_user_lock_seq = lockseq_queuing;

// This is used only in kmp_error.cpp when consistency checking is on.
kmp_int32 __kmp_get_user_lock_owner(kmp_user_lock_p lck, kmp_uint32 seq) {
  switch (seq) {
  case lockseq_tas:
  case lockseq_nested_tas:
    return __kmp_get_tas_lock_owner((kmp_tas_lock_t *)lck);
#if KMP_USE_FUTEX
  case lockseq_futex:
  case lockseq_nested_futex:
    return __kmp_get_futex_lock_owner((kmp_futex_lock_t *)lck);
#endif
  case lockseq_ticket:
  case lockseq_nested_ticket:
    return __kmp_get_ticket_lock_owner((kmp_ticket_lock_t *)lck);
  case lockseq_queuing:
  case lockseq_nested_queuing:
#if KMP_USE_ADAPTIVE_LOCKS
  case lockseq_adaptive:
#endif
    return __kmp_get_queuing_lock_owner((kmp_queuing_lock_t *)lck);
  case lockseq_drdpa:
  case lockseq_nested_drdpa:
    return __kmp_get_drdpa_lock_owner((kmp_drdpa_lock_t *)lck);
  default:
    return 0;
  }
}

// Initializes data for dynamic user locks.
void __kmp_init_dynamic_user_locks() {
  // Initialize jump table for the lock functions
  if (__kmp_env_consistency_check) {
    __kmp_direct_set = direct_set_check;
    __kmp_direct_unset = direct_unset_check;
    __kmp_direct_test = direct_test_check;
    __kmp_direct_destroy = direct_destroy_check;
    __kmp_indirect_set = indirect_set_check;
    __kmp_indirect_unset = indirect_unset_check;
    __kmp_indirect_test = indirect_test_check;
    __kmp_indirect_destroy = indirect_destroy_check;
  } else {
    __kmp_direct_set = direct_set;
    __kmp_direct_unset = direct_unset;
    __kmp_direct_test = direct_test;
    __kmp_direct_destroy = direct_destroy;
    __kmp_indirect_set = indirect_set;
    __kmp_indirect_unset = indirect_unset;
    __kmp_indirect_test = indirect_test;
    __kmp_indirect_destroy = indirect_destroy;
  }
  // If the user locks have already been initialized, then return. Allow the
  // switch between different KMP_CONSISTENCY_CHECK values, but do not allocate
  // new lock tables if they have already been allocated.
  if (__kmp_init_user_locks)
    return;

  // Initialize lock index table
  __kmp_i_lock_table.nrow_ptrs = KMP_I_LOCK_TABLE_INIT_NROW_PTRS;
  __kmp_i_lock_table.table = (kmp_indirect_lock_t **)__kmp_allocate(
      sizeof(kmp_indirect_lock_t *) * KMP_I_LOCK_TABLE_INIT_NROW_PTRS);
  *(__kmp_i_lock_table.table) = (kmp_indirect_lock_t *)__kmp_allocate(
      KMP_I_LOCK_CHUNK * sizeof(kmp_indirect_lock_t));
  __kmp_i_lock_table.next = 0;
  __kmp_i_lock_table.next_table = nullptr;

  // Indirect lock size
  __kmp_indirect_lock_size[locktag_ticket] = sizeof(kmp_ticket_lock_t);
  __kmp_indirect_lock_size[locktag_queuing] = sizeof(kmp_queuing_lock_t);
#if KMP_USE_ADAPTIVE_LOCKS
  __kmp_indirect_lock_size[locktag_adaptive] = sizeof(kmp_adaptive_lock_t);
#endif
  __kmp_indirect_lock_size[locktag_drdpa] = sizeof(kmp_drdpa_lock_t);
#if KMP_USE_TSX
  __kmp_indirect_lock_size[locktag_rtm_queuing] = sizeof(kmp_queuing_lock_t);
#endif
  __kmp_indirect_lock_size[locktag_nested_tas] = sizeof(kmp_tas_lock_t);
#if KMP_USE_FUTEX
  __kmp_indirect_lock_size[locktag_nested_futex] = sizeof(kmp_futex_lock_t);
#endif
  __kmp_indirect_lock_size[locktag_nested_ticket] = sizeof(kmp_ticket_lock_t);
  __kmp_indirect_lock_size[locktag_nested_queuing] = sizeof(kmp_queuing_lock_t);
  __kmp_indirect_lock_size[locktag_nested_drdpa] = sizeof(kmp_drdpa_lock_t);

// Initialize lock accessor/modifier
#define fill_jumps(table, expand, sep)                                         \
  {                                                                            \
    table[locktag##sep##ticket] = expand(ticket);                              \
    table[locktag##sep##queuing] = expand(queuing);                            \
    table[locktag##sep##drdpa] = expand(drdpa);                                \
  }

#if KMP_USE_ADAPTIVE_LOCKS
#define fill_table(table, expand)                                              \
  {                                                                            \
    fill_jumps(table, expand, _);                                              \
    table[locktag_adaptive] = expand(queuing);                                 \
    fill_jumps(table, expand, _nested_);                                       \
  }
#else
#define fill_table(table, expand)                                              \
  {                                                                            \
    fill_jumps(table, expand, _);                                              \
    fill_jumps(table, expand, _nested_);                                       \
  }
#endif // KMP_USE_ADAPTIVE_LOCKS

#define expand(l)                                                              \
  (void (*)(kmp_user_lock_p, const ident_t *)) __kmp_set_##l##_lock_location
  fill_table(__kmp_indirect_set_location, expand);
#undef expand
#define expand(l)                                                              \
  (void (*)(kmp_user_lock_p, kmp_lock_flags_t)) __kmp_set_##l##_lock_flags
  fill_table(__kmp_indirect_set_flags, expand);
#undef expand
#define expand(l)                                                              \
  (const ident_t *(*)(kmp_user_lock_p)) __kmp_get_##l##_lock_location
  fill_table(__kmp_indirect_get_location, expand);
#undef expand
#define expand(l)                                                              \
  (kmp_lock_flags_t(*)(kmp_user_lock_p)) __kmp_get_##l##_lock_flags
  fill_table(__kmp_indirect_get_flags, expand);
#undef expand

  __kmp_init_user_locks = TRUE;
}

// Clean up the lock table.
void __kmp_cleanup_indirect_user_locks() {
  int k;

  // Clean up locks in the pools first (they were already destroyed before going
  // into the pools).
  for (k = 0; k < KMP_NUM_I_LOCKS; ++k) {
    kmp_indirect_lock_t *l = __kmp_indirect_lock_pool[k];
    while (l != NULL) {
      kmp_indirect_lock_t *ll = l;
      l = (kmp_indirect_lock_t *)l->lock->pool.next;
      KA_TRACE(20, ("__kmp_cleanup_indirect_user_locks: freeing %p from pool\n",
                    ll));
      __kmp_free(ll->lock);
      ll->lock = NULL;
    }
    __kmp_indirect_lock_pool[k] = NULL;
  }
  // Clean up the remaining undestroyed locks.
  kmp_indirect_lock_table_t *ptr = &__kmp_i_lock_table;
  while (ptr) {
    for (kmp_uint32 row = 0; row < ptr->nrow_ptrs; ++row) {
      if (!ptr->table[row])
        continue;
      for (kmp_uint32 col = 0; col < KMP_I_LOCK_CHUNK; ++col) {
        kmp_indirect_lock_t *l = &ptr->table[row][col];
        if (l->lock) {
          // Locks not destroyed explicitly need to be destroyed here.
          KMP_I_LOCK_FUNC(l, destroy)(l->lock);
          KA_TRACE(20, ("__kmp_cleanup_indirect_user_locks: destroy/freeing %p "
                        "from table\n",
                        l));
          __kmp_free(l->lock);
        }
      }
      __kmp_free(ptr->table[row]);
    }
    kmp_indirect_lock_table_t *next_table = ptr->next_table;
    if (ptr != &__kmp_i_lock_table)
      __kmp_free(ptr);
    ptr = next_table;
  }

  __kmp_init_user_locks = FALSE;
}

enum kmp_lock_kind __kmp_user_lock_kind = lk_default;
int __kmp_num_locks_in_block = 1; // FIXME - tune this value

#else // KMP_USE_DYNAMIC_LOCK

static void __kmp_init_tas_lock_with_checks(kmp_tas_lock_t *lck) {
  __kmp_init_tas_lock(lck);
}

static void __kmp_init_nested_tas_lock_with_checks(kmp_tas_lock_t *lck) {
  __kmp_init_nested_tas_lock(lck);
}

#if KMP_USE_FUTEX
static void __kmp_init_futex_lock_with_checks(kmp_futex_lock_t *lck) {
  __kmp_init_futex_lock(lck);
}

static void __kmp_init_nested_futex_lock_with_checks(kmp_futex_lock_t *lck) {
  __kmp_init_nested_futex_lock(lck);
}
#endif

static int __kmp_is_ticket_lock_initialized(kmp_ticket_lock_t *lck) {
  return lck == lck->lk.self;
}

static void __kmp_init_ticket_lock_with_checks(kmp_ticket_lock_t *lck) {
  __kmp_init_ticket_lock(lck);
}

static void __kmp_init_nested_ticket_lock_with_checks(kmp_ticket_lock_t *lck) {
  __kmp_init_nested_ticket_lock(lck);
}

static int __kmp_is_queuing_lock_initialized(kmp_queuing_lock_t *lck) {
  return lck == lck->lk.initialized;
}

static void __kmp_init_queuing_lock_with_checks(kmp_queuing_lock_t *lck) {
  __kmp_init_queuing_lock(lck);
}

static void
__kmp_init_nested_queuing_lock_with_checks(kmp_queuing_lock_t *lck) {
  __kmp_init_nested_queuing_lock(lck);
}

#if KMP_USE_ADAPTIVE_LOCKS
static void __kmp_init_adaptive_lock_with_checks(kmp_adaptive_lock_t *lck) {
  __kmp_init_adaptive_lock(lck);
}
#endif

static int __kmp_is_drdpa_lock_initialized(kmp_drdpa_lock_t *lck) {
  return lck == lck->lk.initialized;
}

static void __kmp_init_drdpa_lock_with_checks(kmp_drdpa_lock_t *lck) {
  __kmp_init_drdpa_lock(lck);
}

static void __kmp_init_nested_drdpa_lock_with_checks(kmp_drdpa_lock_t *lck) {
  __kmp_init_nested_drdpa_lock(lck);
}

/* user locks
 * They are implemented as a table of function pointers which are set to the
 * lock functions of the appropriate kind, once that has been determined. */

enum kmp_lock_kind __kmp_user_lock_kind = lk_default;

size_t __kmp_base_user_lock_size = 0;
size_t __kmp_user_lock_size = 0;

kmp_int32 (*__kmp_get_user_lock_owner_)(kmp_user_lock_p lck) = NULL;
int (*__kmp_acquire_user_lock_with_checks_)(kmp_user_lock_p lck,
                                            kmp_int32 gtid) = NULL;

int (*__kmp_test_user_lock_with_checks_)(kmp_user_lock_p lck,
                                         kmp_int32 gtid) = NULL;
int (*__kmp_release_user_lock_with_checks_)(kmp_user_lock_p lck,
                                            kmp_int32 gtid) = NULL;
void (*__kmp_init_user_lock_with_checks_)(kmp_user_lock_p lck) = NULL;
void (*__kmp_destroy_user_lock_)(kmp_user_lock_p lck) = NULL;
void (*__kmp_destroy_user_lock_with_checks_)(kmp_user_lock_p lck) = NULL;
int (*__kmp_acquire_nested_user_lock_with_checks_)(kmp_user_lock_p lck,
                                                   kmp_int32 gtid) = NULL;

int (*__kmp_test_nested_user_lock_with_checks_)(kmp_user_lock_p lck,
                                                kmp_int32 gtid) = NULL;
int (*__kmp_release_nested_user_lock_with_checks_)(kmp_user_lock_p lck,
                                                   kmp_int32 gtid) = NULL;
void (*__kmp_init_nested_user_lock_with_checks_)(kmp_user_lock_p lck) = NULL;
void (*__kmp_destroy_nested_user_lock_with_checks_)(kmp_user_lock_p lck) = NULL;

int (*__kmp_is_user_lock_initialized_)(kmp_user_lock_p lck) = NULL;
const ident_t *(*__kmp_get_user_lock_location_)(kmp_user_lock_p lck) = NULL;
void (*__kmp_set_user_lock_location_)(kmp_user_lock_p lck,
                                      const ident_t *loc) = NULL;
kmp_lock_flags_t (*__kmp_get_user_lock_flags_)(kmp_user_lock_p lck) = NULL;
void (*__kmp_set_user_lock_flags_)(kmp_user_lock_p lck,
                                   kmp_lock_flags_t flags) = NULL;

void __kmp_set_user_lock_vptrs(kmp_lock_kind_t user_lock_kind) {
  switch (user_lock_kind) {
  case lk_default:
  default:
    KMP_ASSERT(0);

  case lk_tas: {
    __kmp_base_user_lock_size = sizeof(kmp_base_tas_lock_t);
    __kmp_user_lock_size = sizeof(kmp_tas_lock_t);

    __kmp_get_user_lock_owner_ =
        (kmp_int32(*)(kmp_user_lock_p))(&__kmp_get_tas_lock_owner);

    if (__kmp_env_consistency_check) {
      KMP_BIND_USER_LOCK_WITH_CHECKS(tas);
      KMP_BIND_NESTED_USER_LOCK_WITH_CHECKS(tas);
    } else {
      KMP_BIND_USER_LOCK(tas);
      KMP_BIND_NESTED_USER_LOCK(tas);
    }

    __kmp_destroy_user_lock_ =
        (void (*)(kmp_user_lock_p))(&__kmp_destroy_tas_lock);

    __kmp_is_user_lock_initialized_ = (int (*)(kmp_user_lock_p))NULL;

    __kmp_get_user_lock_location_ = (const ident_t *(*)(kmp_user_lock_p))NULL;

    __kmp_set_user_lock_location_ =
        (void (*)(kmp_user_lock_p, const ident_t *))NULL;

    __kmp_get_user_lock_flags_ = (kmp_lock_flags_t(*)(kmp_user_lock_p))NULL;

    __kmp_set_user_lock_flags_ =
        (void (*)(kmp_user_lock_p, kmp_lock_flags_t))NULL;
  } break;

#if KMP_USE_FUTEX

  case lk_futex: {
    __kmp_base_user_lock_size = sizeof(kmp_base_futex_lock_t);
    __kmp_user_lock_size = sizeof(kmp_futex_lock_t);

    __kmp_get_user_lock_owner_ =
        (kmp_int32(*)(kmp_user_lock_p))(&__kmp_get_futex_lock_owner);

    if (__kmp_env_consistency_check) {
      KMP_BIND_USER_LOCK_WITH_CHECKS(futex);
      KMP_BIND_NESTED_USER_LOCK_WITH_CHECKS(futex);
    } else {
      KMP_BIND_USER_LOCK(futex);
      KMP_BIND_NESTED_USER_LOCK(futex);
    }

    __kmp_destroy_user_lock_ =
        (void (*)(kmp_user_lock_p))(&__kmp_destroy_futex_lock);

    __kmp_is_user_lock_initialized_ = (int (*)(kmp_user_lock_p))NULL;

    __kmp_get_user_lock_location_ = (const ident_t *(*)(kmp_user_lock_p))NULL;

    __kmp_set_user_lock_location_ =
        (void (*)(kmp_user_lock_p, const ident_t *))NULL;

    __kmp_get_user_lock_flags_ = (kmp_lock_flags_t(*)(kmp_user_lock_p))NULL;

    __kmp_set_user_lock_flags_ =
        (void (*)(kmp_user_lock_p, kmp_lock_flags_t))NULL;
  } break;

#endif // KMP_USE_FUTEX

  case lk_ticket: {
    __kmp_base_user_lock_size = sizeof(kmp_base_ticket_lock_t);
    __kmp_user_lock_size = sizeof(kmp_ticket_lock_t);

    __kmp_get_user_lock_owner_ =
        (kmp_int32(*)(kmp_user_lock_p))(&__kmp_get_ticket_lock_owner);

    if (__kmp_env_consistency_check) {
      KMP_BIND_USER_LOCK_WITH_CHECKS(ticket);
      KMP_BIND_NESTED_USER_LOCK_WITH_CHECKS(ticket);
    } else {
      KMP_BIND_USER_LOCK(ticket);
      KMP_BIND_NESTED_USER_LOCK(ticket);
    }

    __kmp_destroy_user_lock_ =
        (void (*)(kmp_user_lock_p))(&__kmp_destroy_ticket_lock);

    __kmp_is_user_lock_initialized_ =
        (int (*)(kmp_user_lock_p))(&__kmp_is_ticket_lock_initialized);

    __kmp_get_user_lock_location_ =
        (const ident_t *(*)(kmp_user_lock_p))(&__kmp_get_ticket_lock_location);

    __kmp_set_user_lock_location_ = (void (*)(
        kmp_user_lock_p, const ident_t *))(&__kmp_set_ticket_lock_location);

    __kmp_get_user_lock_flags_ =
        (kmp_lock_flags_t(*)(kmp_user_lock_p))(&__kmp_get_ticket_lock_flags);

    __kmp_set_user_lock_flags_ = (void (*)(kmp_user_lock_p, kmp_lock_flags_t))(
        &__kmp_set_ticket_lock_flags);
  } break;

  case lk_queuing: {
    __kmp_base_user_lock_size = sizeof(kmp_base_queuing_lock_t);
    __kmp_user_lock_size = sizeof(kmp_queuing_lock_t);

    __kmp_get_user_lock_owner_ =
        (kmp_int32(*)(kmp_user_lock_p))(&__kmp_get_queuing_lock_owner);

    if (__kmp_env_consistency_check) {
      KMP_BIND_USER_LOCK_WITH_CHECKS(queuing);
      KMP_BIND_NESTED_USER_LOCK_WITH_CHECKS(queuing);
    } else {
      KMP_BIND_USER_LOCK(queuing);
      KMP_BIND_NESTED_USER_LOCK(queuing);
    }

    __kmp_destroy_user_lock_ =
        (void (*)(kmp_user_lock_p))(&__kmp_destroy_queuing_lock);

    __kmp_is_user_lock_initialized_ =
        (int (*)(kmp_user_lock_p))(&__kmp_is_queuing_lock_initialized);

    __kmp_get_user_lock_location_ =
        (const ident_t *(*)(kmp_user_lock_p))(&__kmp_get_queuing_lock_location);

    __kmp_set_user_lock_location_ = (void (*)(
        kmp_user_lock_p, const ident_t *))(&__kmp_set_queuing_lock_location);

    __kmp_get_user_lock_flags_ =
        (kmp_lock_flags_t(*)(kmp_user_lock_p))(&__kmp_get_queuing_lock_flags);

    __kmp_set_user_lock_flags_ = (void (*)(kmp_user_lock_p, kmp_lock_flags_t))(
        &__kmp_set_queuing_lock_flags);
  } break;

#if KMP_USE_ADAPTIVE_LOCKS
  case lk_adaptive: {
    __kmp_base_user_lock_size = sizeof(kmp_base_adaptive_lock_t);
    __kmp_user_lock_size = sizeof(kmp_adaptive_lock_t);

    __kmp_get_user_lock_owner_ =
        (kmp_int32(*)(kmp_user_lock_p))(&__kmp_get_queuing_lock_owner);

    if (__kmp_env_consistency_check) {
      KMP_BIND_USER_LOCK_WITH_CHECKS(adaptive);
    } else {
      KMP_BIND_USER_LOCK(adaptive);
    }

    __kmp_destroy_user_lock_ =
        (void (*)(kmp_user_lock_p))(&__kmp_destroy_adaptive_lock);

    __kmp_is_user_lock_initialized_ =
        (int (*)(kmp_user_lock_p))(&__kmp_is_queuing_lock_initialized);

    __kmp_get_user_lock_location_ =
        (const ident_t *(*)(kmp_user_lock_p))(&__kmp_get_queuing_lock_location);

    __kmp_set_user_lock_location_ = (void (*)(
        kmp_user_lock_p, const ident_t *))(&__kmp_set_queuing_lock_location);

    __kmp_get_user_lock_flags_ =
        (kmp_lock_flags_t(*)(kmp_user_lock_p))(&__kmp_get_queuing_lock_flags);

    __kmp_set_user_lock_flags_ = (void (*)(kmp_user_lock_p, kmp_lock_flags_t))(
        &__kmp_set_queuing_lock_flags);

  } break;
#endif // KMP_USE_ADAPTIVE_LOCKS

  case lk_drdpa: {
    __kmp_base_user_lock_size = sizeof(kmp_base_drdpa_lock_t);
    __kmp_user_lock_size = sizeof(kmp_drdpa_lock_t);

    __kmp_get_user_lock_owner_ =
        (kmp_int32(*)(kmp_user_lock_p))(&__kmp_get_drdpa_lock_owner);

    if (__kmp_env_consistency_check) {
      KMP_BIND_USER_LOCK_WITH_CHECKS(drdpa);
      KMP_BIND_NESTED_USER_LOCK_WITH_CHECKS(drdpa);
    } else {
      KMP_BIND_USER_LOCK(drdpa);
      KMP_BIND_NESTED_USER_LOCK(drdpa);
    }

    __kmp_destroy_user_lock_ =
        (void (*)(kmp_user_lock_p))(&__kmp_destroy_drdpa_lock);

    __kmp_is_user_lock_initialized_ =
        (int (*)(kmp_user_lock_p))(&__kmp_is_drdpa_lock_initialized);

    __kmp_get_user_lock_location_ =
        (const ident_t *(*)(kmp_user_lock_p))(&__kmp_get_drdpa_lock_location);

    __kmp_set_user_lock_location_ = (void (*)(
        kmp_user_lock_p, const ident_t *))(&__kmp_set_drdpa_lock_location);

    __kmp_get_user_lock_flags_ =
        (kmp_lock_flags_t(*)(kmp_user_lock_p))(&__kmp_get_drdpa_lock_flags);

    __kmp_set_user_lock_flags_ = (void (*)(kmp_user_lock_p, kmp_lock_flags_t))(
        &__kmp_set_drdpa_lock_flags);
  } break;
  }
}

// ----------------------------------------------------------------------------
// User lock table & lock allocation

kmp_lock_table_t __kmp_user_lock_table = {1, 0, NULL};
kmp_user_lock_p __kmp_lock_pool = NULL;

// Lock block-allocation support.
kmp_block_of_locks *__kmp_lock_blocks = NULL;
int __kmp_num_locks_in_block = 1; // FIXME - tune this value

static kmp_lock_index_t __kmp_lock_table_insert(kmp_user_lock_p lck) {
  // Assume that kmp_global_lock is held upon entry/exit.
  kmp_lock_index_t index;
  if (__kmp_user_lock_table.used >= __kmp_user_lock_table.allocated) {
    kmp_lock_index_t size;
    kmp_user_lock_p *table;
    // Reallocate lock table.
    if (__kmp_user_lock_table.allocated == 0) {
      size = 1024;
    } else {
      size = __kmp_user_lock_table.allocated * 2;
    }
    table = (kmp_user_lock_p *)__kmp_allocate(sizeof(kmp_user_lock_p) * size);
    KMP_MEMCPY(table + 1, __kmp_user_lock_table.table + 1,
               sizeof(kmp_user_lock_p) * (__kmp_user_lock_table.used - 1));
    table[0] = (kmp_user_lock_p)__kmp_user_lock_table.table;
    // We cannot free the previous table now, since it may be in use by other
    // threads. So save the pointer to the previous table in in the first
    // element of the new table. All the tables will be organized into a list,
    // and could be freed when library shutting down.
    __kmp_user_lock_table.table = table;
    __kmp_user_lock_table.allocated = size;
  }
  KMP_DEBUG_ASSERT(__kmp_user_lock_table.used <
                   __kmp_user_lock_table.allocated);
  index = __kmp_user_lock_table.used;
  __kmp_user_lock_table.table[index] = lck;
  ++__kmp_user_lock_table.used;
  return index;
}

static kmp_user_lock_p __kmp_lock_block_allocate() {
  // Assume that kmp_global_lock is held upon entry/exit.
  static int last_index = 0;
  if ((last_index >= __kmp_num_locks_in_block) || (__kmp_lock_blocks == NULL)) {
    // Restart the index.
    last_index = 0;
    // Need to allocate a new block.
    KMP_DEBUG_ASSERT(__kmp_user_lock_size > 0);
    size_t space_for_locks = __kmp_user_lock_size * __kmp_num_locks_in_block;
    char *buffer =
        (char *)__kmp_allocate(space_for_locks + sizeof(kmp_block_of_locks));
    // Set up the new block.
    kmp_block_of_locks *new_block =
        (kmp_block_of_locks *)(&buffer[space_for_locks]);
    new_block->next_block = __kmp_lock_blocks;
    new_block->locks = (void *)buffer;
    // Publish the new block.
    KMP_MB();
    __kmp_lock_blocks = new_block;
  }
  kmp_user_lock_p ret = (kmp_user_lock_p)(&(
      ((char *)(__kmp_lock_blocks->locks))[last_index * __kmp_user_lock_size]));
  last_index++;
  return ret;
}

// Get memory for a lock. It may be freshly allocated memory or reused memory
// from lock pool.
kmp_user_lock_p __kmp_user_lock_allocate(void **user_lock, kmp_int32 gtid,
                                         kmp_lock_flags_t flags) {
  kmp_user_lock_p lck;
  kmp_lock_index_t index;
  KMP_DEBUG_ASSERT(user_lock);

  __kmp_acquire_lock(&__kmp_global_lock, gtid);

  if (__kmp_lock_pool == NULL) {
    // Lock pool is empty. Allocate new memory.

    if (__kmp_num_locks_in_block <= 1) { // Tune this cutoff point.
      lck = (kmp_user_lock_p)__kmp_allocate(__kmp_user_lock_size);
    } else {
      lck = __kmp_lock_block_allocate();
    }

    // Insert lock in the table so that it can be freed in __kmp_cleanup,
    // and debugger has info on all allocated locks.
    index = __kmp_lock_table_insert(lck);
  } else {
    // Pick up lock from pool.
    lck = __kmp_lock_pool;
    index = __kmp_lock_pool->pool.index;
    __kmp_lock_pool = __kmp_lock_pool->pool.next;
  }

  // We could potentially differentiate between nested and regular locks
  // here, and do the lock table lookup for regular locks only.
  if (OMP_LOCK_T_SIZE < sizeof(void *)) {
    *((kmp_lock_index_t *)user_lock) = index;
  } else {
    *((kmp_user_lock_p *)user_lock) = lck;
  }

  // mark the lock if it is critical section lock.
  __kmp_set_user_lock_flags(lck, flags);

  __kmp_release_lock(&__kmp_global_lock, gtid); // AC: TODO move this line upper

  return lck;
}

// Put lock's memory to pool for reusing.
void __kmp_user_lock_free(void **user_lock, kmp_int32 gtid,
                          kmp_user_lock_p lck) {
  KMP_DEBUG_ASSERT(user_lock != NULL);
  KMP_DEBUG_ASSERT(lck != NULL);

  __kmp_acquire_lock(&__kmp_global_lock, gtid);

  lck->pool.next = __kmp_lock_pool;
  __kmp_lock_pool = lck;
  if (OMP_LOCK_T_SIZE < sizeof(void *)) {
    kmp_lock_index_t index = *((kmp_lock_index_t *)user_lock);
    KMP_DEBUG_ASSERT(0 < index && index <= __kmp_user_lock_table.used);
    lck->pool.index = index;
  }

  __kmp_release_lock(&__kmp_global_lock, gtid);
}

kmp_user_lock_p __kmp_lookup_user_lock(void **user_lock, char const *func) {
  kmp_user_lock_p lck = NULL;

  if (__kmp_env_consistency_check) {
    if (user_lock == NULL) {
      KMP_FATAL(LockIsUninitialized, func);
    }
  }

  if (OMP_LOCK_T_SIZE < sizeof(void *)) {
    kmp_lock_index_t index = *((kmp_lock_index_t *)user_lock);
    if (__kmp_env_consistency_check) {
      if (!(0 < index && index < __kmp_user_lock_table.used)) {
        KMP_FATAL(LockIsUninitialized, func);
      }
    }
    KMP_DEBUG_ASSERT(0 < index && index < __kmp_user_lock_table.used);
    KMP_DEBUG_ASSERT(__kmp_user_lock_size > 0);
    lck = __kmp_user_lock_table.table[index];
  } else {
    lck = *((kmp_user_lock_p *)user_lock);
  }

  if (__kmp_env_consistency_check) {
    if (lck == NULL) {
      KMP_FATAL(LockIsUninitialized, func);
    }
  }

  return lck;
}

void __kmp_cleanup_user_locks(void) {
  // Reset lock pool. Don't worry about lock in the pool--we will free them when
  // iterating through lock table (it includes all the locks, dead or alive).
  __kmp_lock_pool = NULL;

#define IS_CRITICAL(lck)                                                       \
  ((__kmp_get_user_lock_flags_ != NULL) &&                                     \
   ((*__kmp_get_user_lock_flags_)(lck)&kmp_lf_critical_section))

  // Loop through lock table, free all locks.
  // Do not free item [0], it is reserved for lock tables list.
  //
  // FIXME - we are iterating through a list of (pointers to) objects of type
  // union kmp_user_lock, but we have no way of knowing whether the base type is
  // currently "pool" or whatever the global user lock type is.
  //
  // We are relying on the fact that for all of the user lock types
  // (except "tas"), the first field in the lock struct is the "initialized"
  // field, which is set to the address of the lock object itself when
  // the lock is initialized.  When the union is of type "pool", the
  // first field is a pointer to the next object in the free list, which
  // will not be the same address as the object itself.
  //
  // This means that the check (*__kmp_is_user_lock_initialized_)(lck) will fail
  // for "pool" objects on the free list.  This must happen as the "location"
  // field of real user locks overlaps the "index" field of "pool" objects.
  //
  // It would be better to run through the free list, and remove all "pool"
  // objects from the lock table before executing this loop.  However,
  // "pool" objects do not always have their index field set (only on
  // lin_32e), and I don't want to search the lock table for the address
  // of every "pool" object on the free list.
  while (__kmp_user_lock_table.used > 1) {
    const ident *loc;

    // reduce __kmp_user_lock_table.used before freeing the lock,
    // so that state of locks is consistent
    kmp_user_lock_p lck =
        __kmp_user_lock_table.table[--__kmp_user_lock_table.used];

    if ((__kmp_is_user_lock_initialized_ != NULL) &&
        (*__kmp_is_user_lock_initialized_)(lck)) {
      // Issue a warning if: KMP_CONSISTENCY_CHECK AND lock is initialized AND
      // it is NOT a critical section (user is not responsible for destroying
      // criticals) AND we know source location to report.
      if (__kmp_env_consistency_check && (!IS_CRITICAL(lck)) &&
          ((loc = __kmp_get_user_lock_location(lck)) != NULL) &&
          (loc->psource != NULL)) {
        kmp_str_loc_t str_loc = __kmp_str_loc_init(loc->psource, false);
        KMP_WARNING(CnsLockNotDestroyed, str_loc.file, str_loc.line);
        __kmp_str_loc_free(&str_loc);
      }

#ifdef KMP_DEBUG
      if (IS_CRITICAL(lck)) {
        KA_TRACE(
            20,
            ("__kmp_cleanup_user_locks: free critical section lock %p (%p)\n",
             lck, *(void **)lck));
      } else {
        KA_TRACE(20, ("__kmp_cleanup_user_locks: free lock %p (%p)\n", lck,
                      *(void **)lck));
      }
#endif // KMP_DEBUG

      // Cleanup internal lock dynamic resources (for drdpa locks particularly).
      __kmp_destroy_user_lock(lck);
    }

    // Free the lock if block allocation of locks is not used.
    if (__kmp_lock_blocks == NULL) {
      __kmp_free(lck);
    }
  }

#undef IS_CRITICAL

  // delete lock table(s).
  kmp_user_lock_p *table_ptr = __kmp_user_lock_table.table;
  __kmp_user_lock_table.table = NULL;
  __kmp_user_lock_table.allocated = 0;

  while (table_ptr != NULL) {
    // In the first element we saved the pointer to the previous
    // (smaller) lock table.
    kmp_user_lock_p *next = (kmp_user_lock_p *)(table_ptr[0]);
    __kmp_free(table_ptr);
    table_ptr = next;
  }

  // Free buffers allocated for blocks of locks.
  kmp_block_of_locks_t *block_ptr = __kmp_lock_blocks;
  __kmp_lock_blocks = NULL;

  while (block_ptr != NULL) {
    kmp_block_of_locks_t *next = block_ptr->next_block;
    __kmp_free(block_ptr->locks);
    // *block_ptr itself was allocated at the end of the locks vector.
    block_ptr = next;
  }

  TCW_4(__kmp_init_user_locks, FALSE);
}

#endif // KMP_USE_DYNAMIC_LOCK
