Skip to content

Commit fb5512f

Browse files
EtiennePerotgvisor-bot
authored andcommitted
Yield thread group leader *Task in TaskSet.ForEachThreadGroup.
This makes this function usable from outside of the `kernel` package without needing to call `tg.Leader()` (which requires a lock that `TaskSet.ForEachThreadGroup` already acquires). PiperOrigin-RevId: 720734630
1 parent 8bdf76c commit fb5512f

File tree

2 files changed

+7
-7
lines changed

2 files changed

+7
-7
lines changed

pkg/sentry/kernel/sessions.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ func (pg *ProcessGroup) handleOrphan() {
198198

199199
// See if there are any stopped jobs.
200200
hasStopped := false
201-
pg.originator.pidns.owner.forEachThreadGroupLocked(func(tg *ThreadGroup) {
201+
pg.originator.pidns.owner.forEachThreadGroupLocked(func(tg *ThreadGroup, _ *Task) {
202202
if tg.processGroup != pg {
203203
return
204204
}
@@ -213,13 +213,13 @@ func (pg *ProcessGroup) handleOrphan() {
213213
}
214214

215215
// Deliver appropriate signals to all thread groups.
216-
pg.originator.pidns.owner.forEachThreadGroupLocked(func(tg *ThreadGroup) {
216+
pg.originator.pidns.owner.forEachThreadGroupLocked(func(tg *ThreadGroup, tgLeader *Task) {
217217
if tg.processGroup != pg {
218218
return
219219
}
220220
tg.signalHandlers.mu.NestedLock(signalHandlersLockTg)
221-
tg.leader.sendSignalLocked(SignalInfoPriv(linux.SIGHUP), true /* group */)
222-
tg.leader.sendSignalLocked(SignalInfoPriv(linux.SIGCONT), true /* group */)
221+
tgLeader.sendSignalLocked(SignalInfoPriv(linux.SIGHUP), true /* group */)
222+
tgLeader.sendSignalLocked(SignalInfoPriv(linux.SIGCONT), true /* group */)
223223
tg.signalHandlers.mu.NestedUnlock(signalHandlersLockTg)
224224
})
225225

pkg/sentry/kernel/threads.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ func newTaskSet(pidns *PIDNamespace) *TaskSet {
113113
}
114114

115115
// ForEachThreadGroup applies f to each thread group in ts.
116-
func (ts *TaskSet) ForEachThreadGroup(f func(tg *ThreadGroup)) {
116+
func (ts *TaskSet) ForEachThreadGroup(f func(tg *ThreadGroup, tgLeader *Task)) {
117117
ts.mu.RLock()
118118
defer ts.mu.RUnlock()
119119
ts.forEachThreadGroupLocked(f)
@@ -122,9 +122,9 @@ func (ts *TaskSet) ForEachThreadGroup(f func(tg *ThreadGroup)) {
122122
// forEachThreadGroupLocked applies f to each thread group in ts.
123123
//
124124
// Preconditions: ts.mu must be locked (for reading or writing).
125-
func (ts *TaskSet) forEachThreadGroupLocked(f func(tg *ThreadGroup)) {
125+
func (ts *TaskSet) forEachThreadGroupLocked(f func(tg *ThreadGroup, tgLeader *Task)) {
126126
for tg := range ts.Root.tgids {
127-
f(tg)
127+
f(tg, tg.leader)
128128
}
129129
}
130130

0 commit comments

Comments
 (0)