123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637 |
- //go:build windows
- package vmcompute
- import (
- gcontext "context"
- "syscall"
- "time"
- "github.com/sirupsen/logrus"
- "go.opencensus.io/trace"
- "github.com/Microsoft/hcsshim/internal/interop"
- "github.com/Microsoft/hcsshim/internal/log"
- "github.com/Microsoft/hcsshim/internal/logfields"
- "github.com/Microsoft/hcsshim/internal/oc"
- "github.com/Microsoft/hcsshim/internal/timeout"
- )
- //go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go vmcompute.go
- //sys hcsEnumerateComputeSystems(query string, computeSystems **uint16, result **uint16) (hr error) = vmcompute.HcsEnumerateComputeSystems?
- //sys hcsCreateComputeSystem(id string, configuration string, identity syscall.Handle, computeSystem *HcsSystem, result **uint16) (hr error) = vmcompute.HcsCreateComputeSystem?
- //sys hcsOpenComputeSystem(id string, computeSystem *HcsSystem, result **uint16) (hr error) = vmcompute.HcsOpenComputeSystem?
- //sys hcsCloseComputeSystem(computeSystem HcsSystem) (hr error) = vmcompute.HcsCloseComputeSystem?
- //sys hcsStartComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsStartComputeSystem?
- //sys hcsShutdownComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsShutdownComputeSystem?
- //sys hcsTerminateComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsTerminateComputeSystem?
- //sys hcsPauseComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsPauseComputeSystem?
- //sys hcsResumeComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsResumeComputeSystem?
- //sys hcsGetComputeSystemProperties(computeSystem HcsSystem, propertyQuery string, properties **uint16, result **uint16) (hr error) = vmcompute.HcsGetComputeSystemProperties?
- //sys hcsModifyComputeSystem(computeSystem HcsSystem, configuration string, result **uint16) (hr error) = vmcompute.HcsModifyComputeSystem?
- //sys hcsModifyServiceSettings(settings string, result **uint16) (hr error) = vmcompute.HcsModifyServiceSettings?
- //sys hcsRegisterComputeSystemCallback(computeSystem HcsSystem, callback uintptr, context uintptr, callbackHandle *HcsCallback) (hr error) = vmcompute.HcsRegisterComputeSystemCallback?
- //sys hcsUnregisterComputeSystemCallback(callbackHandle HcsCallback) (hr error) = vmcompute.HcsUnregisterComputeSystemCallback?
- //sys hcsSaveComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsSaveComputeSystem?
- //sys hcsCreateProcess(computeSystem HcsSystem, processParameters string, processInformation *HcsProcessInformation, process *HcsProcess, result **uint16) (hr error) = vmcompute.HcsCreateProcess?
- //sys hcsOpenProcess(computeSystem HcsSystem, pid uint32, process *HcsProcess, result **uint16) (hr error) = vmcompute.HcsOpenProcess?
- //sys hcsCloseProcess(process HcsProcess) (hr error) = vmcompute.HcsCloseProcess?
- //sys hcsTerminateProcess(process HcsProcess, result **uint16) (hr error) = vmcompute.HcsTerminateProcess?
- //sys hcsSignalProcess(process HcsProcess, options string, result **uint16) (hr error) = vmcompute.HcsSignalProcess?
- //sys hcsGetProcessInfo(process HcsProcess, processInformation *HcsProcessInformation, result **uint16) (hr error) = vmcompute.HcsGetProcessInfo?
- //sys hcsGetProcessProperties(process HcsProcess, processProperties **uint16, result **uint16) (hr error) = vmcompute.HcsGetProcessProperties?
- //sys hcsModifyProcess(process HcsProcess, settings string, result **uint16) (hr error) = vmcompute.HcsModifyProcess?
- //sys hcsGetServiceProperties(propertyQuery string, properties **uint16, result **uint16) (hr error) = vmcompute.HcsGetServiceProperties?
- //sys hcsRegisterProcessCallback(process HcsProcess, callback uintptr, context uintptr, callbackHandle *HcsCallback) (hr error) = vmcompute.HcsRegisterProcessCallback?
- //sys hcsUnregisterProcessCallback(callbackHandle HcsCallback) (hr error) = vmcompute.HcsUnregisterProcessCallback?
- // errVmcomputeOperationPending is an error encountered when the operation is being completed asynchronously
- const errVmcomputeOperationPending = syscall.Errno(0xC0370103)
- // HcsSystem is the handle associated with a created compute system.
- type HcsSystem syscall.Handle
- // HcsProcess is the handle associated with a created process in a compute
- // system.
- type HcsProcess syscall.Handle
- // HcsCallback is the handle associated with the function to call when events
- // occur.
- type HcsCallback syscall.Handle
- // HcsProcessInformation is the structure used when creating or getting process
- // info.
- type HcsProcessInformation struct {
- // ProcessId is the pid of the created process.
- ProcessId uint32
- _ uint32 // reserved padding
- // StdInput is the handle associated with the stdin of the process.
- StdInput syscall.Handle
- // StdOutput is the handle associated with the stdout of the process.
- StdOutput syscall.Handle
- // StdError is the handle associated with the stderr of the process.
- StdError syscall.Handle
- }
- func execute(ctx gcontext.Context, timeout time.Duration, f func() error) error {
- now := time.Now()
- if timeout > 0 {
- var cancel gcontext.CancelFunc
- ctx, cancel = gcontext.WithTimeout(ctx, timeout)
- defer cancel()
- }
- // if ctx already has prior deadlines, the shortest timeout takes precedence and is used.
- // find the true timeout for reporting
- //
- // this is mostly an issue with (*UtilityVM).Start(context.Context), which sets its
- // own (2 minute) timeout.
- deadline, ok := ctx.Deadline()
- trueTimeout := timeout
- if ok {
- trueTimeout = deadline.Sub(now)
- log.G(ctx).WithFields(logrus.Fields{
- logfields.Timeout: trueTimeout,
- "desiredTimeout": timeout,
- }).Trace("Executing syscall with deadline")
- }
- done := make(chan error, 1)
- go func() {
- done <- f()
- }()
- select {
- case <-ctx.Done():
- if ctx.Err() == gcontext.DeadlineExceeded {
- log.G(ctx).WithField(logfields.Timeout, trueTimeout).
- Warning("Syscall did not complete within operation timeout. This may indicate a platform issue. " +
- "If it appears to be making no forward progress, obtain the stacks and see if there is a syscall " +
- "stuck in the platform API for a significant length of time.")
- }
- return ctx.Err()
- case err := <-done:
- return err
- }
- }
- func HcsEnumerateComputeSystems(ctx gcontext.Context, query string) (computeSystems, result string, hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsEnumerateComputeSystems")
- defer span.End()
- defer func() {
- if result != "" {
- span.AddAttributes(trace.StringAttribute("result", result))
- }
- oc.SetSpanStatus(span, hr)
- }()
- span.AddAttributes(trace.StringAttribute("query", query))
- return computeSystems, result, execute(ctx, timeout.SyscallWatcher, func() error {
- var (
- computeSystemsp *uint16
- resultp *uint16
- )
- err := hcsEnumerateComputeSystems(query, &computeSystemsp, &resultp)
- if computeSystemsp != nil {
- computeSystems = interop.ConvertAndFreeCoTaskMemString(computeSystemsp)
- }
- if resultp != nil {
- result = interop.ConvertAndFreeCoTaskMemString(resultp)
- }
- return err
- })
- }
- func HcsCreateComputeSystem(ctx gcontext.Context, id string, configuration string, identity syscall.Handle) (computeSystem HcsSystem, result string, hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsCreateComputeSystem")
- defer span.End()
- defer func() {
- if result != "" {
- span.AddAttributes(trace.StringAttribute("result", result))
- }
- if hr != errVmcomputeOperationPending {
- oc.SetSpanStatus(span, hr)
- }
- }()
- span.AddAttributes(
- trace.StringAttribute("id", id),
- trace.StringAttribute("configuration", configuration))
- return computeSystem, result, execute(ctx, timeout.SystemCreate, func() error {
- var resultp *uint16
- err := hcsCreateComputeSystem(id, configuration, identity, &computeSystem, &resultp)
- if resultp != nil {
- result = interop.ConvertAndFreeCoTaskMemString(resultp)
- }
- return err
- })
- }
- func HcsOpenComputeSystem(ctx gcontext.Context, id string) (computeSystem HcsSystem, result string, hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsOpenComputeSystem")
- defer span.End()
- defer func() {
- if result != "" {
- span.AddAttributes(trace.StringAttribute("result", result))
- }
- oc.SetSpanStatus(span, hr)
- }()
- return computeSystem, result, execute(ctx, timeout.SyscallWatcher, func() error {
- var resultp *uint16
- err := hcsOpenComputeSystem(id, &computeSystem, &resultp)
- if resultp != nil {
- result = interop.ConvertAndFreeCoTaskMemString(resultp)
- }
- return err
- })
- }
- func HcsCloseComputeSystem(ctx gcontext.Context, computeSystem HcsSystem) (hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsCloseComputeSystem")
- defer span.End()
- defer func() { oc.SetSpanStatus(span, hr) }()
- return execute(ctx, timeout.SyscallWatcher, func() error {
- return hcsCloseComputeSystem(computeSystem)
- })
- }
- func HcsStartComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsStartComputeSystem")
- defer span.End()
- defer func() {
- if result != "" {
- span.AddAttributes(trace.StringAttribute("result", result))
- }
- if hr != errVmcomputeOperationPending {
- oc.SetSpanStatus(span, hr)
- }
- }()
- span.AddAttributes(trace.StringAttribute("options", options))
- return result, execute(ctx, timeout.SystemStart, func() error {
- var resultp *uint16
- err := hcsStartComputeSystem(computeSystem, options, &resultp)
- if resultp != nil {
- result = interop.ConvertAndFreeCoTaskMemString(resultp)
- }
- return err
- })
- }
- func HcsShutdownComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsShutdownComputeSystem")
- defer span.End()
- defer func() {
- if result != "" {
- span.AddAttributes(trace.StringAttribute("result", result))
- }
- if hr != errVmcomputeOperationPending {
- oc.SetSpanStatus(span, hr)
- }
- }()
- span.AddAttributes(trace.StringAttribute("options", options))
- return result, execute(ctx, timeout.SyscallWatcher, func() error {
- var resultp *uint16
- err := hcsShutdownComputeSystem(computeSystem, options, &resultp)
- if resultp != nil {
- result = interop.ConvertAndFreeCoTaskMemString(resultp)
- }
- return err
- })
- }
- func HcsTerminateComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsTerminateComputeSystem")
- defer span.End()
- defer func() {
- if result != "" {
- span.AddAttributes(trace.StringAttribute("result", result))
- }
- if hr != errVmcomputeOperationPending {
- oc.SetSpanStatus(span, hr)
- }
- }()
- span.AddAttributes(trace.StringAttribute("options", options))
- return result, execute(ctx, timeout.SyscallWatcher, func() error {
- var resultp *uint16
- err := hcsTerminateComputeSystem(computeSystem, options, &resultp)
- if resultp != nil {
- result = interop.ConvertAndFreeCoTaskMemString(resultp)
- }
- return err
- })
- }
- func HcsPauseComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsPauseComputeSystem")
- defer span.End()
- defer func() {
- if result != "" {
- span.AddAttributes(trace.StringAttribute("result", result))
- }
- if hr != errVmcomputeOperationPending {
- oc.SetSpanStatus(span, hr)
- }
- }()
- span.AddAttributes(trace.StringAttribute("options", options))
- return result, execute(ctx, timeout.SystemPause, func() error {
- var resultp *uint16
- err := hcsPauseComputeSystem(computeSystem, options, &resultp)
- if resultp != nil {
- result = interop.ConvertAndFreeCoTaskMemString(resultp)
- }
- return err
- })
- }
- func HcsResumeComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsResumeComputeSystem")
- defer span.End()
- defer func() {
- if result != "" {
- span.AddAttributes(trace.StringAttribute("result", result))
- }
- if hr != errVmcomputeOperationPending {
- oc.SetSpanStatus(span, hr)
- }
- }()
- span.AddAttributes(trace.StringAttribute("options", options))
- return result, execute(ctx, timeout.SystemResume, func() error {
- var resultp *uint16
- err := hcsResumeComputeSystem(computeSystem, options, &resultp)
- if resultp != nil {
- result = interop.ConvertAndFreeCoTaskMemString(resultp)
- }
- return err
- })
- }
- func HcsGetComputeSystemProperties(ctx gcontext.Context, computeSystem HcsSystem, propertyQuery string) (properties, result string, hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsGetComputeSystemProperties")
- defer span.End()
- defer func() {
- if result != "" {
- span.AddAttributes(trace.StringAttribute("result", result))
- }
- oc.SetSpanStatus(span, hr)
- }()
- span.AddAttributes(trace.StringAttribute("propertyQuery", propertyQuery))
- return properties, result, execute(ctx, timeout.SyscallWatcher, func() error {
- var (
- propertiesp *uint16
- resultp *uint16
- )
- err := hcsGetComputeSystemProperties(computeSystem, propertyQuery, &propertiesp, &resultp)
- if propertiesp != nil {
- properties = interop.ConvertAndFreeCoTaskMemString(propertiesp)
- }
- if resultp != nil {
- result = interop.ConvertAndFreeCoTaskMemString(resultp)
- }
- return err
- })
- }
- func HcsModifyComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, configuration string) (result string, hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsModifyComputeSystem")
- defer span.End()
- defer func() {
- if result != "" {
- span.AddAttributes(trace.StringAttribute("result", result))
- }
- oc.SetSpanStatus(span, hr)
- }()
- span.AddAttributes(trace.StringAttribute("configuration", configuration))
- return result, execute(ctx, timeout.SyscallWatcher, func() error {
- var resultp *uint16
- err := hcsModifyComputeSystem(computeSystem, configuration, &resultp)
- if resultp != nil {
- result = interop.ConvertAndFreeCoTaskMemString(resultp)
- }
- return err
- })
- }
- func HcsModifyServiceSettings(ctx gcontext.Context, settings string) (result string, hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsModifyServiceSettings")
- defer span.End()
- defer func() {
- if result != "" {
- span.AddAttributes(trace.StringAttribute("result", result))
- }
- oc.SetSpanStatus(span, hr)
- }()
- span.AddAttributes(trace.StringAttribute("settings", settings))
- return result, execute(ctx, timeout.SyscallWatcher, func() error {
- var resultp *uint16
- err := hcsModifyServiceSettings(settings, &resultp)
- if resultp != nil {
- result = interop.ConvertAndFreeCoTaskMemString(resultp)
- }
- return err
- })
- }
- func HcsRegisterComputeSystemCallback(ctx gcontext.Context, computeSystem HcsSystem, callback uintptr, context uintptr) (callbackHandle HcsCallback, hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsRegisterComputeSystemCallback")
- defer span.End()
- defer func() { oc.SetSpanStatus(span, hr) }()
- return callbackHandle, execute(ctx, timeout.SyscallWatcher, func() error {
- return hcsRegisterComputeSystemCallback(computeSystem, callback, context, &callbackHandle)
- })
- }
- func HcsUnregisterComputeSystemCallback(ctx gcontext.Context, callbackHandle HcsCallback) (hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsUnregisterComputeSystemCallback")
- defer span.End()
- defer func() { oc.SetSpanStatus(span, hr) }()
- return execute(ctx, timeout.SyscallWatcher, func() error {
- return hcsUnregisterComputeSystemCallback(callbackHandle)
- })
- }
- func HcsCreateProcess(ctx gcontext.Context, computeSystem HcsSystem, processParameters string) (processInformation HcsProcessInformation, process HcsProcess, result string, hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsCreateProcess")
- defer span.End()
- defer func() {
- if result != "" {
- span.AddAttributes(trace.StringAttribute("result", result))
- }
- oc.SetSpanStatus(span, hr)
- }()
- if span.IsRecordingEvents() {
- // wont handle v1 process parameters
- if s, err := log.ScrubProcessParameters(processParameters); err == nil {
- span.AddAttributes(trace.StringAttribute("processParameters", s))
- }
- }
- return processInformation, process, result, execute(ctx, timeout.SyscallWatcher, func() error {
- var resultp *uint16
- err := hcsCreateProcess(computeSystem, processParameters, &processInformation, &process, &resultp)
- if resultp != nil {
- result = interop.ConvertAndFreeCoTaskMemString(resultp)
- }
- return err
- })
- }
- func HcsOpenProcess(ctx gcontext.Context, computeSystem HcsSystem, pid uint32) (process HcsProcess, result string, hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsOpenProcess")
- defer span.End()
- defer func() {
- if result != "" {
- span.AddAttributes(trace.StringAttribute("result", result))
- }
- oc.SetSpanStatus(span, hr)
- }()
- span.AddAttributes(trace.Int64Attribute("pid", int64(pid)))
- return process, result, execute(ctx, timeout.SyscallWatcher, func() error {
- var resultp *uint16
- err := hcsOpenProcess(computeSystem, pid, &process, &resultp)
- if resultp != nil {
- result = interop.ConvertAndFreeCoTaskMemString(resultp)
- }
- return err
- })
- }
- func HcsCloseProcess(ctx gcontext.Context, process HcsProcess) (hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsCloseProcess")
- defer span.End()
- defer func() { oc.SetSpanStatus(span, hr) }()
- return execute(ctx, timeout.SyscallWatcher, func() error {
- return hcsCloseProcess(process)
- })
- }
- func HcsTerminateProcess(ctx gcontext.Context, process HcsProcess) (result string, hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsTerminateProcess")
- defer span.End()
- defer func() {
- if result != "" {
- span.AddAttributes(trace.StringAttribute("result", result))
- }
- oc.SetSpanStatus(span, hr)
- }()
- return result, execute(ctx, timeout.SyscallWatcher, func() error {
- var resultp *uint16
- err := hcsTerminateProcess(process, &resultp)
- if resultp != nil {
- result = interop.ConvertAndFreeCoTaskMemString(resultp)
- }
- return err
- })
- }
- func HcsSignalProcess(ctx gcontext.Context, process HcsProcess, options string) (result string, hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsSignalProcess")
- defer span.End()
- defer func() {
- if result != "" {
- span.AddAttributes(trace.StringAttribute("result", result))
- }
- oc.SetSpanStatus(span, hr)
- }()
- span.AddAttributes(trace.StringAttribute("options", options))
- return result, execute(ctx, timeout.SyscallWatcher, func() error {
- var resultp *uint16
- err := hcsSignalProcess(process, options, &resultp)
- if resultp != nil {
- result = interop.ConvertAndFreeCoTaskMemString(resultp)
- }
- return err
- })
- }
- func HcsGetProcessInfo(ctx gcontext.Context, process HcsProcess) (processInformation HcsProcessInformation, result string, hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsGetProcessInfo")
- defer span.End()
- defer func() {
- if result != "" {
- span.AddAttributes(trace.StringAttribute("result", result))
- }
- oc.SetSpanStatus(span, hr)
- }()
- return processInformation, result, execute(ctx, timeout.SyscallWatcher, func() error {
- var resultp *uint16
- err := hcsGetProcessInfo(process, &processInformation, &resultp)
- if resultp != nil {
- result = interop.ConvertAndFreeCoTaskMemString(resultp)
- }
- return err
- })
- }
- func HcsGetProcessProperties(ctx gcontext.Context, process HcsProcess) (processProperties, result string, hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsGetProcessProperties")
- defer span.End()
- defer func() {
- if result != "" {
- span.AddAttributes(trace.StringAttribute("result", result))
- }
- oc.SetSpanStatus(span, hr)
- }()
- return processProperties, result, execute(ctx, timeout.SyscallWatcher, func() error {
- var (
- processPropertiesp *uint16
- resultp *uint16
- )
- err := hcsGetProcessProperties(process, &processPropertiesp, &resultp)
- if processPropertiesp != nil {
- processProperties = interop.ConvertAndFreeCoTaskMemString(processPropertiesp)
- }
- if resultp != nil {
- result = interop.ConvertAndFreeCoTaskMemString(resultp)
- }
- return err
- })
- }
- func HcsModifyProcess(ctx gcontext.Context, process HcsProcess, settings string) (result string, hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsModifyProcess")
- defer span.End()
- defer func() {
- if result != "" {
- span.AddAttributes(trace.StringAttribute("result", result))
- }
- oc.SetSpanStatus(span, hr)
- }()
- span.AddAttributes(trace.StringAttribute("settings", settings))
- return result, execute(ctx, timeout.SyscallWatcher, func() error {
- var resultp *uint16
- err := hcsModifyProcess(process, settings, &resultp)
- if resultp != nil {
- result = interop.ConvertAndFreeCoTaskMemString(resultp)
- }
- return err
- })
- }
- func HcsGetServiceProperties(ctx gcontext.Context, propertyQuery string) (properties, result string, hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsGetServiceProperties")
- defer span.End()
- defer func() {
- if result != "" {
- span.AddAttributes(trace.StringAttribute("result", result))
- }
- oc.SetSpanStatus(span, hr)
- }()
- span.AddAttributes(trace.StringAttribute("propertyQuery", propertyQuery))
- return properties, result, execute(ctx, timeout.SyscallWatcher, func() error {
- var (
- propertiesp *uint16
- resultp *uint16
- )
- err := hcsGetServiceProperties(propertyQuery, &propertiesp, &resultp)
- if propertiesp != nil {
- properties = interop.ConvertAndFreeCoTaskMemString(propertiesp)
- }
- if resultp != nil {
- result = interop.ConvertAndFreeCoTaskMemString(resultp)
- }
- return err
- })
- }
- func HcsRegisterProcessCallback(ctx gcontext.Context, process HcsProcess, callback uintptr, context uintptr) (callbackHandle HcsCallback, hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsRegisterProcessCallback")
- defer span.End()
- defer func() { oc.SetSpanStatus(span, hr) }()
- return callbackHandle, execute(ctx, timeout.SyscallWatcher, func() error {
- return hcsRegisterProcessCallback(process, callback, context, &callbackHandle)
- })
- }
- func HcsUnregisterProcessCallback(ctx gcontext.Context, callbackHandle HcsCallback) (hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsUnregisterProcessCallback")
- defer span.End()
- defer func() { oc.SetSpanStatus(span, hr) }()
- return execute(ctx, timeout.SyscallWatcher, func() error {
- return hcsUnregisterProcessCallback(callbackHandle)
- })
- }
- func HcsSaveComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) {
- ctx, span := oc.StartSpan(ctx, "HcsSaveComputeSystem")
- defer span.End()
- defer func() {
- if result != "" {
- span.AddAttributes(trace.StringAttribute("result", result))
- }
- if hr != errVmcomputeOperationPending {
- oc.SetSpanStatus(span, hr)
- }
- }()
- return result, execute(ctx, timeout.SyscallWatcher, func() error {
- var resultp *uint16
- err := hcsSaveComputeSystem(computeSystem, options, &resultp)
- if resultp != nil {
- result = interop.ConvertAndFreeCoTaskMemString(resultp)
- }
- return err
- })
- }
|