[Twisted-Python] Twisted communication with embedded C thread

William Waites ww at groovy.net
Thu Jul 7 12:19:50 MDT 2005


On Thu, Jul 07, 2005 at 01:48:57PM -0400, Tom Cocagne wrote:
> 
>     All I really need is a means by which to inform Twisted's reactor
> that a C thread has sent a message.  My original plan was to use a
> pair of pipes (via os.pipe()) to send pointers back and forth but it
> didn't seem to work on Windows . I'm pretty sure this will work fine
> for posix systems but it definitely didn't work on my first attempt
> with Windows (though the problem may have been due to my library
> configuration).

#define MY_MODULE "foo.bar"
#define MY_FUNCTION "handle_message"

void send_message_to_python(message_t *message)
{
      PyObject *module_name, *module, *dict, *func, *args, *pymessage;

      module_name = PyString_FromString(MY_MODULE);
      module = PyImport_Import(module_name);
      dict = PyModule_GetDict(module)
      func = PyDict_GetItemString(MY_FUNCTION);

      args = PyTuple_New(1)
      pymessage = MyPythonWrappedMessage_New(message);
      PyTuple_SetItem(args, 0, pymessage);

      PyObject_CallObject(func, args);
}

(with appropriate error checking, of course)

This has the effect of doing

      from foo.bar import handle_message
      handle_message(m)

I'm not at all sure what would happen on Windows. I suppose this would
work there too.

But you also need to run the reactor, I guess which might be easier or
harder depending on the behaviour of the C program. The simplest way
is just to start a C thread and do the equivalent of the above for

	from twisted.internet import reactor
	reactor.run()

-w




More information about the Twisted-Python mailing list