mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-13 15:09:42 +00:00
* modernise: Run new gopls modernise tool against codebase
* Address shazbert's nits
* apichecker, gctcli: Simplify HTML scraping functions and improve depth limit handling
* refactor: Create minSyncInterval const and update order book limit handling for binance and binanceUS
* refactor: Various slice usage improvements and rename TODO
* tranches: Revert deleteByID changes due to performance decrease
Shazbert was a F1 driver in a past lifetime 🏎️
* tranches: Simply retrieve copy
Thanks to shazbert
* documentation: Sort contributors list by contributions
* tranches: Remove deadcode in deleteByID
88 lines
2.0 KiB
Go
88 lines
2.0 KiB
Go
package vm
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/gofrs/uuid"
|
|
"github.com/thrasher-corp/gocryptotrader/common"
|
|
"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() >= 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 shutdownErrors []error
|
|
AllVMSync.Range(func(_, v any) bool {
|
|
vm, ok := v.(*VM)
|
|
if !ok {
|
|
shutdownErrors = append(shutdownErrors, common.GetTypeAssertError("*VM", v))
|
|
return true
|
|
}
|
|
errShutdown := vm.Shutdown()
|
|
if err != nil {
|
|
shutdownErrors = append(shutdownErrors, errShutdown)
|
|
}
|
|
return true
|
|
})
|
|
|
|
if len(shutdownErrors) > 0 {
|
|
err = fmt.Errorf("failed to shutdown the following Virtual Machines: %v", shutdownErrors)
|
|
}
|
|
|
|
return err
|
|
}
|
|
|
|
// RemoveVM remove VM from list
|
|
func (g *GctScriptManager) RemoveVM(id uuid.UUID) error {
|
|
if _, ok := AllVMSync.Load(id); !ok {
|
|
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
|
|
}
|