void PythonConsole::stopStatementWorker(PythonConsole *console)
{
	PyGILState_STATE gstate = PyGILState_Ensure();
	
	PyThreadState_SetAsyncExc((long)console->getConsumerThreadID(), PyExc_KeyboardInterrupt);
	
	PyGILState_Release(gstate);
}
Example #2
0
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
}