Remove waiter.Entry.Context

This field is redundant since state can be stored in the callback.

PiperOrigin-RevId: 318134855
This commit is contained in:
Tamir Duberstein
2020-06-24 13:56:38 -07:00
committed by gVisor bot
parent b070e218c6
commit 10930b0f8c
3 changed files with 14 additions and 20 deletions
+7 -6
View File
@@ -271,11 +271,13 @@ func (e *EventPoll) ReadEvents(max int) []linux.EpollEvent {
// readyCallback is called when one of the files we're polling becomes ready. It
// moves said file to the readyList if it's currently in the waiting list.
type readyCallback struct{}
type readyCallback struct {
context *pollEntry
}
// Callback implements waiter.EntryCallback.Callback.
func (*readyCallback) Callback(w *waiter.Entry) {
entry := w.Context.(*pollEntry)
func (r *readyCallback) Callback(*waiter.Entry) {
entry := r.context
e := entry.epoll
e.listsMu.Lock()
@@ -310,7 +312,7 @@ func (e *EventPoll) initEntryReadiness(entry *pollEntry) {
// Check if the file happens to already be in a ready state.
ready := f.Readiness(entry.mask) & entry.mask
if ready != 0 {
(*readyCallback).Callback(nil, &entry.waiter)
(&readyCallback{context: entry}).Callback(&entry.waiter)
}
}
@@ -380,10 +382,9 @@ func (e *EventPoll) AddEntry(id FileIdentifier, flags EntryFlags, mask waiter.Ev
userData: data,
epoll: e,
flags: flags,
waiter: waiter.Entry{Callback: &readyCallback{}},
mask: mask,
}
entry.waiter.Context = entry
entry.waiter.Callback = &readyCallback{context: entry}
e.files[id] = entry
entry.file = refs.NewWeakRef(id.File, entry)
+1 -2
View File
@@ -21,8 +21,7 @@ import (
// afterLoad is invoked by stateify.
func (p *pollEntry) afterLoad() {
p.waiter = waiter.Entry{Callback: &readyCallback{}}
p.waiter.Context = p
p.waiter.Callback = &readyCallback{context: p}
p.file = refs.NewWeakRef(p.id.File, p)
p.id.File.EventRegister(&p.waiter, p.mask)
}
+6 -12
View File
@@ -128,13 +128,6 @@ type EntryCallback interface {
//
// +stateify savable
type Entry struct {
// Context stores any state the waiter may wish to store in the entry
// itself, which may be used at wake up time.
//
// Note that use of this field is optional and state may alternatively be
// stored in the callback itself.
Context interface{}
Callback EntryCallback
// The following fields are protected by the queue lock.
@@ -142,13 +135,14 @@ type Entry struct {
waiterEntry
}
type channelCallback struct{}
type channelCallback struct {
ch chan struct{}
}
// Callback implements EntryCallback.Callback.
func (*channelCallback) Callback(e *Entry) {
ch := e.Context.(chan struct{})
func (c *channelCallback) Callback(*Entry) {
select {
case ch <- struct{}{}:
case c.ch <- struct{}{}:
default:
}
}
@@ -164,7 +158,7 @@ func NewChannelEntry(c chan struct{}) (Entry, chan struct{}) {
c = make(chan struct{}, 1)
}
return Entry{Context: c, Callback: &channelCallback{}}, c
return Entry{Callback: &channelCallback{ch: c}}, c
}
// Queue represents the wait queue where waiters can be added and