return __kmp_test_tas_lock( lck, gtid );
}
-void
+int
__kmp_release_tas_lock( kmp_tas_lock_t *lck, kmp_int32 gtid )
{
KMP_MB(); /* Flush all pending memory write invalidates. */
KMP_YIELD( TCR_4( __kmp_nth ) > ( __kmp_avail_proc ? __kmp_avail_proc :
__kmp_xproc ) );
+ return KMP_LOCK_RELEASED;
}
-static void
+static int
__kmp_release_tas_lock_with_checks( kmp_tas_lock_t *lck, kmp_int32 gtid )
{
char const * const func = "omp_unset_lock";
&& ( __kmp_get_tas_lock_owner( lck ) != gtid ) ) {
KMP_FATAL( LockUnsettingSetByAnother, func );
}
- __kmp_release_tas_lock( lck, gtid );
+ return __kmp_release_tas_lock( lck, gtid );
}
void
return __kmp_test_nested_tas_lock( lck, gtid );
}
-void
+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 void
+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";
if ( __kmp_get_tas_lock_owner( lck ) != gtid ) {
KMP_FATAL( LockUnsettingSetByAnother, func );
}
- __kmp_release_nested_tas_lock( lck, gtid );
+ return __kmp_release_nested_tas_lock( lck, gtid );
}
void
return __kmp_test_futex_lock( lck, gtid );
}
-void
+int
__kmp_release_futex_lock( kmp_futex_lock_t *lck, kmp_int32 gtid )
{
KMP_MB(); /* Flush all pending memory write invalidates. */
KMP_YIELD( TCR_4( __kmp_nth ) > ( __kmp_avail_proc ? __kmp_avail_proc :
__kmp_xproc ) );
+ return KMP_LOCK_RELEASED;
}
-static void
+static int
__kmp_release_futex_lock_with_checks( kmp_futex_lock_t *lck, kmp_int32 gtid )
{
char const * const func = "omp_unset_lock";
&& ( __kmp_get_futex_lock_owner( lck ) != gtid ) ) {
KMP_FATAL( LockUnsettingSetByAnother, func );
}
- __kmp_release_futex_lock( lck, gtid );
+ return __kmp_release_futex_lock( lck, gtid );
}
void
return __kmp_test_nested_futex_lock( lck, gtid );
}
-void
+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 void
+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";
if ( __kmp_get_futex_lock_owner( lck ) != gtid ) {
KMP_FATAL( LockUnsettingSetByAnother, func );
}
- __kmp_release_nested_futex_lock( lck, gtid );
+ return __kmp_release_nested_futex_lock( lck, gtid );
}
void
return retval;
}
-void
+int
__kmp_release_ticket_lock( kmp_ticket_lock_t *lck, kmp_int32 gtid )
{
kmp_uint32 distance;
KMP_YIELD( distance
> (kmp_uint32) (__kmp_avail_proc ? __kmp_avail_proc : __kmp_xproc) );
+ return KMP_LOCK_RELEASED;
}
-static void
+static int
__kmp_release_ticket_lock_with_checks( kmp_ticket_lock_t *lck, kmp_int32 gtid )
{
char const * const func = "omp_unset_lock";
KMP_FATAL( LockUnsettingSetByAnother, func );
}
lck->lk.owner_id = 0;
- __kmp_release_ticket_lock( lck, gtid );
+ return __kmp_release_ticket_lock( lck, gtid );
}
void
return __kmp_test_nested_ticket_lock( lck, gtid );
}
-void
+int
__kmp_release_nested_ticket_lock( kmp_ticket_lock_t *lck, kmp_int32 gtid )
{
KMP_DEBUG_ASSERT( gtid >= 0 );
KMP_MB();
lck->lk.owner_id = 0;
__kmp_release_ticket_lock( lck, gtid );
+ return KMP_LOCK_RELEASED;
}
+ return KMP_LOCK_STILL_HELD;
}
-static void
+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 ( __kmp_get_ticket_lock_owner( lck ) != gtid ) {
KMP_FATAL( LockUnsettingSetByAnother, func );
}
- __kmp_release_nested_ticket_lock( lck, gtid );
+ return __kmp_release_nested_ticket_lock( lck, gtid );
}
void
return retval;
}
-void
+int
__kmp_release_queuing_lock( kmp_queuing_lock_t *lck, kmp_int32 gtid )
{
register kmp_info_t *this_thr;
#ifdef DEBUG_QUEUING_LOCKS
TRACE_LOCK_HT( gtid+1, "rel exit: ", 0, 0 );
#endif
- return;
+ return KMP_LOCK_RELEASED;
}
dequeued = FALSE;
#ifdef DEBUG_QUEUING_LOCKS
TRACE_LOCK( gtid+1, "rel exit 2" );
#endif
- return;
+ return KMP_LOCK_RELEASED;
}
/* KMP_CPU_PAUSE( ); don't want to make releasing thread hold up acquiring threads */
} /* while */
KMP_ASSERT2( 0, "should not get here" );
+ return KMP_LOCK_RELEASED;
}
-static void
+static int
__kmp_release_queuing_lock_with_checks( kmp_queuing_lock_t *lck,
kmp_int32 gtid )
{
KMP_FATAL( LockUnsettingSetByAnother, func );
}
lck->lk.owner_id = 0;
- __kmp_release_queuing_lock( lck, gtid );
+ return __kmp_release_queuing_lock( lck, gtid );
}
void
return __kmp_test_nested_queuing_lock( lck, gtid );
}
-void
+int
__kmp_release_nested_queuing_lock( kmp_queuing_lock_t *lck, kmp_int32 gtid )
{
KMP_DEBUG_ASSERT( gtid >= 0 );
KMP_MB();
lck->lk.owner_id = 0;
__kmp_release_queuing_lock( lck, gtid );
+ return KMP_LOCK_RELEASED;
}
+ return KMP_LOCK_STILL_HELD;
}
-static void
+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";
if ( __kmp_get_queuing_lock_owner( lck ) != gtid ) {
KMP_FATAL( LockUnsettingSetByAnother, func );
}
- __kmp_release_nested_queuing_lock( lck, gtid );
+ return __kmp_release_nested_queuing_lock( lck, gtid );
}
void
lck->lk.qlk.owner_id = gtid + 1;
}
-static void
+static int
__kmp_release_adaptive_lock( kmp_adaptive_lock_t *lck, kmp_int32 gtid )
{
if ( __kmp_is_unlocked_queuing_lock( GET_QLK_PTR(lck) ) )
// so should use the underlying lock's release scheme.
__kmp_release_queuing_lock( GET_QLK_PTR(lck), gtid );
}
+ return KMP_LOCK_RELEASED;
}
-static void
+static int
__kmp_release_adaptive_lock_with_checks( kmp_adaptive_lock_t *lck, kmp_int32 gtid )
{
char const * const func = "omp_unset_lock";
}
lck->lk.qlk.owner_id = 0;
__kmp_release_adaptive_lock( lck, gtid );
+ return KMP_LOCK_RELEASED;
}
static void
return retval;
}
-void
+int
__kmp_release_drdpa_lock( kmp_drdpa_lock_t *lck, kmp_int32 gtid )
{
//
ticket - 1, lck));
KMP_FSYNC_RELEASING(lck);
KMP_ST_REL64(&(polls[ticket & mask].poll), ticket); // volatile store
+ return KMP_LOCK_RELEASED;
}
-static void
+static int
__kmp_release_drdpa_lock_with_checks( kmp_drdpa_lock_t *lck, kmp_int32 gtid )
{
char const * const func = "omp_unset_lock";
KMP_FATAL( LockUnsettingSetByAnother, func );
}
lck->lk.owner_id = 0;
- __kmp_release_drdpa_lock( lck, gtid );
+ return __kmp_release_drdpa_lock( lck, gtid );
}
void
return __kmp_test_nested_drdpa_lock( lck, gtid );
}
-void
+int
__kmp_release_nested_drdpa_lock( kmp_drdpa_lock_t *lck, kmp_int32 gtid )
{
KMP_DEBUG_ASSERT( gtid >= 0 );
KMP_MB();
lck->lk.owner_id = 0;
__kmp_release_drdpa_lock( lck, gtid );
+ return KMP_LOCK_RELEASED;
}
+ return KMP_LOCK_STILL_HELD;
}
-static void
+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";
if ( __kmp_get_drdpa_lock_owner( lck ) != gtid ) {
KMP_FATAL( LockUnsettingSetByAnother, func );
}
- __kmp_release_nested_drdpa_lock( lck, gtid );
+ return __kmp_release_nested_drdpa_lock( lck, gtid );
}
void
void ( *__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;
-void ( *__kmp_release_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;
void ( *__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;
-void ( *__kmp_release_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;
extern void __kmp_acquire_tas_lock( kmp_tas_lock_t *lck, kmp_int32 gtid );
extern int __kmp_test_tas_lock( kmp_tas_lock_t *lck, kmp_int32 gtid );
-extern void __kmp_release_tas_lock( kmp_tas_lock_t *lck, kmp_int32 gtid );
+extern int __kmp_release_tas_lock( kmp_tas_lock_t *lck, kmp_int32 gtid );
extern void __kmp_init_tas_lock( kmp_tas_lock_t *lck );
extern void __kmp_destroy_tas_lock( kmp_tas_lock_t *lck );
extern void __kmp_acquire_nested_tas_lock( kmp_tas_lock_t *lck, kmp_int32 gtid );
extern int __kmp_test_nested_tas_lock( kmp_tas_lock_t *lck, kmp_int32 gtid );
-extern void __kmp_release_nested_tas_lock( kmp_tas_lock_t *lck, kmp_int32 gtid );
+extern int __kmp_release_nested_tas_lock( kmp_tas_lock_t *lck, kmp_int32 gtid );
extern void __kmp_init_nested_tas_lock( kmp_tas_lock_t *lck );
extern void __kmp_destroy_nested_tas_lock( kmp_tas_lock_t *lck );
+#define KMP_LOCK_RELEASED 1
+#define KMP_LOCK_STILL_HELD 0
+
#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM || KMP_ARCH_AARCH64)
extern void __kmp_acquire_futex_lock( kmp_futex_lock_t *lck, kmp_int32 gtid );
extern int __kmp_test_futex_lock( kmp_futex_lock_t *lck, kmp_int32 gtid );
-extern void __kmp_release_futex_lock( kmp_futex_lock_t *lck, kmp_int32 gtid );
+extern int __kmp_release_futex_lock( kmp_futex_lock_t *lck, kmp_int32 gtid );
extern void __kmp_init_futex_lock( kmp_futex_lock_t *lck );
extern void __kmp_destroy_futex_lock( kmp_futex_lock_t *lck );
extern void __kmp_acquire_nested_futex_lock( kmp_futex_lock_t *lck, kmp_int32 gtid );
extern int __kmp_test_nested_futex_lock( kmp_futex_lock_t *lck, kmp_int32 gtid );
-extern void __kmp_release_nested_futex_lock( kmp_futex_lock_t *lck, kmp_int32 gtid );
+extern int __kmp_release_nested_futex_lock( kmp_futex_lock_t *lck, kmp_int32 gtid );
extern void __kmp_init_nested_futex_lock( kmp_futex_lock_t *lck );
extern void __kmp_destroy_nested_futex_lock( kmp_futex_lock_t *lck );
extern void __kmp_acquire_ticket_lock( kmp_ticket_lock_t *lck, kmp_int32 gtid );
extern int __kmp_test_ticket_lock( kmp_ticket_lock_t *lck, kmp_int32 gtid );
extern int __kmp_test_ticket_lock_with_cheks( kmp_ticket_lock_t *lck, kmp_int32 gtid );
-extern void __kmp_release_ticket_lock( kmp_ticket_lock_t *lck, kmp_int32 gtid );
+extern int __kmp_release_ticket_lock( kmp_ticket_lock_t *lck, kmp_int32 gtid );
extern void __kmp_init_ticket_lock( kmp_ticket_lock_t *lck );
extern void __kmp_destroy_ticket_lock( kmp_ticket_lock_t *lck );
extern void __kmp_acquire_nested_ticket_lock( kmp_ticket_lock_t *lck, kmp_int32 gtid );
extern int __kmp_test_nested_ticket_lock( kmp_ticket_lock_t *lck, kmp_int32 gtid );
-extern void __kmp_release_nested_ticket_lock( kmp_ticket_lock_t *lck, kmp_int32 gtid );
+extern int __kmp_release_nested_ticket_lock( kmp_ticket_lock_t *lck, kmp_int32 gtid );
extern void __kmp_init_nested_ticket_lock( kmp_ticket_lock_t *lck );
extern void __kmp_destroy_nested_ticket_lock( kmp_ticket_lock_t *lck );
extern void __kmp_acquire_queuing_lock( kmp_queuing_lock_t *lck, kmp_int32 gtid );
extern int __kmp_test_queuing_lock( kmp_queuing_lock_t *lck, kmp_int32 gtid );
-extern void __kmp_release_queuing_lock( kmp_queuing_lock_t *lck, kmp_int32 gtid );
+extern int __kmp_release_queuing_lock( kmp_queuing_lock_t *lck, kmp_int32 gtid );
extern void __kmp_init_queuing_lock( kmp_queuing_lock_t *lck );
extern void __kmp_destroy_queuing_lock( kmp_queuing_lock_t *lck );
extern void __kmp_acquire_nested_queuing_lock( kmp_queuing_lock_t *lck, kmp_int32 gtid );
extern int __kmp_test_nested_queuing_lock( kmp_queuing_lock_t *lck, kmp_int32 gtid );
-extern void __kmp_release_nested_queuing_lock( kmp_queuing_lock_t *lck, kmp_int32 gtid );
+extern int __kmp_release_nested_queuing_lock( kmp_queuing_lock_t *lck, kmp_int32 gtid );
extern void __kmp_init_nested_queuing_lock( kmp_queuing_lock_t *lck );
extern void __kmp_destroy_nested_queuing_lock( kmp_queuing_lock_t *lck );
extern void __kmp_acquire_drdpa_lock( kmp_drdpa_lock_t *lck, kmp_int32 gtid );
extern int __kmp_test_drdpa_lock( kmp_drdpa_lock_t *lck, kmp_int32 gtid );
-extern void __kmp_release_drdpa_lock( kmp_drdpa_lock_t *lck, kmp_int32 gtid );
+extern int __kmp_release_drdpa_lock( kmp_drdpa_lock_t *lck, kmp_int32 gtid );
extern void __kmp_init_drdpa_lock( kmp_drdpa_lock_t *lck );
extern void __kmp_destroy_drdpa_lock( kmp_drdpa_lock_t *lck );
extern void __kmp_acquire_nested_drdpa_lock( kmp_drdpa_lock_t *lck, kmp_int32 gtid );
extern int __kmp_test_nested_drdpa_lock( kmp_drdpa_lock_t *lck, kmp_int32 gtid );
-extern void __kmp_release_nested_drdpa_lock( kmp_drdpa_lock_t *lck, kmp_int32 gtid );
+extern int __kmp_release_nested_drdpa_lock( kmp_drdpa_lock_t *lck, kmp_int32 gtid );
extern void __kmp_init_nested_drdpa_lock( kmp_drdpa_lock_t *lck );
extern void __kmp_destroy_nested_drdpa_lock( kmp_drdpa_lock_t *lck );
}
#endif
-extern void ( *__kmp_release_user_lock_with_checks_ )( kmp_user_lock_p lck, kmp_int32 gtid );
+extern int ( *__kmp_release_user_lock_with_checks_ )( kmp_user_lock_p lck, kmp_int32 gtid );
static inline void
__kmp_release_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid )
}
#endif
-extern void ( *__kmp_release_nested_user_lock_with_checks_ )( kmp_user_lock_p lck, kmp_int32 gtid );
+extern int ( *__kmp_release_nested_user_lock_with_checks_ )( kmp_user_lock_p lck, kmp_int32 gtid );
-static inline void
+static inline int
__kmp_release_nested_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid )
{
KMP_DEBUG_ASSERT( __kmp_release_nested_user_lock_with_checks_ != NULL );
- ( *__kmp_release_nested_user_lock_with_checks_ )( lck, gtid );
+ return ( *__kmp_release_nested_user_lock_with_checks_ )( lck, gtid );
}
extern void ( *__kmp_init_nested_user_lock_with_checks_ )( kmp_user_lock_p lck );
#define KMP_BIND_USER_LOCK_TEMPLATE(nest, kind, suffix) { \
__kmp_acquire##nest##user_lock_with_checks_ = ( void (*)( kmp_user_lock_p, kmp_int32 ) ) \
__kmp_acquire##nest##kind##_##suffix; \
- __kmp_release##nest##user_lock_with_checks_ = ( void (*)( kmp_user_lock_p, kmp_int32 ) ) \
+ __kmp_release##nest##user_lock_with_checks_ = ( int (*)( kmp_user_lock_p, kmp_int32 ) ) \
__kmp_release##nest##kind##_##suffix; \
__kmp_test##nest##user_lock_with_checks_ = ( int (*)( kmp_user_lock_p, kmp_int32 ) ) \
__kmp_test##nest##kind##_##suffix; \