Add S/R support for FIOASYNC

PiperOrigin-RevId: 215655197
Change-Id: I668b1bc7c29daaf2999f8f759138bcbb09c4de6f
This commit is contained in:
Ian Gudger
2018-10-03 17:03:09 -07:00
committed by Shentubot
parent 9f2ba6ac3e
commit 4fef31f96c
4 changed files with 25 additions and 2 deletions
+9 -1
View File
@@ -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()
})
}
+11
View File
@@ -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)
}
}
+3 -1
View File
@@ -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
+2
View File
@@ -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.