[pypy-commit] cffi static-callback-embedding: more tweaks; tests needed...

arigo pypy.commits at gmail.com
Thu Dec 31 05:43:44 EST 2015


Author: Armin Rigo <arigo at tunes.org>
Branch: static-callback-embedding
Changeset: r2501:c3084bd75943
Date: 2015-12-30 22:36 +0100
http://bitbucket.org/cffi/cffi/changeset/c3084bd75943/

Log:	more tweaks; tests needed...

diff --git a/cffi/_embedding.h b/cffi/_embedding.h
--- a/cffi/_embedding.h
+++ b/cffi/_embedding.h
@@ -195,8 +195,9 @@
 
         f = PySys_GetObject((char *)"stderr");
         if (f != NULL && f != Py_None) {
-            PyFile_WriteString("\ncffi version: 1.3.1", f);
-            PyFile_WriteString("\n_cffi_backend module: ", f);
+            PyFile_WriteString("\nFrom: " _CFFI_MODULE_NAME
+                               "\ncompiled with cffi version: 1.4.2"
+                               "\n_cffi_backend module: ", f);
             modules = PyImport_GetModuleDict();
             mod = PyDict_GetItemString(modules, "_cffi_backend");
             if (mod == NULL) {
@@ -218,7 +219,7 @@
 
 PyAPI_DATA(char *) _PyParser_TokenNames[];  /* from CPython */
 
-static void _cffi_carefully_make_gil(void)
+static int _cffi_carefully_make_gil(void)
 {
     /* This initializes the GIL.  It can be called completely
        concurrently from unrelated threads.  It assumes that we don't
@@ -267,6 +268,7 @@
     while (!cffi_compare_and_swap(lock, old_value + 1, old_value))
         ;
 #endif
+    return 0;
 }
 
 /**********  end CPython-specific section  **********/
@@ -289,10 +291,12 @@
     _CFFI_PYTHON_STARTUP_CODE,
 };
 
+extern int pypy_carefully_make_gil(const char *);
 extern int pypy_init_embedded_cffi_module(int, struct _cffi_pypy_init_s *);
 
-static void _cffi_carefully_make_gil(void)
+static int _cffi_carefully_make_gil(void)
 {
+    return pypy_carefully_make_gil(_CFFI_MODULE_NAME);
 }
 
 static int _cffi_initialize_python(void)
@@ -345,14 +349,16 @@
     */
     static char called = 0;
 
-    _cffi_carefully_make_gil();
+    if (_cffi_carefully_make_gil() != 0)
+        return NULL;
+
     _cffi_acquire_reentrant_mutex();
 
     /* Here the GIL exists, but we don't have it.  We're only protected
        from concurrency by the reentrant mutex. */
 
-    /* This file ignores subinterpreters and can only initialize the
-       embedded module once, in the main interpreter. */
+    /* This file only initializes the embedded module once, the first
+       time this is called, even if there are subinterpreters. */
     if (!called) {
         called = 1;  /* invoke _cffi_initialize_python() only once,
                         but don't set '_cffi_call_python' right now,
@@ -365,13 +371,13 @@
                '_cffi_call_python' without also seeing the rest of the
                data initialized.  However, this is not possible.  But
                the new value of '_cffi_call_python' is the function
-               'cffi_call_python()' from _cffi_backend.  We can put a
-               write barrier here, and a corresponding read barrier at
-               the start of cffi_call_python().  This ensures that
-               after that read barrier, we see everything done here
-               before the write barrier.
+               'cffi_call_python()' from _cffi_backend.  So:  */
+            cffi_write_barrier();
+            /* ^^^ we put a write barrier here, and a corresponding
+               read barrier at the start of cffi_call_python().  This
+               ensures that after that read barrier, we see everything
+               done here before the write barrier.
             */
-            cffi_write_barrier();
 
             assert(_cffi_call_python_org != NULL);
             _cffi_call_python = (_cffi_call_python_fnptr)_cffi_call_python_org;
diff --git a/testing/cffi0/test_version.py b/testing/cffi0/test_version.py
--- a/testing/cffi0/test_version.py
+++ b/testing/cffi0/test_version.py
@@ -53,3 +53,10 @@
     content = open(p).read()
     #v = BACKEND_VERSIONS.get(v, v)
     assert (('assert __version__ == "%s"' % v) in content)
+
+def test_embedding_h():
+    parent = os.path.dirname(os.path.dirname(cffi.__file__))
+    v = cffi.__version__
+    p = os.path.join(parent, 'cffi', '_embedding.h')
+    content = open(p).read()
+    assert ('cffi version: %s"' % (v,)) in content


More information about the pypy-commit mailing list