Author: mattip <matti.pi...@gmail.com> Branch: cpyext-ext Changeset: r83231:ce2053a9cdeb Date: 2016-03-21 20:21 +0200 http://bitbucket.org/pypy/pypy/changeset/ce2053a9cdeb/
Log: create a wrapper class to call os_thread.start_new_thread from PyThread_start_new_thread diff --git a/pypy/module/cpyext/pystate.py b/pypy/module/cpyext/pystate.py --- a/pypy/module/cpyext/pystate.py +++ b/pypy/module/cpyext/pystate.py @@ -55,12 +55,12 @@ return 1 thread_func = lltype.Ptr(lltype.FuncType([rffi.VOIDP], lltype.Void)) -@cpython_api([thread_func, rffi.VOIDP], rffi.INT_real, error=-1) +@cpython_api([thread_func, rffi.VOIDP], rffi.INT_real, error=-1, gil='release') def PyThread_start_new_thread(space, func, arg): from pypy.module.thread import os_thread - w_args = space.newtuple([arg]) - XXX # How to wrap func as a space.callable ? - os_thread.start_new_thread(space, func, w_args) + w_args = space.newtuple([space.wrap(rffi.cast(lltype.Signed, arg)),]) + w_func = os_thread.W_WrapThreadFunc(func) + os_thread.start_new_thread(space, w_func, w_args) return 0 # XXX: might be generally useful diff --git a/pypy/module/thread/os_thread.py b/pypy/module/thread/os_thread.py --- a/pypy/module/thread/os_thread.py +++ b/pypy/module/thread/os_thread.py @@ -6,7 +6,9 @@ from rpython.rlib import rthread from pypy.module.thread.error import wrap_thread_error from pypy.interpreter.error import OperationError, oefmt -from pypy.interpreter.gateway import unwrap_spec, Arguments +from pypy.interpreter.gateway import unwrap_spec, Arguments, interp2app +from pypy.interpreter.baseobjspace import W_Root +from pypy.interpreter.typedef import TypeDef # Here are the steps performed to start a new thread: # @@ -161,6 +163,24 @@ if w_threading is not None: space.call_method(w_threading, "_after_fork") +class W_WrapThreadFunc(W_Root): + ''' Wrap a cpyext.pystate.thread_func, which + has the signature void func(void *) + ''' + def __init__(self, func): + self.func = func + + def descr_call(self, space, w_arg): + from rpython.rtyper.lltypesystem import rffi + try: + arg = rffi.cast(rffi.VOIDP, space.int_w(w_arg)) + self.func(arg) + except Exception as e: + import pdb;pdb.set_trace() + +W_WrapThreadFunc.typedef = TypeDef("hiddenclass", + __call__ = interp2app(W_WrapThreadFunc.descr_call), +) def start_new_thread(space, w_callable, w_args, w_kwargs=None): """Start a new thread and return its identifier. The thread will call the _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit