Rolled back some stuff here like the package stuff
This will add support to view live data
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
package sharedMem
|
||||
|
||||
import (
|
||||
"io"
|
||||
"log"
|
||||
|
||||
"golang.org/x/sys/windows"
|
||||
)
|
||||
|
||||
type shmi struct {
|
||||
h windows.Handle
|
||||
v uintptr
|
||||
size uint32
|
||||
}
|
||||
|
||||
// create shared memory. return shmi object.
|
||||
func create(name string, size uint32) (*shmi, error) {
|
||||
fnPtr, _ := windows.UTF16PtrFromString(name)
|
||||
|
||||
flProtect := uint32(windows.PAGE_READONLY)
|
||||
|
||||
h, errno := windows.CreateFileMapping(
|
||||
windows.InvalidHandle,
|
||||
nil,
|
||||
flProtect,
|
||||
0,
|
||||
size,
|
||||
fnPtr)
|
||||
if h == 0 {
|
||||
log.Fatal("could not open memmap file: ", errno)
|
||||
}
|
||||
|
||||
addr, errno := windows.MapViewOfFile(h,
|
||||
windows.FILE_MAP_READ,
|
||||
0,
|
||||
0,
|
||||
uintptr(size))
|
||||
if addr == 0 {
|
||||
log.Printf("error in MapViewOfFile: %v", errno)
|
||||
}
|
||||
|
||||
return &shmi{h, addr, size}, nil
|
||||
}
|
||||
|
||||
// open shared memory. return shmi object.
|
||||
func open(name string, size uint32) (*shmi, error) {
|
||||
return create(name, size)
|
||||
}
|
||||
|
||||
func (o *shmi) close() error {
|
||||
if o.v != uintptr(0) {
|
||||
windows.UnmapViewOfFile(o.v)
|
||||
o.v = uintptr(0)
|
||||
}
|
||||
if o.h != windows.InvalidHandle {
|
||||
windows.CloseHandle(o.h)
|
||||
o.h = windows.InvalidHandle
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// read shared memory. return read size.
|
||||
func (o *shmi) readAt(p []byte, off int64) (n int, err error) {
|
||||
if off >= int64(o.size) {
|
||||
return 0, io.EOF
|
||||
}
|
||||
if max := int64(o.size) - off; int64(len(p)) > max {
|
||||
p = p[:max]
|
||||
}
|
||||
return copyPtr2Slice(o.v, p, off, o.size), nil
|
||||
}
|
||||
|
||||
// write shared memory. return write size.
|
||||
func (o *shmi) writeAt(p []byte, off int64) (n int, err error) {
|
||||
if off >= int64(o.size) {
|
||||
return 0, io.EOF
|
||||
}
|
||||
if max := int64(o.size) - off; int64(len(p)) > max {
|
||||
p = p[:max]
|
||||
}
|
||||
return copySlice2Ptr(p, o.v, off, o.size), nil
|
||||
}
|
||||
Reference in New Issue
Block a user