| | |
| | | package shm |
| | | |
| | | import ( |
| | | "golang.org/x/sys/unix" |
| | | "os" |
| | | "sync/atomic" |
| | | "unsafe" |
| | | |
| | | "github.com/tmthrgd/go-sem" |
| | | "github.com/tmthrgd/go-shm" |
| | | "golang.org/x/sys/unix" |
| | | ) |
| | | |
| | | func CreateSimplex(name string, perm os.FileMode, blockCount, blockSize int) (*ReadWriteCloser, error) { |
| | |
| | | return nil, ErrNotMultipleOf64 |
| | | } |
| | | |
| | | file, err := shm.Open(name, unix.O_CREAT|unix.O_EXCL|unix.O_TRUNC|unix.O_RDWR, perm) |
| | | file, err := Open(name, unix.O_CREAT|unix.O_EXCL|unix.O_TRUNC|unix.O_RDWR, perm) |
| | | if err != nil { |
| | | return nil, err |
| | | } |
| | |
| | | */ |
| | | *(*uint32)(&shared.BlockCount), *(*uint64)(&shared.BlockSize) = uint32(blockCount), uint64(blockSize) |
| | | |
| | | if err = ((*sem.Semaphore)(&shared.SemSignal)).Init(0); err != nil { |
| | | if err = ((*Semaphore)(&shared.SemSignal)).Init(0); err != nil { |
| | | return nil, err |
| | | } |
| | | |
| | | if err = ((*sem.Semaphore)(&shared.SemAvail)).Init(0); err != nil { |
| | | if err = ((*Semaphore)(&shared.SemAvail)).Init(0); err != nil { |
| | | return nil, err |
| | | } |
| | | |
| | |
| | | return nil, ErrNotMultipleOf64 |
| | | } |
| | | |
| | | file, err := shm.Open(name, unix.O_CREAT|unix.O_EXCL|unix.O_TRUNC|unix.O_RDWR, perm) |
| | | file, err := Open(name, unix.O_CREAT|unix.O_EXCL|unix.O_TRUNC|unix.O_RDWR, perm) |
| | | if err != nil { |
| | | return nil, err |
| | | } |
| | |
| | | */ |
| | | *(*uint32)(&shared.BlockCount), *(*uint64)(&shared.BlockSize) = uint32(blockCount), uint64(blockSize) |
| | | |
| | | if err = ((*sem.Semaphore)(&shared.SemSignal)).Init(0); err != nil { |
| | | if err = ((*Semaphore)(&shared.SemSignal)).Init(0); err != nil { |
| | | return nil, err |
| | | } |
| | | |
| | | if err = ((*sem.Semaphore)(&shared.SemAvail)).Init(0); err != nil { |
| | | if err = ((*Semaphore)(&shared.SemAvail)).Init(0); err != nil { |
| | | return nil, err |
| | | } |
| | | |