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:
parent
23574b1b87
commit
76039f8959
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue