Do not set finalizer on p9.ClientFile.

Aside from the performance hit, there is no guarantee that p9.ClientFile's
finalizer runs before the associated p9.Client is closed.

PiperOrigin-RevId: 280702509
This commit is contained in:
Jamie Liu 2019-11-15 11:39:25 -08:00 committed by gVisor bot
parent 23574b1b87
commit 76039f8959
1 changed files with 1 additions and 9 deletions

View File

@ -17,7 +17,6 @@ package p9
import ( import (
"fmt" "fmt"
"io" "io"
"runtime"
"sync/atomic" "sync/atomic"
"syscall" "syscall"
@ -45,15 +44,10 @@ func (c *Client) Attach(name string) (File, error) {
// newFile returns a new client file. // newFile returns a new client file.
func (c *Client) newFile(fid FID) *clientFile { func (c *Client) newFile(fid FID) *clientFile {
cf := &clientFile{ return &clientFile{
client: c, client: c,
fid: fid, fid: fid,
} }
// Make sure the file is closed.
runtime.SetFinalizer(cf, (*clientFile).Close)
return cf
} }
// clientFile is provided to clients. // clientFile is provided to clients.
@ -192,7 +186,6 @@ func (c *clientFile) Remove() error {
if !atomic.CompareAndSwapUint32(&c.closed, 0, 1) { if !atomic.CompareAndSwapUint32(&c.closed, 0, 1) {
return syscall.EBADF return syscall.EBADF
} }
runtime.SetFinalizer(c, nil)
// Send the remove message. // Send the remove message.
if err := c.client.sendRecv(&Tremove{FID: c.fid}, &Rremove{}); err != nil { if err := c.client.sendRecv(&Tremove{FID: c.fid}, &Rremove{}); err != nil {
@ -214,7 +207,6 @@ func (c *clientFile) Close() error {
if !atomic.CompareAndSwapUint32(&c.closed, 0, 1) { if !atomic.CompareAndSwapUint32(&c.closed, 0, 1) {
return syscall.EBADF return syscall.EBADF
} }
runtime.SetFinalizer(c, nil)
// Send the close message. // Send the close message.
if err := c.client.sendRecv(&Tclunk{FID: c.fid}, &Rclunk{}); err != nil { if err := c.client.sendRecv(&Tclunk{FID: c.fid}, &Rclunk{}); err != nil {