mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-14 23:16:49 +00:00
* gct: phase one context awareness pass * exchanges: context propagation pass * common/requester: force context requirement * gctcli/exchanges: linter fix * rpcserver: fix test using dummy rpc server * backtester: fix comments * grpc: add correct cancel and timeout for commands * rpcserver_test: add comment on dummy server * common: deprecated SendHTTPGetRequest * linter: fix * linter: turn on no context check * apichecker: fix context linter issue * binance: use param context * common: remove checks as this gets executed before main * common: change mutex to RW as clients can be used by multiple go routines. * common: remove init and JIT default client. Unexport global variables and add protection. * common: Add comments * bithumb: after dinner mints fix
82 lines
1.8 KiB
Go
82 lines
1.8 KiB
Go
package vm
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/gofrs/uuid"
|
|
"github.com/thrasher-corp/gocryptotrader/gctscript/wrappers/validator"
|
|
"github.com/thrasher-corp/gocryptotrader/log"
|
|
)
|
|
|
|
// New returns a new instance of VM
|
|
func (g *GctScriptManager) New() *VM {
|
|
if VMSCount.Len() >= int32(g.GetMaxVirtualMachines()) {
|
|
if g.config.Verbose {
|
|
log.Warnf(log.GCTScriptMgr, "GCTScript MaxVirtualMachines (%v) hit, unable to start further instances",
|
|
g.GetMaxVirtualMachines())
|
|
}
|
|
return nil
|
|
}
|
|
VMSCount.add()
|
|
vm := g.NewVM()
|
|
if vm == nil {
|
|
VMSCount.remove()
|
|
} else {
|
|
AllVMSync.Store(vm.ID, vm)
|
|
}
|
|
return vm
|
|
}
|
|
|
|
// Validate will attempt to execute a script in a test/non-live environment
|
|
// to confirm it passes requirements for execution
|
|
func (g *GctScriptManager) Validate(file string) (err error) {
|
|
validator.IsTestExecution.Store(true)
|
|
defer validator.IsTestExecution.Store(false)
|
|
tempVM := g.NewVM()
|
|
err = tempVM.Load(file)
|
|
if err != nil {
|
|
return
|
|
}
|
|
err = tempVM.Compile()
|
|
if err != nil {
|
|
return
|
|
}
|
|
return tempVM.RunCtx()
|
|
}
|
|
|
|
// ShutdownAll shutdown all
|
|
func (g *GctScriptManager) ShutdownAll() (err error) {
|
|
if g.config.Verbose {
|
|
log.Debugln(log.GCTScriptMgr, "Shutting down all Virtual Machines")
|
|
}
|
|
|
|
var errors []error
|
|
AllVMSync.Range(func(k, v interface{}) bool {
|
|
errShutdown := v.(*VM).Shutdown()
|
|
if err != nil {
|
|
errors = append(errors, errShutdown)
|
|
}
|
|
return true
|
|
})
|
|
|
|
if len(errors) > 0 {
|
|
err = fmt.Errorf("failed to shutdown the following Virtual Machines: %v", errors)
|
|
}
|
|
|
|
return err
|
|
}
|
|
|
|
// RemoveVM remove VM from list
|
|
func (g *GctScriptManager) RemoveVM(id uuid.UUID) error {
|
|
if _, f := AllVMSync.Load(id); !f {
|
|
return fmt.Errorf(ErrNoVMFound, id.String())
|
|
}
|
|
|
|
AllVMSync.Delete(id)
|
|
VMSCount.remove()
|
|
if g.config.Verbose {
|
|
log.Debugf(log.GCTScriptMgr, "VM %v removed from AllVMs", id)
|
|
}
|
|
return nil
|
|
}
|