File tree Expand file tree Collapse file tree 3 files changed +47
-45
lines changed Expand file tree Collapse file tree 3 files changed +47
-45
lines changed Original file line number Diff line number Diff line change
1
+ package task
2
+
3
+ type Mutex struct {
4
+ locked bool
5
+ blocked Stack
6
+ }
7
+
8
+ func (m * Mutex ) Lock () {
9
+ if m .locked {
10
+ // Push self onto stack of blocked tasks, and wait to be resumed.
11
+ m .blocked .Push (Current ())
12
+ Pause ()
13
+ return
14
+ }
15
+
16
+ m .locked = true
17
+ }
18
+
19
+ func (m * Mutex ) Unlock () {
20
+ if ! m .locked {
21
+ panic ("sync: unlock of unlocked Mutex" )
22
+ }
23
+
24
+ // Wake up a blocked task, if applicable.
25
+ if t := m .blocked .Pop (); t != nil {
26
+ scheduleTask (t )
27
+ } else {
28
+ m .locked = false
29
+ }
30
+ }
31
+
32
+ // TryLock tries to lock m and reports whether it succeeded.
33
+ //
34
+ // Note that while correct uses of TryLock do exist, they are rare,
35
+ // and use of TryLock is often a sign of a deeper problem
36
+ // in a particular use of mutexes.
37
+ func (m * Mutex ) TryLock () bool {
38
+ if m .locked {
39
+ return false
40
+ }
41
+ m .Lock ()
42
+ return true
43
+ }
Original file line number Diff line number Diff line change @@ -89,3 +89,6 @@ func (c *Cond) Wait() {
89
89
// signal.
90
90
task .Pause ()
91
91
}
92
+
93
+ //go:linkname scheduleTask runtime.scheduleTask
94
+ func scheduleTask (* task.Task )
Original file line number Diff line number Diff line change @@ -2,53 +2,9 @@ package sync
2
2
3
3
import (
4
4
"internal/task"
5
- _ "unsafe"
6
5
)
7
6
8
- type Mutex struct {
9
- locked bool
10
- blocked task.Stack
11
- }
12
-
13
- //go:linkname scheduleTask runtime.scheduleTask
14
- func scheduleTask (* task.Task )
15
-
16
- func (m * Mutex ) Lock () {
17
- if m .locked {
18
- // Push self onto stack of blocked tasks, and wait to be resumed.
19
- m .blocked .Push (task .Current ())
20
- task .Pause ()
21
- return
22
- }
23
-
24
- m .locked = true
25
- }
26
-
27
- func (m * Mutex ) Unlock () {
28
- if ! m .locked {
29
- panic ("sync: unlock of unlocked Mutex" )
30
- }
31
-
32
- // Wake up a blocked task, if applicable.
33
- if t := m .blocked .Pop (); t != nil {
34
- scheduleTask (t )
35
- } else {
36
- m .locked = false
37
- }
38
- }
39
-
40
- // TryLock tries to lock m and reports whether it succeeded.
41
- //
42
- // Note that while correct uses of TryLock do exist, they are rare,
43
- // and use of TryLock is often a sign of a deeper problem
44
- // in a particular use of mutexes.
45
- func (m * Mutex ) TryLock () bool {
46
- if m .locked {
47
- return false
48
- }
49
- m .Lock ()
50
- return true
51
- }
7
+ type Mutex = task.Mutex
52
8
53
9
type RWMutex struct {
54
10
// waitingWriters are all of the tasks waiting for write locks.
You can’t perform that action at this time.
0 commit comments