forked from Code-Hex/vz
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmemory_balloon.go
More file actions
140 lines (119 loc) · 5.14 KB
/
memory_balloon.go
File metadata and controls
140 lines (119 loc) · 5.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package vz
/*
#cgo darwin CFLAGS: -mmacosx-version-min=11 -x objective-c -fno-objc-arc
#cgo darwin LDFLAGS: -lobjc -framework Foundation -framework Virtualization
# include "virtualization_11.h"
*/
import "C"
import (
"github.com/Code-Hex/vz/v3/internal/objc"
)
// MemoryBalloonDeviceConfiguration for a memory balloon device configuration.
type MemoryBalloonDeviceConfiguration interface {
objc.NSObject
memoryBalloonDeviceConfiguration()
}
type baseMemoryBalloonDeviceConfiguration struct{}
func (*baseMemoryBalloonDeviceConfiguration) memoryBalloonDeviceConfiguration() {}
var _ MemoryBalloonDeviceConfiguration = (*VirtioTraditionalMemoryBalloonDeviceConfiguration)(nil)
// VirtioTraditionalMemoryBalloonDeviceConfiguration is a configuration of the Virtio traditional memory balloon device.
//
// see: https://developer.apple.com/documentation/virtualization/vzvirtiotraditionalmemoryballoondeviceconfiguration?language=objc
type VirtioTraditionalMemoryBalloonDeviceConfiguration struct {
*pointer
*baseMemoryBalloonDeviceConfiguration
}
// NewVirtioTraditionalMemoryBalloonDeviceConfiguration creates a new VirtioTraditionalMemoryBalloonDeviceConfiguration.
//
// This is only supported on macOS 11 and newer, error will
// be returned on older versions.
func NewVirtioTraditionalMemoryBalloonDeviceConfiguration() (*VirtioTraditionalMemoryBalloonDeviceConfiguration, error) {
if err := macOSAvailable(11); err != nil {
return nil, err
}
config := &VirtioTraditionalMemoryBalloonDeviceConfiguration{
pointer: objc.NewPointer(
C.newVZVirtioTraditionalMemoryBalloonDeviceConfiguration(),
),
}
objc.SetFinalizer(config, func(self *VirtioTraditionalMemoryBalloonDeviceConfiguration) {
objc.Release(self)
})
return config, nil
}
// MemoryBalloonDevice is the base interface for memory balloon devices.
//
// This represents MemoryBalloonDevice in the Virtualization framework.
// It is an abstract class that should not be directly used.
//
// see: https://developer.apple.com/documentation/virtualization/vzmemoryballoondevice?language=objc
type MemoryBalloonDevice interface {
objc.NSObject
memoryBalloonDevice()
}
type baseMemoryBalloonDevice struct{}
func (*baseMemoryBalloonDevice) memoryBalloonDevice() {}
// MemoryBalloonDevices returns the list of memory balloon devices configured on this virtual machine.
//
// Returns an empty array if no memory balloon device is configured.
//
// This is only supported on macOS 11 and newer.
func (v *VirtualMachine) MemoryBalloonDevices() []MemoryBalloonDevice {
nsArray := objc.NewNSArray(
C.VZVirtualMachine_memoryBalloonDevices(objc.Ptr(v)),
)
ptrs := nsArray.ToPointerSlice()
devices := make([]MemoryBalloonDevice, len(ptrs))
for i, ptr := range ptrs {
// TODO: When Apple adds more memory balloon device types in future macOS versions,
// implement type checking here to create the appropriate device wrapper.
// Currently, VirtioTraditionalMemoryBalloonDevice is the only type supported.
devices[i] = &VirtioTraditionalMemoryBalloonDevice{
pointer: objc.NewPointer(ptr),
vm: v,
}
}
return devices
}
// VirtioTraditionalMemoryBalloonDevice represents a Virtio traditional memory balloon device.
//
// The balloon device allows for dynamic memory management by inflating or deflating
// the balloon to control memory available to the guest OS.
//
// see: https://developer.apple.com/documentation/virtualization/vzvirtiotraditionalmemoryballoondevice?language=objc
type VirtioTraditionalMemoryBalloonDevice struct {
*pointer
vm *VirtualMachine
*baseMemoryBalloonDevice
}
var _ MemoryBalloonDevice = (*VirtioTraditionalMemoryBalloonDevice)(nil)
// Deprecated: should direct type checking using `v, ok := device.(*VirtioTraditionalMemoryBalloonDevice)`.
// AsVirtioTraditionalMemoryBalloonDevice attempts to convert a MemoryBalloonDevice to a VirtioTraditionalMemoryBalloonDevice.
//
// Returns the VirtioTraditionalMemoryBalloonDevice if the device is of that type, or nil otherwise.
func AsVirtioTraditionalMemoryBalloonDevice(device MemoryBalloonDevice) *VirtioTraditionalMemoryBalloonDevice {
if traditionalDevice, ok := device.(*VirtioTraditionalMemoryBalloonDevice); ok {
return traditionalDevice
}
return nil
}
// SetTargetVirtualMachineMemorySize sets the target memory size in bytes for the virtual machine.
//
// This method inflates or deflates the memory balloon to adjust the amount of memory
// available to the guest OS. The target memory size must be less than the total memory
// configured for the virtual machine.
//
// This is only supported on macOS 11 and newer.
func (v *VirtioTraditionalMemoryBalloonDevice) SetTargetVirtualMachineMemorySize(targetMemorySize uint64) {
C.VZVirtioTraditionalMemoryBalloonDevice_setTargetVirtualMachineMemorySize(
objc.Ptr(v),
v.vm.dispatchQueue,
C.ulonglong(targetMemorySize),
)
}
// GetTargetVirtualMachineMemorySize returns the current target memory size in bytes for the virtual machine.
//
// This is only supported on macOS 11 and newer.
func (v *VirtioTraditionalMemoryBalloonDevice) GetTargetVirtualMachineMemorySize() uint64 {
return uint64(C.VZVirtioTraditionalMemoryBalloonDevice_getTargetVirtualMachineMemorySize(objc.Ptr(v), v.vm.dispatchQueue))
}