Commit 20c6af8a authored by Geoff Simmons's avatar Geoff Simmons

Remove vsm.Pointer().

The VSM handle is exported as a field in struct VSM, for internal
use only.
parent ef3e8260
...@@ -140,20 +140,12 @@ func TestAttachInstance(t *testing.T) { ...@@ -140,20 +140,12 @@ func TestAttachInstance(t *testing.T) {
func TestPointer(t *testing.T) { func TestPointer(t *testing.T) {
v := New() v := New()
defer v.Destroy() defer v.Destroy()
p, err := v.Pointer() if v.VSM == nil {
if err != nil { t.Error("VSM handle is nil")
t.Error("Pointer():", err)
}
if p == nil {
t.Error("Pointer() returned nil")
} }
var n *VSM
if _, err := n.Pointer(); err == nil {
t.Error("expected nil.Pointer() to fail")
}
uninit := new(VSM) uninit := new(VSM)
if _, err := uninit.Pointer(); err == nil { if uninit.VSM != nil {
t.Error("expected uninitialized.Pointer() to fail") t.Error("expected uninitialized.VSM == nil")
} }
} }
...@@ -41,12 +41,13 @@ import ( ...@@ -41,12 +41,13 @@ import (
"errors" "errors"
"strconv" "strconv"
"time" "time"
"unsafe"
) )
// VSM provides methods for attaching to Varnish shared memory. // VSM provides methods for attaching to Varnish shared memory.
type VSM struct { type VSM struct {
vsm *C.struct_vsm // VSM is an native handle for use by other packages. Client
// code should never use it.
VSM *C.struct_vsm
} }
// New returns a new and initialied instance of VSM. Instances should // New returns a new and initialied instance of VSM. Instances should
...@@ -68,7 +69,7 @@ func (v *VSM) checkNil() error { ...@@ -68,7 +69,7 @@ func (v *VSM) checkNil() error {
if v == nil { if v == nil {
return errors.New("VSM object is nil") return errors.New("VSM object is nil")
} }
if v.vsm == nil { if v.VSM == nil {
return errors.New("VSM object was uninitialized via New()") return errors.New("VSM object was uninitialized via New()")
} }
return nil return nil
...@@ -81,7 +82,7 @@ func (v *VSM) Destroy() error { ...@@ -81,7 +82,7 @@ func (v *VSM) Destroy() error {
if err := v.checkNil(); err != nil { if err := v.checkNil(); err != nil {
return err return err
} }
C.VSM_Destroy(&v.vsm) C.VSM_Destroy(&v.VSM)
return nil return nil
} }
...@@ -91,7 +92,7 @@ func (v *VSM) Error() string { ...@@ -91,7 +92,7 @@ func (v *VSM) Error() string {
if err := v.checkNil(); err != nil { if err := v.checkNil(); err != nil {
return err.Error() return err.Error()
} }
return C.GoString(C.VSM_Error(v.vsm)) return C.GoString(C.VSM_Error(v.VSM))
} }
// AttachTmo sets the timeout for attaching to a Varnish instance. If // AttachTmo sets the timeout for attaching to a Varnish instance. If
...@@ -108,8 +109,8 @@ func (v *VSM) AttachTmo(tmo time.Duration) error { ...@@ -108,8 +109,8 @@ func (v *VSM) AttachTmo(tmo time.Duration) error {
if secs >= 0 { if secs >= 0 {
arg = strconv.FormatUint(uint64(secs), 10) arg = strconv.FormatUint(uint64(secs), 10)
} }
C.VSM_ResetError(v.vsm) C.VSM_ResetError(v.VSM)
if C.VSM_Arg(v.vsm, 't', C.CString(arg)) != 1 { if C.VSM_Arg(v.VSM, 't', C.CString(arg)) != 1 {
return v return v
} }
return nil return nil
...@@ -126,31 +127,22 @@ func (v *VSM) Attach(name string) error { ...@@ -126,31 +127,22 @@ func (v *VSM) Attach(name string) error {
return err return err
} }
if name != "" { if name != "" {
C.VSM_ResetError(v.vsm) C.VSM_ResetError(v.VSM)
if C.VSM_Arg(v.vsm, 'n', C.CString(name)) != 1 { if C.VSM_Arg(v.VSM, 'n', C.CString(name)) != 1 {
return v return v
} }
} }
C.VSM_ResetError(v.vsm) C.VSM_ResetError(v.VSM)
if C.VSM_Attach(v.vsm, C.int(-1)) != 0 { if C.VSM_Attach(v.VSM, C.int(-1)) != 0 {
return v return v
} }
return nil return nil
} }
// Pointer returns an internal pointer for use by other packages.
// Client code should never use it.
func (v *VSM) Pointer() (unsafe.Pointer, error) {
if err := v.checkNil(); err != nil {
return nil, err
}
return unsafe.Pointer(v.vsm), nil
}
/* /*
func (v *VSM) Get(class string, ident string) (string, error) { func (v *VSM) Get(class string, ident string) (string, error) {
var vf C.struct_vsm_fantom var vf C.struct_vsm_fantom
if C.VSM_Get(v.vsm, &vf, C.CString(class), C.CString(ident)) == 0 { if C.VSM_Get(v.VSM, &vf, C.CString(class), C.CString(ident)) == 0 {
return "", v return "", v
} }
return C.GoStringN(vf.b, vf.e - vf.b), nil return C.GoStringN(vf.b, vf.e - vf.b), nil
......
...@@ -456,20 +456,6 @@ func (log *Log) AttachTmo(tmo time.Duration) error { ...@@ -456,20 +456,6 @@ func (log *Log) AttachTmo(tmo time.Duration) error {
return log.vsm.AttachTmo(tmo) return log.vsm.AttachTmo(tmo)
} }
func (log *Log) setCursor() error {
p, err := log.vsm.Pointer()
if err != nil {
return err
}
vsmp := (*C.struct_vsm)(p)
C.VSL_ResetError(log.vsl)
log.cursor = C.VSL_CursorVSM(log.vsl, vsmp, log.vsmopts)
if log.cursor == nil {
return log
}
return nil
}
// Attach to an instance of Varnish -- varnishd with a running worker // Attach to an instance of Varnish -- varnishd with a running worker
// process. // process.
// //
...@@ -483,8 +469,14 @@ func (log *Log) Attach(name string) error { ...@@ -483,8 +469,14 @@ func (log *Log) Attach(name string) error {
if err := log.vsm.Attach(name); err != nil { if err := log.vsm.Attach(name); err != nil {
return err return err
} }
if err := log.setCursor(); err != nil { if log.vsm.VSM == nil {
return nil panic("VSM handle is nil")
}
C.VSL_ResetError(log.vsl)
log.cursor = C.VSL_CursorVSM(log.vsl, (*C.struct_vsm)(log.vsm.VSM),
log.vsmopts)
if log.cursor == nil {
return log
} }
return nil return nil
} }
......
...@@ -108,6 +108,7 @@ func TestAttach(t *testing.T) { ...@@ -108,6 +108,7 @@ func TestAttach(t *testing.T) {
defer s.Release() defer s.Release()
if err := s.Attach(""); err != nil { if err := s.Attach(""); err != nil {
t.Fatal("Attach(default):", err) t.Fatal("Attach(default):", err)
return
} }
var n *Stats var n *Stats
......
...@@ -410,9 +410,8 @@ func (stats *Stats) Attach(name string) error { ...@@ -410,9 +410,8 @@ func (stats *Stats) Attach(name string) error {
if err := stats.vsm.Attach(name); err != nil { if err := stats.vsm.Attach(name); err != nil {
return err return err
} }
p, err := stats.vsm.Pointer() if stats.vsm.VSM == nil {
if err != nil { panic("VSM handle is nil")
return err
} }
data := new(statsData) data := new(statsData)
...@@ -427,7 +426,8 @@ func (stats *Stats) Attach(name string) error { ...@@ -427,7 +426,8 @@ func (stats *Stats) Attach(name string) error {
dataMap.Store(key, data) dataMap.Store(key, data)
// Don't need the read lock here, because this is only called // Don't need the read lock here, because this is only called
// for Attach. // for Attach.
C.descriptions(stats.vsc, (*C.struct_vsm)(p), unsafe.Pointer(key)) C.descriptions(stats.vsc, (*C.struct_vsm)(stats.vsm.VSM),
unsafe.Pointer(key))
stats.names = data.names stats.names = data.names
stats.d9ns = data.d9ns stats.d9ns = data.d9ns
...@@ -496,11 +496,10 @@ func (stats *Stats) Release() { ...@@ -496,11 +496,10 @@ func (stats *Stats) Release() {
C.free(unsafe.Pointer(stats.vsc)) C.free(unsafe.Pointer(stats.vsc))
return return
} }
p, err := stats.vsm.Pointer() if stats.vsm.VSM == nil {
if err != nil { panic("VSM handle is nil")
panic(err)
} }
C.VSC_Destroy(&stats.vsc, (*C.struct_vsm)(p)) C.VSC_Destroy(&stats.vsc, (*C.struct_vsm)(stats.vsm.VSM))
// ignoring nil check errors // ignoring nil check errors
stats.vsm.Destroy() stats.vsm.Destroy()
} }
...@@ -583,13 +582,12 @@ func (stats *Stats) Read(rdHndlr ReadHandler) error { ...@@ -583,13 +582,12 @@ func (stats *Stats) Read(rdHndlr ReadHandler) error {
if stats.vsm == nil { if stats.vsm == nil {
return errors.New("not attached to a Varnish instance") return errors.New("not attached to a Varnish instance")
} }
if stats.vsm.VSM == nil {
panic("VSM handle is nil")
}
if rdHndlr == nil { if rdHndlr == nil {
return errors.New("callback is nil") return errors.New("callback is nil")
} }
p, err := stats.vsm.Pointer()
if err != nil {
return err
}
key, err := mkKey() key, err := mkKey()
if err != nil { if err != nil {
...@@ -598,7 +596,7 @@ func (stats *Stats) Read(rdHndlr ReadHandler) error { ...@@ -598,7 +596,7 @@ func (stats *Stats) Read(rdHndlr ReadHandler) error {
cbMap.Store(key, rdHndlr) cbMap.Store(key, rdHndlr)
stats.rdLock.Lock() stats.rdLock.Lock()
C.stats(stats.vsc, (*C.struct_vsm)(p), unsafe.Pointer(key)) C.stats(stats.vsc, (*C.struct_vsm)(stats.vsm.VSM), unsafe.Pointer(key))
stats.rdLock.Unlock() stats.rdLock.Unlock()
cbMap.Delete(key) cbMap.Delete(key)
......
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