package main
import (
"fmt"
"github.com/deuill/go-php/engine"
"os"
"runtime"
"time"
"sync"
)
type TestObj struct{}
func newTestObj(args []interface{}) interface{} {
return &TestObj{}
}
var engineLock *sync.Mutex
func (self *TestObj) Hello() {
oldServerCtx := engine.ServerContextGet()
fmt.Println(oldServerCtx)
defer engine.ServerContextSet(oldServerCtx)
oldExecutorCtx := engine.ExecutorContextGet()
fmt.Println(oldExecutorCtx)
defer engine.ExecutorContextSet(oldExecutorCtx)
oldCoreCtx := engine.CoreContextGet()
fmt.Println(oldCoreCtx)
defer engine.CoreContextSet(oldCoreCtx)
engineLock.Unlock()
defer engineLock.Lock()
time.Sleep(time.Second)
fmt.Println("sleep done")
}
func main() {
runtime.GOMAXPROCS(1)
theEngine, err := engine.New()
engineLock = &sync.Mutex{}
if err != nil {
fmt.Println(err)
}
_, err = theEngine.Define("TestObj", newTestObj)
wg := &sync.WaitGroup{}
wg.Add(2)
before := time.Now()
fmt.Println("1")
go func() {
engineLock.Lock()
defer engineLock.Unlock()
context1, err := theEngine.NewContext()
if err != nil {
fmt.Println(err)
}
context1.Output = os.Stdout
if err != nil {
fmt.Println(err)
}
fmt.Println("1 enter")
_, err = context1.Eval("$testObj = new TestObj(); $testObj->Hello();")
fmt.Println("1 back")
if err != nil {
fmt.Println(err)
}
fmt.Println("1 done")
wg.Done()
}()
fmt.Println("2")
go func() {
engineLock.Lock()
defer engineLock.Unlock()
context2, err := theEngine.NewContext()
if err != nil {
fmt.Println(err)
}
if err != nil {
fmt.Println(err)
}
context2.Output = os.Stdout
fmt.Println("2 enter")
_, err = context2.Eval("$testObj = new TestObj(); $testObj->Hello();")
fmt.Println("2 back")
if err != nil {
fmt.Println(err)
}
fmt.Println("2 done")
wg.Done()
}()
wg.Wait()
after := time.Now()
fmt.Println(after.Sub(before))
}