diff --git a/get-rid-of-ts_origin.patch b/get-rid-of-ts_origin.patch new file mode 100644 index 0000000..1ba3263 --- /dev/null +++ b/get-rid-of-ts_origin.patch @@ -0,0 +1,106 @@ +diff -up greenlet-0.3.1/greenlet.c.get-rid-of-ts_origin greenlet-0.3.1/greenlet.c +--- greenlet-0.3.1/greenlet.c.get-rid-of-ts_origin 2010-04-05 17:24:25.000000000 -0400 ++++ greenlet-0.3.1/greenlet.c 2011-10-19 13:59:30.485035920 -0400 +@@ -116,10 +116,8 @@ extern PyTypeObject PyGreenlet_Type; + + /* The current greenlet in this thread state (holds a reference) */ + static PyGreenlet* ts_current = NULL; +-/* Holds a reference to the switching-from stack during the slp switch */ +-static PyGreenlet* ts_origin = NULL; + /* Holds a reference to the switching-to stack during the slp switch */ +-static PyGreenlet* ts_target = NULL; ++static PyGreenlet* volatile ts_target = NULL; + /* NULL if error, otherwise args tuple to pass around during slp switch */ + static PyObject* ts_passaround_args = NULL; + static PyObject* ts_passaround_kwargs = NULL; +@@ -257,6 +255,7 @@ static int g_save(PyGreenlet* g, char* s + static void slp_restore_state(void) + { + PyGreenlet* g = ts_target; ++ PyGreenlet* owner = ts_current; + + /* Restore the heap copy back into the C stack */ + if (g->stack_saved != 0) { +@@ -265,30 +264,32 @@ static void slp_restore_state(void) + g->stack_copy = NULL; + g->stack_saved = 0; + } +- if (ts_current->stack_stop == g->stack_stop) +- g->stack_prev = ts_current->stack_prev; +- else +- g->stack_prev = ts_current; ++ if (owner->stack_start == NULL) ++ owner = owner->stack_prev; /* greenlet is dying, skip it */ ++ while (owner && owner->stack_stop <= g->stack_stop) ++ owner = owner->stack_prev; /* find greenlet with more stack */ ++ g->stack_prev = owner; + } + + static int slp_save_state(char* stackref) + { + /* must free all the C stack up to target_stop */ + char* target_stop = ts_target->stack_stop; +- assert(ts_current->stack_saved == 0); +- if (ts_current->stack_start == NULL) +- ts_current = ts_current->stack_prev; /* not saved if dying */ ++ PyGreenlet* owner = ts_current; ++ assert(owner->stack_saved == 0); ++ if (owner->stack_start == NULL) ++ owner = owner->stack_prev; /* not saved if dying */ + else +- ts_current->stack_start = stackref; ++ owner->stack_start = stackref; + +- while (ts_current->stack_stop < target_stop) { ++ while (owner->stack_stop < target_stop) { + /* ts_current is entierely within the area to free */ +- if (g_save(ts_current, ts_current->stack_stop)) ++ if (g_save(owner, owner->stack_stop)) + return -1; /* XXX */ +- ts_current = ts_current->stack_prev; ++ owner = owner->stack_prev; + } +- if (ts_current != ts_target) { +- if (g_save(ts_current, target_stop)) ++ if (owner != ts_target) { ++ if (g_save(owner, target_stop)) + return -1; /* XXX */ + } + return 0; +@@ -337,11 +338,11 @@ static int g_switchstack(void) + */ + int err; + { /* save state */ ++ PyGreenlet* current = ts_current; + PyThreadState* tstate = PyThreadState_GET(); +- ts_current->recursion_depth = tstate->recursion_depth; +- ts_current->top_frame = tstate->frame; ++ current->recursion_depth = tstate->recursion_depth; ++ current->top_frame = tstate->frame; + } +- ts_origin = ts_current; + err = _PyGreenlet_slp_switch(); + if (err < 0) { /* error */ + Py_XDECREF(ts_passaround_args); +@@ -351,13 +352,15 @@ static int g_switchstack(void) + ts_passaround_kwargs = NULL; + } + else { ++ PyGreenlet* target = ts_target; ++ PyGreenlet* origin = ts_current; + PyThreadState* tstate = PyThreadState_GET(); +- tstate->recursion_depth = ts_target->recursion_depth; +- tstate->frame = ts_target->top_frame; +- ts_target->top_frame = NULL; +- ts_current = ts_target; +- Py_INCREF(ts_target); +- Py_DECREF(ts_origin); ++ tstate->recursion_depth = target->recursion_depth; ++ tstate->frame = target->top_frame; ++ target->top_frame = NULL; ++ ts_current = target; ++ Py_INCREF(target); ++ Py_DECREF(origin); + } + return err; + } diff --git a/i686-register-fixes.patch b/i686-register-fixes.patch new file mode 100644 index 0000000..15bf957 --- /dev/null +++ b/i686-register-fixes.patch @@ -0,0 +1,62 @@ +# HG changeset patch +# User Alexey Borzenkov +# Date 1313701525 -14400 +# Node ID 25bf29f4d3b79b026c1c05787bb741a8e7ef2229 +# Parent c0bf397a723d4b61d7ef78cf575dea4c0fdb527e +Fix compilation and register problems on some i386 configurations + +diff -r c0bf397a723d4b61d7ef78cf575dea4c0fdb527e -r 25bf29f4d3b79b026c1c05787bb741a8e7ef2229 platform/switch_x86_unix.h +--- a/platform/switch_x86_unix.h Thu Aug 18 02:44:20 2011 +0400 ++++ b/platform/switch_x86_unix.h Fri Aug 19 01:05:25 2011 +0400 +@@ -2,6 +2,8 @@ + * this is the internal transfer function. + * + * HISTORY ++ * 19-Aug-11 Alexey Borzenkov ++ * Correctly save ebp, ebx and cw + * 07-Sep-05 (py-dev mailing list discussion) + * removed 'ebx' from the register-saved. !!!! WARNING !!!! + * It means that this file can no longer be compiled statically! +@@ -34,18 +36,13 @@ + static int + slp_switch(void) + { ++ void *ebp, *ebx; ++ unsigned short cw; + register int *stackref, stsizediff; +- /* !!!!WARNING!!!! need to add "ebx" in the next line, as well as in the +- * last line of this function, if this header file is meant to be compiled +- * non-dynamically! +- */ +- __asm__ volatile ("" : : : +- "esi", +- "edi" +-#ifdef __MINGW32__ +- , "ebx" +-#endif +- ); ++ __asm__ volatile ("" : : : "esi", "edi"); ++ __asm__ volatile ("fstcw %0" : "=m" (cw)); ++ __asm__ volatile ("movl %%ebp, %0" : "=m" (ebp)); ++ __asm__ volatile ("movl %%ebx, %0" : "=m" (ebx)); + __asm__ ("movl %%esp, %0" : "=g" (stackref)); + { + SLP_SAVE_STATE(stackref, stsizediff); +@@ -57,13 +54,10 @@ + ); + SLP_RESTORE_STATE(); + } +- __asm__ volatile ("" : : : +- "esi", +- "edi" +-#ifdef __MINGW32__ +- , "ebx" +-#endif +- ); ++ __asm__ volatile ("movl %0, %%ebx" : : "m" (ebx)); ++ __asm__ volatile ("movl %0, %%ebp" : : "m" (ebp)); ++ __asm__ volatile ("fldcw %0" : : "m" (cw)); ++ __asm__ volatile ("" : : : "esi", "edi"); + return 0; + } + diff --git a/python-greenlet.changes b/python-greenlet.changes index cae487f..ba9df57 100644 --- a/python-greenlet.changes +++ b/python-greenlet.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Fri Dec 23 13:20:47 UTC 2011 - idonmez@suse.com + +- Add upstream commits 25bf29f4d3b7 and 2d5b17472757 (bnc#738431) +- Implement %check + ------------------------------------------------------------------- Wed Sep 21 09:35:58 UTC 2011 - saschpe@suse.de diff --git a/python-greenlet.spec b/python-greenlet.spec index 857b3c4..3565453 100644 --- a/python-greenlet.spec +++ b/python-greenlet.spec @@ -24,6 +24,10 @@ Summary: Lightweight in-process concurrent programming License: MIT Group: Development/Libraries/Python Source0: http://pypi.python.org/packages/source/g/greenlet/greenlet-%{version}.tar.gz +# PATCH-FIX-UPSTREAM idoenmez@suse.de i686-register-fixes.patch -- Upstream commit 25bf29f4d3b7 +Patch1: i686-register-fixes.patch +# PATCH-FIX-UPSTREAM idoenmez@suse.de get-rid-of-ts_origin.patch -- Upstream commit 2d5b17472757 +Patch2: get-rid-of-ts_origin.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: python-devel BuildRequires: python-distribute @@ -48,6 +52,8 @@ This package contains header files required for C modules development. %prep %setup -q -n greenlet-%{version} +%patch1 -p1 +%patch2 -p1 %build CFLAGS="%{optflags} -fno-strict-aliasing" python setup.py build @@ -55,6 +61,9 @@ CFLAGS="%{optflags} -fno-strict-aliasing" python setup.py build %install python setup.py install --prefix=%{_prefix} --root=%{buildroot} +%check +python setup.py test + %files %defattr(-,root,root) %doc AUTHORS NEWS README