Commit 7f2fe96f authored by Aaron Jacobs's avatar Aaron Jacobs

Don't call Respond methods via reflect.Value.Call.

It allocates for each call, which is a drag.
parents f004d3ff 894e5ffb
......@@ -30,10 +30,8 @@ import (
type internalOp interface {
Op
// Convert to a bazilfuse response compatible with the Respond method on the
// wrapped bazilfuse request. If that Respond method takes no arguments,
// return nil.
toBazilfuseResponse() interface{}
// Respond to the underlying bazilfuse request, successfully.
respond()
}
// A helper for embedding common behavior.
......@@ -134,7 +132,7 @@ func (o *commonOp) Respond(err error) {
// If successful, we should respond to bazilfuse with the appropriate struct.
if err == nil {
o.sendBazilfuseResponse(o.op.toBazilfuseResponse())
o.op.respond()
return
}
......@@ -156,28 +154,3 @@ func (o *commonOp) Respond(err error) {
// Send a response to the kernel.
o.bazilReq.RespondError(err)
}
// Respond with the supplied response struct, which must be accepted by a
// method called Respond on o.bazilReq.
//
// Special case: nil means o.bazilReq.Respond accepts no parameters.
func (o *commonOp) sendBazilfuseResponse(resp interface{}) {
// Find the Respond method.
v := reflect.ValueOf(o.bazilReq)
respond := v.MethodByName("Respond")
// Special case: handle successful ops with no response struct.
if resp == nil {
o.Logf("-> (%s) OK", o.op.ShortDesc())
respond.Call([]reflect.Value{})
return
}
// Otherwise, send the response struct to the kernel.
if o.debugLog != nil {
o.Logf("-> %v", resp)
}
respond.Call([]reflect.Value{reflect.ValueOf(resp)})
}
......@@ -46,6 +46,7 @@ func Convert(
switch typed := r.(type) {
case *bazilfuse.LookupRequest:
to := &LookUpInodeOp{
bfReq: typed,
Parent: InodeID(typed.Header.Node),
Name: typed.Name,
}
......@@ -54,6 +55,7 @@ func Convert(
case *bazilfuse.GetattrRequest:
to := &GetInodeAttributesOp{
bfReq: typed,
Inode: InodeID(typed.Header.Node),
}
io = to
......@@ -61,6 +63,7 @@ func Convert(
case *bazilfuse.SetattrRequest:
to := &SetInodeAttributesOp{
bfReq: typed,
Inode: InodeID(typed.Header.Node),
}
......@@ -85,6 +88,7 @@ func Convert(
case *bazilfuse.ForgetRequest:
to := &ForgetInodeOp{
bfReq: typed,
Inode: InodeID(typed.Header.Node),
N: typed.N,
}
......@@ -93,6 +97,7 @@ func Convert(
case *bazilfuse.MkdirRequest:
to := &MkDirOp{
bfReq: typed,
Parent: InodeID(typed.Header.Node),
Name: typed.Name,
Mode: typed.Mode,
......@@ -102,6 +107,7 @@ func Convert(
case *bazilfuse.CreateRequest:
to := &CreateFileOp{
bfReq: typed,
Parent: InodeID(typed.Header.Node),
Name: typed.Name,
Mode: typed.Mode,
......@@ -112,6 +118,7 @@ func Convert(
case *bazilfuse.SymlinkRequest:
to := &CreateSymlinkOp{
bfReq: typed,
Parent: InodeID(typed.Header.Node),
Name: typed.NewName,
Target: typed.Target,
......@@ -121,6 +128,7 @@ func Convert(
case *bazilfuse.RenameRequest:
to := &RenameOp{
bfReq: typed,
OldParent: InodeID(typed.Header.Node),
OldName: typed.OldName,
NewParent: InodeID(typed.NewDir),
......@@ -132,6 +140,7 @@ func Convert(
case *bazilfuse.RemoveRequest:
if typed.Dir {
to := &RmDirOp{
bfReq: typed,
Parent: InodeID(typed.Header.Node),
Name: typed.Name,
}
......@@ -139,6 +148,7 @@ func Convert(
co = &to.commonOp
} else {
to := &UnlinkOp{
bfReq: typed,
Parent: InodeID(typed.Header.Node),
Name: typed.Name,
}
......@@ -149,6 +159,7 @@ func Convert(
case *bazilfuse.OpenRequest:
if typed.Dir {
to := &OpenDirOp{
bfReq: typed,
Inode: InodeID(typed.Header.Node),
Flags: typed.Flags,
}
......@@ -156,6 +167,7 @@ func Convert(
co = &to.commonOp
} else {
to := &OpenFileOp{
bfReq: typed,
Inode: InodeID(typed.Header.Node),
Flags: typed.Flags,
}
......@@ -166,6 +178,7 @@ func Convert(
case *bazilfuse.ReadRequest:
if typed.Dir {
to := &ReadDirOp{
bfReq: typed,
Inode: InodeID(typed.Header.Node),
Handle: HandleID(typed.Handle),
Offset: DirOffset(typed.Offset),
......@@ -175,6 +188,7 @@ func Convert(
co = &to.commonOp
} else {
to := &ReadFileOp{
bfReq: typed,
Inode: InodeID(typed.Header.Node),
Handle: HandleID(typed.Handle),
Offset: typed.Offset,
......@@ -187,12 +201,14 @@ func Convert(
case *bazilfuse.ReleaseRequest:
if typed.Dir {
to := &ReleaseDirHandleOp{
bfReq: typed,
Handle: HandleID(typed.Handle),
}
io = to
co = &to.commonOp
} else {
to := &ReleaseFileHandleOp{
bfReq: typed,
Handle: HandleID(typed.Handle),
}
io = to
......@@ -201,6 +217,7 @@ func Convert(
case *bazilfuse.WriteRequest:
to := &WriteFileOp{
bfReq: typed,
Inode: InodeID(typed.Header.Node),
Handle: HandleID(typed.Handle),
Data: typed.Data,
......@@ -217,6 +234,7 @@ func Convert(
co = &to.commonOp
} else {
to := &SyncFileOp{
bfReq: typed,
Inode: InodeID(typed.Header.Node),
Handle: HandleID(typed.Handle),
}
......@@ -226,6 +244,7 @@ func Convert(
case *bazilfuse.FlushRequest:
to := &FlushFileOp{
bfReq: typed,
Inode: InodeID(typed.Header.Node),
Handle: HandleID(typed.Handle),
}
......@@ -234,6 +253,7 @@ func Convert(
case *bazilfuse.ReadlinkRequest:
to := &ReadSymlinkOp{
bfReq: typed,
Inode: InodeID(typed.Header.Node),
}
io = to
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment