func GoVNCDriver_VNCSession_step()

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
}