@@ -16,6 +16,7 @@ package kernel
16
16
17
17
import (
18
18
"gvisor.dev/gvisor/pkg/abi/linux"
19
+ "gvisor.dev/gvisor/pkg/atomicbitops"
19
20
"gvisor.dev/gvisor/pkg/bits"
20
21
)
21
22
@@ -49,7 +50,7 @@ type pendingSignals struct {
49
50
50
51
// Bit i of pendingSet is set iff there is at least one signal with signo
51
52
// i+1 pending.
52
- pendingSet linux. SignalSet `state:"manual"`
53
+ pendingSet atomicbitops. Uint64 `state:"manual"`
53
54
}
54
55
55
56
// pendingSignalQueue holds a pendingSignalList for a single signal number.
@@ -86,7 +87,7 @@ func (p *pendingSignals) enqueue(info *linux.SignalInfo, timer *IntervalTimer) b
86
87
}
87
88
q .pendingSignalList .PushBack (& pendingSignal {SignalInfo : info , timer : timer })
88
89
q .length ++
89
- p .pendingSet |= linux .SignalSetOf (sig )
90
+ p .pendingSet . Store ( p . pendingSet . RacyLoad () | uint64 ( linux .SignalSetOf (sig )) )
90
91
return true
91
92
}
92
93
@@ -103,7 +104,7 @@ func (p *pendingSignals) dequeue(mask linux.SignalSet) *linux.SignalInfo {
103
104
// process, POSIX leaves it unspecified which is delivered first. Linux,
104
105
// like many other implementations, gives priority to standard signals in
105
106
// this case." - signal(7)
106
- lowestPendingUnblockedBit := bits .TrailingZeros64 (uint64 ( p .pendingSet &^ mask ))
107
+ lowestPendingUnblockedBit := bits .TrailingZeros64 (p .pendingSet . RacyLoad () &^ uint64 ( mask ))
107
108
if lowestPendingUnblockedBit >= linux .SignalMaximum {
108
109
return nil
109
110
}
@@ -119,7 +120,7 @@ func (p *pendingSignals) dequeueSpecific(sig linux.Signal) *linux.SignalInfo {
119
120
q .pendingSignalList .Remove (ps )
120
121
q .length --
121
122
if q .length == 0 {
122
- p .pendingSet &^= linux .SignalSetOf (sig )
123
+ p .pendingSet . Store ( p . pendingSet . RacyLoad () &^ uint64 ( linux .SignalSetOf (sig )) )
123
124
}
124
125
if ps .timer != nil {
125
126
ps .timer .updateDequeuedSignalLocked (ps .SignalInfo )
@@ -137,5 +138,5 @@ func (p *pendingSignals) discardSpecific(sig linux.Signal) {
137
138
}
138
139
q .pendingSignalList .Reset ()
139
140
q .length = 0
140
- p .pendingSet &^= linux .SignalSetOf (sig )
141
+ p .pendingSet . Store ( p . pendingSet . RacyLoad () &^ uint64 ( linux .SignalSetOf (sig )) )
141
142
}
0 commit comments