diff --git a/.github/workflows/compile.yml b/.github/workflows/compile.yml index fa19e82..96eb525 100644 --- a/.github/workflows/compile.yml +++ b/.github/workflows/compile.yml @@ -30,8 +30,9 @@ jobs: - macOS-11 - macOS-12 go: - - 1.18 - - 1.19 + - '^1.18' + - '^1.19' + - '^1.20' steps: - name: Check out repository code uses: actions/checkout@v3 diff --git a/example/gui-linux/go.mod b/example/gui-linux/go.mod index 53365d7..38020f8 100644 --- a/example/gui-linux/go.mod +++ b/example/gui-linux/go.mod @@ -10,6 +10,7 @@ require ( ) require ( + github.com/Code-Hex/go-infinity-channel v1.0.0 // indirect github.com/mattn/go-isatty v0.0.14 // indirect golang.org/x/mod v0.6.0 // indirect golang.org/x/sys v0.1.0 // indirect diff --git a/example/gui-linux/go.sum b/example/gui-linux/go.sum index f99ccc1..3ad1b51 100644 --- a/example/gui-linux/go.sum +++ b/example/gui-linux/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= github.com/Songmu/prompter v0.5.1 h1:IAsttKsOZWSDw7bV1mtGn9TAmLFAjXbp9I/eYmUUogo= github.com/Songmu/prompter v0.5.1/go.mod h1:CS3jEPD6h9IaLaG6afrl1orTgII9+uDWuw95dr6xHSw= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= diff --git a/example/linux/go.mod b/example/linux/go.mod index ae31b37..88d45df 100644 --- a/example/linux/go.mod +++ b/example/linux/go.mod @@ -10,4 +10,7 @@ require ( golang.org/x/sys v0.1.0 ) -require golang.org/x/mod v0.6.0 // indirect +require ( + github.com/Code-Hex/go-infinity-channel v1.0.0 // indirect + golang.org/x/mod v0.6.0 // indirect +) diff --git a/example/linux/go.sum b/example/linux/go.sum index cae5519..f062a35 100644 --- a/example/linux/go.sum +++ b/example/linux/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= github.com/pkg/term v1.1.0 h1:xIAAdCMh3QIAy+5FrE8Ad8XoDhEU4ufwbaSozViP9kk= github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= diff --git a/example/macOS/go.mod b/example/macOS/go.mod index d2696cb..e6cf175 100644 --- a/example/macOS/go.mod +++ b/example/macOS/go.mod @@ -6,4 +6,7 @@ replace github.com/Code-Hex/vz/v3 => ../../ require github.com/Code-Hex/vz/v3 v3.0.0-00010101000000-000000000000 -require golang.org/x/mod v0.6.0 // indirect +require ( + github.com/Code-Hex/go-infinity-channel v1.0.0 // indirect + golang.org/x/mod v0.6.0 // indirect +) diff --git a/example/macOS/go.sum b/example/macOS/go.sum index e023a39..c24632f 100644 --- a/example/macOS/go.sum +++ b/example/macOS/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/mod v0.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I= golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= 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.