mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Add S/R support for FIOASYNC
PiperOrigin-RevId: 215655197 Change-Id: I668b1bc7c29daaf2999f8f759138bcbb09c4de6f
This commit is contained in:
@@ -85,6 +85,9 @@ type File struct {
|
||||
// async handles O_ASYNC notifications.
|
||||
async FileAsync
|
||||
|
||||
// saving indicates that this file is in the process of being saved.
|
||||
saving bool `state:"nosave"`
|
||||
|
||||
// mu is dual-purpose: first, to make read(2) and write(2) thread-safe
|
||||
// in conformity with POSIX, and second, to cancel operations before they
|
||||
// begin in response to interruptions (i.e. signals).
|
||||
@@ -127,10 +130,15 @@ func (f *File) DecRef() {
|
||||
// Release a reference on the Dirent.
|
||||
f.Dirent.DecRef()
|
||||
|
||||
// Only unregister if we are currently registered. There is nothing
|
||||
// to register if f.async is nil (this happens when async mode is
|
||||
// enabled without setting an owner). Also, we unregister during
|
||||
// save.
|
||||
f.flagsMu.Lock()
|
||||
if f.flags.Async && f.async != nil {
|
||||
if !f.saving && f.flags.Async && f.async != nil {
|
||||
f.async.Unregister(f)
|
||||
}
|
||||
f.async = nil
|
||||
f.flagsMu.Unlock()
|
||||
})
|
||||
}
|
||||
|
||||
@@ -14,7 +14,18 @@
|
||||
|
||||
package fs
|
||||
|
||||
// beforeSave is invoked by stateify.
|
||||
func (f *File) beforeSave() {
|
||||
f.saving = true
|
||||
if f.flags.Async && f.async != nil {
|
||||
f.async.Unregister(f)
|
||||
}
|
||||
}
|
||||
|
||||
// afterLoad is invoked by stateify.
|
||||
func (f *File) afterLoad() {
|
||||
f.mu.Init()
|
||||
if f.flags.Async && f.async != nil {
|
||||
f.async.Register(f)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,8 +32,10 @@ func New() fs.FileAsync {
|
||||
}
|
||||
|
||||
// FileAsync sends signals when the registered file is ready for IO.
|
||||
//
|
||||
// +stateify savable
|
||||
type FileAsync struct {
|
||||
mu sync.Mutex
|
||||
mu sync.Mutex `state:"nosave"`
|
||||
e waiter.Entry
|
||||
requester *auth.Credentials
|
||||
|
||||
|
||||
@@ -113,6 +113,8 @@ type EntryCallback interface {
|
||||
// Entry represents a waiter that can be add to the a wait queue. It can
|
||||
// only be in one queue at a time, and is added "intrusively" to the queue with
|
||||
// no extra memory allocations.
|
||||
//
|
||||
// +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.
|
||||
|
||||
Reference in New Issue
Block a user