void PythonConsole::stopStatementWorker(PythonConsole *console) { PyGILState_STATE gstate = PyGILState_Ensure(); PyThreadState_SetAsyncExc((long)console->getConsumerThreadID(), PyExc_KeyboardInterrupt); PyGILState_Release(gstate); }
static void MidiIn_callback(double timestamp, std::vector<unsigned char> *message, void *opaque) { MidiIn *self = (MidiIn *) opaque; uint8 *data = (uint8*) malloc(message->size()); for(size_t i=0; i < message->size(); i++) data[i] = (*message)[i]; MidiMessage inMidi(data, message->size(), timestamp); free(data); #if PK_WINDOWS WaitForSingleObject(self->mutex); #else pthread_mutex_lock(&self->mutex); #endif if(self->callback) // called too fast to init? { PyGILState_STATE gil_state = PyGILState_Ensure(); PyObject *result = NULL; PyObject *args = NULL; PyMidiMessage *outMidi = (PyMidiMessage *) PyMidiMessage_new(); (*outMidi->m) = inMidi; args = Py_BuildValue("(O)", outMidi); result = PyEval_CallObject(self->callback, args); if(result == NULL) { PyThreadState_SetAsyncExc(self->calling_thread_id, 0); } Py_XDECREF(result); Py_XDECREF(args); Py_XDECREF(outMidi); PyGILState_Release(gil_state); } else { self->m_q->push(new MidiMessage(inMidi)); self->triggered = true; } #if PK_WINDOWS SetEvent(self->cond); ReleaseMutex(self->mutex); #else pthread_cond_signal(&self->cond); pthread_mutex_unlock(&self->mutex); #endif }