diff --git a/go.mod b/go.mod index cbbd1b9..661bde9 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/Code-Hex/vz/v3 go 1.19 require ( + github.com/Code-Hex/go-infinity-channel v1.0.0 golang.org/x/crypto v0.1.0 golang.org/x/mod v0.6.0 ) diff --git a/go.sum b/go.sum index be7c91f..04a6d08 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +github.com/Code-Hex/go-infinity-channel v1.0.0 h1:M8BWlfDOxq9or9yvF9+YkceoTkDI1pFAqvnP87Zh0Nw= +github.com/Code-Hex/go-infinity-channel v1.0.0/go.mod h1:5yUVg/Fqao9dAjcpzoQ33WwfdMWmISOrQloDRn3bsvY= golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/mod v0.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I= diff --git a/virtualization.go b/virtualization.go index 4091c77..0cb9d61 100644 --- a/virtualization.go +++ b/virtualization.go @@ -13,6 +13,7 @@ import ( "sync" "unsafe" + infinity "github.com/Code-Hex/go-infinity-channel" "github.com/Code-Hex/vz/v3/internal/objc" ) @@ -81,7 +82,7 @@ type VirtualMachine struct { type machineState struct { state VirtualMachineState - stateNotify chan VirtualMachineState + stateNotify *infinity.Channel[VirtualMachineState] mu sync.RWMutex } @@ -104,7 +105,7 @@ func NewVirtualMachine(config *VirtualMachineConfiguration) (*VirtualMachine, er stateHandle := cgo.NewHandle(&machineState{ state: VirtualMachineState(0), - stateNotify: make(chan VirtualMachineState), + stateNotify: infinity.NewChannel[VirtualMachineState](), }) v := &VirtualMachine{ @@ -160,8 +161,7 @@ func changeStateOnObserver(newStateRaw C.int, cgoHandlerPtr unsafe.Pointer) { v.mu.Lock() newState := VirtualMachineState(newStateRaw) v.state = newState - // for non-blocking - go func() { v.stateNotify <- newState }() + v.stateNotify.In() <- newState v.mu.Unlock() } @@ -188,7 +188,7 @@ func (v *VirtualMachine) StateChangedNotify() <-chan VirtualMachineState { val, _ := v.stateHandle.Value().(*machineState) val.mu.RLock() defer val.mu.RUnlock() - return val.stateNotify + return val.stateNotify.Out() } // CanStart returns true if the machine is in a state that can be started.