mirror of https://github.com/pkg/sftp.git
better request copy code
With state's lock as a pointer, we can use the `*r = *r2` statement for copying which is much more concise and future proof.
This commit is contained in:
parent
50208af173
commit
353daee2bc
|
@ -83,7 +83,8 @@ func (rs *RequestServer) getRequest(handle, method string) (*Request, bool) {
|
||||||
if !ok || r.Method == method { // re-check needed b/c lock race
|
if !ok || r.Method == method { // re-check needed b/c lock race
|
||||||
return r, ok
|
return r, ok
|
||||||
}
|
}
|
||||||
r = &Request{Method: method, Filepath: r.Filepath, state: r.state}
|
r = r.copy()
|
||||||
|
r.Method = method
|
||||||
rs.openRequests[handle] = r
|
rs.openRequests[handle] = r
|
||||||
return r, ok
|
return r, ok
|
||||||
}
|
}
|
||||||
|
|
23
request.go
23
request.go
|
@ -65,6 +65,15 @@ func NewRequest(method, path string) *Request {
|
||||||
state: state{RWMutex: new(sync.RWMutex)}}
|
state: state{RWMutex: new(sync.RWMutex)}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// shallow copy of existing request
|
||||||
|
func (r *Request) copy() *Request {
|
||||||
|
r.state.Lock()
|
||||||
|
defer r.state.Unlock()
|
||||||
|
r2 := new(Request)
|
||||||
|
*r2 = *r
|
||||||
|
return r2
|
||||||
|
}
|
||||||
|
|
||||||
// Context returns the request's context. To change the context,
|
// Context returns the request's context. To change the context,
|
||||||
// use WithContext.
|
// use WithContext.
|
||||||
//
|
//
|
||||||
|
@ -86,17 +95,9 @@ func (r *Request) WithContext(ctx context.Context) *Request {
|
||||||
if ctx == nil {
|
if ctx == nil {
|
||||||
panic("nil context")
|
panic("nil context")
|
||||||
}
|
}
|
||||||
r.state.Lock()
|
r2 := r.copy()
|
||||||
defer r.state.Unlock()
|
r2.ctx = ctx
|
||||||
r2 := &Request{
|
r2.cancelCtx = nil
|
||||||
Method: r.Method,
|
|
||||||
Filepath: r.Filepath,
|
|
||||||
Target: r.Target,
|
|
||||||
Flags: r.Flags,
|
|
||||||
Attrs: r.Attrs,
|
|
||||||
state: r.state,
|
|
||||||
ctx: ctx,
|
|
||||||
}
|
|
||||||
return r2
|
return r2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue