in main.go [234:314]
func GoVNCDriver_VNCSession_step(self, actionDict *C.PyObject) (rep *C.PyObject) {
// defer func() {
// if r := recover(); r != nil {
// stack := debug.Stack()
// setError(stack)
// rep = nil
// }
// }()
batchLock.Lock()
defer batchLock.Unlock()
ptr := uintptr(unsafe.Pointer(self))
info, ok := batchMgr[ptr]
if !ok {
setError(errors.New("VNCSession is closed"))
return nil
}
// Iterate over all active sessions
batchEvents := map[string][]gymvnc.VNCEvent{}
ok = true
for name, nameC := range info.names {
events := []gymvnc.VNCEvent{}
action := C.PyDict_GetItemString(actionDict, nameC)
if C.PyErr_Occurred() != nil {
return nil
}
if action != nil {
// Iterate over all events in the action
eventsIter := C.PyObject_GetIter(action)
for eventPy := C.PyIter_Next(eventsIter); ok && eventPy != nil; eventPy = C.PyIter_Next(eventsIter) {
event, convertOk := convertEventPy(eventPy)
if !convertOk {
ok = false
}
C.go_vncdriver_decref(eventPy)
events = append(events, event)
}
C.go_vncdriver_decref(eventsIter)
}
if !ok {
if C.PyErr_Occurred() == nil {
setError(errors.Errorf("BUG: unpacking actions failed for %s, but no Python error was set", name))
return nil
}
return nil
}
batchEvents[name] = events
}
// Put together the Python objects
observationN, updatesN, errN := info.batch.Step(batchEvents)
if ok := info.populateScreenPyDict(observationN); !ok {
return nil
}
if ok := info.populateInfoPyDict(updatesN); !ok {
return nil
}
if ok := info.populateErrorPyDict(errN); !ok {
return nil
}
// Actually, let's make this the user's responsibility, so
// they don't have disappearing names.
//
// // Cleanup anything that broke
// for name, err := range errN {
// if err != nil {
// info.close(name)
// }
// }
// Ownership will transfer away when we return
C.go_vncdriver_incref(info.screenInfoErrPytuple)
return info.screenInfoErrPytuple
}