Skip to content
Navigation Menu
Toggle navigation
Sign in
In this repository
All GitHub Enterprise
↵
Jump to
↵
No suggested jump to results
In this repository
All GitHub Enterprise
↵
Jump to
↵
In this organization
All GitHub Enterprise
↵
Jump to
↵
In this repository
All GitHub Enterprise
↵
Jump to
↵
Sign in
Reseting focus
You signed in with another tab or window.
Reload
to refresh your session.
You signed out in another tab or window.
Reload
to refresh your session.
You switched accounts on another tab or window.
Reload
to refresh your session.
Dismiss alert
{{ message }}
git-mirror
/
glibc
Public
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Pull requests
0
Actions
Projects
0
Security
Insights
Additional navigation options
Code
Pull requests
Actions
Projects
Security
Insights
Files
42bf1c8
Breadcrumbs
glibc
/
sysdeps
/
unix
/
sysv
/
linux
/
powerpc
/
elision-lock.c
Blame
Blame
Latest commit
History
History
82 lines (70 loc) · 2.36 KB
Breadcrumbs
glibc
/
sysdeps
/
unix
/
sysv
/
linux
/
powerpc
/
elision-lock.c
Top
File metadata and controls
Code
Blame
82 lines (70 loc) · 2.36 KB
Raw
/* elision-lock.c: Elided pthread mutex lock. Copyright (C) 2015-2016 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ #include <stdio.h> #include <pthread.h> #include <pthreadP.h> #include <lowlevellock.h> #include <elision-conf.h> #include "htm.h" #if !defined(LLL_LOCK) && !defined(EXTRAARG) /* Make sure the configuration code is always linked in for static libraries. */ #include "elision-conf.c" #endif #ifndef EXTRAARG # define EXTRAARG #endif #ifndef LLL_LOCK # define LLL_LOCK(a,b) lll_lock(a,b), 0 #endif #define aconf __elision_aconf /* Adaptive lock using transactions. By default the lock region is run as a transaction, and when it aborts or the lock is busy the lock adapts itself. */ int __lll_lock_elision (int *lock, short *adapt_count, EXTRAARG int pshared) { if (*adapt_count > 0) { goto use_lock; } for (int i = aconf.try_tbegin; i > 0; i--) { if (__libc_tbegin (0)) { if (*lock == 0) return 0; /* Lock was busy. Fall back to normal locking. */ __libc_tabort (_ABORT_LOCK_BUSY); } else { /* A persistent failure indicates that a retry will probably result in another failure. Use normal locking now and for the next couple of calls. */ if (_TEXASRU_FAILURE_PERSISTENT (__builtin_get_texasru ())) { if (aconf.skip_lock_internal_abort > 0) *adapt_count = aconf.skip_lock_internal_abort; goto use_lock; } } } /* Fall back to locks for a bit if retries have been exhausted */ if (aconf.try_tbegin > 0 && aconf.skip_lock_out_of_tbegin_retries > 0) *adapt_count = aconf.skip_lock_out_of_tbegin_retries; use_lock: return LLL_LOCK ((*lock), pshared); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
You can’t perform that action at this time.