Author: Armin Rigo <ar...@tunes.org> Branch: static-callback-embedding Changeset: r2500:eb5b30231847 Date: 2015-12-30 15:46 +0100 http://bitbucket.org/cffi/cffi/changeset/eb5b30231847/
Log: tweaks diff --git a/cffi/_embedding.h b/cffi/_embedding.h --- a/cffi/_embedding.h +++ b/cffi/_embedding.h @@ -4,7 +4,7 @@ #if defined(_MSC_VER) # define CFFI_DLLEXPORT __declspec(dllexport) #elif defined(__GNUC__) -# define CFFI_DLLEXPORT __attribute__ ((visibility("default"))) +# define CFFI_DLLEXPORT __attribute__((visibility("default"))) #else # define CFFI_DLLEXPORT /* nothing */ #endif @@ -33,12 +33,19 @@ #ifndef _MSC_VER /* --- Assuming a GCC not infinitely old --- */ -# define compare_and_swap(l,o,n) __sync_bool_compare_and_swap(l,o,n) -# define write_barrier() __sync_synchronize() +# define cffi_compare_and_swap(l,o,n) __sync_bool_compare_and_swap(l,o,n) +# define cffi_write_barrier() __sync_synchronize() +# if !defined(__amd64__) && !defined(__x86_64__) && \ + !defined(__i386__) && !defined(__i386) +# define cffi_read_barrier() __sync_synchronize() +# else +# define cffi_read_barrier() (void)0 +# endif #else /* --- Windows threads version --- */ -# define compare_and_swap(l,o,n) InterlockedCompareExchangePointer(l,n,o) -# define write_barrier() InterlockedCompareExchange(&_cffi_dummy,0,0) +# define cffi_compare_and_swap(l,o,n) InterlockedCompareExchangePointer(l,n,o) +# define cffi_write_barrier() InterlockedCompareExchange(&_cffi_dummy,0,0) +# define cffi_read_barrier() (void)0 static volatile LONG _cffi_dummy; #endif @@ -56,7 +63,7 @@ { static volatile void *lock = NULL; - while (!compare_and_swap(&lock, NULL, (void *)1)) { + while (!cffi_compare_and_swap(&lock, NULL, (void *)1)) { /* should ideally do a spin loop instruction here, but hard to do it portably and doesn't really matter I think: PyEval_InitThreads() should be very fast, and @@ -77,7 +84,7 @@ } #endif - while (!compare_and_swap(&lock, (void *)1, NULL)) + while (!cffi_compare_and_swap(&lock, (void *)1, NULL)) ; #ifndef _MSC_VER @@ -237,7 +244,7 @@ old_value = *lock; if (old_value[0] == 'E') { assert(old_value[1] == 'N'); - if (compare_and_swap(lock, old_value, old_value + 1)) + if (cffi_compare_and_swap(lock, old_value, old_value + 1)) break; } else { @@ -253,11 +260,11 @@ PyEval_InitThreads(); /* makes the GIL */ PyEval_ReleaseLock(); /* then release it */ } - /* else: we already have the GIL, but we still needed to do the + /* else: there is already a GIL, but we still needed to do the spinlock dance to make sure that we see it as fully ready */ /* release the lock */ - while (!compare_and_swap(lock, old_value + 1, old_value)) + while (!cffi_compare_and_swap(lock, old_value + 1, old_value)) ; #endif } @@ -364,7 +371,7 @@ after that read barrier, we see everything done here before the write barrier. */ - write_barrier(); + cffi_write_barrier(); assert(_cffi_call_python_org != NULL); _cffi_call_python = (_cffi_call_python_fnptr)_cffi_call_python_org; @@ -406,9 +413,6 @@ fnptr(externpy, args); } -#undef compare_and_swap -#undef write_barrier - /* The cffi_start_python() function makes sure Python is initialized and our cffi module is set up. It can be called manually from the @@ -422,5 +426,10 @@ if (_cffi_start_python() == NULL) return -1; } + cffi_read_barrier(); return 0; } + +#undef cffi_compare_and_swap +#undef cffi_write_barrier +#undef cffi_read_barrier _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit