swig/Examples
Thomas Maslach de6b433cb1 Fix Python crash when using -threads iterating containers
Also fixes li_std_vector_enum testcase when run with -threads.

Patch supplied on swig-devel mailing list on 12 Sep with details...

==============================================
I just wanted to mention that I found a crash issue in bug..

I am using SWIG 2.0.11 with python and have –threads enabled.  I have a C++ std::vector that I instantiate in SWIG with %template.  I also have a method in a class that returns this vector.  I also include std_vector.i, btw..

When I iterate like so:

children = Action.getActionList()
for child in children:
  pass

Everything is fine..

When I iterate like this:

for child in Action.getActionList()
  pass

Product crashes.

The problem is the following.  This code gets called first:

SWIGINTERN PyObject *_wrap_delete_SwigPyIterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;

  if(!PyArg_UnpackTuple(args,(char *)"delete_SwigPyIterator",1,1,&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SwigPyIterator" "', argument " "1"" of type '" "swig::SwigPyIterator *""'");
  }
  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}

Note the SWIG_PYTHON_THREAD_BEGIN_ALLOW/END_ALLOW. In between those two statements, we delete arg1.  That in turn will eventually end up in this code:

namespace swig {
  class SwigPtr_PyObject {
  protected:
    PyObject *_obj;

  public:
    … snip! …
    ~SwigPtr_PyObject()
    {
      Py_XDECREF(_obj);
    }

Uh-oh!  We call Py_XDECREF when we aren’t supposed to because we are in a SWIG_PYTHON_THREAD_BEGIN_ALLOW/END_ALLOW section!

This takes care of the issue:

namespace swig {
  class SwigPtr_PyObject {
  protected:
    PyObject *_obj;

  public:
    … snip! …
    ~SwigPtr_PyObject()
    {
      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
      Py_XDECREF(_obj);
      SWIG_PYTHON_THREAD_END_BLOCK;
    }

There are several other methods in this class that use the Python API, but don’t have the BEGIN/END block defined.  I’m not sure if they are required for all of them, but I believe they are..

I have attached a modified pyclasses.swg with what I believe are the correct changes.  This code is from 2.0.11, but as far as I can tell, it’s the same as what is in 3.0.2…

Apologies for not doing more here (making/running tests, getting it in the code repository, etc..), but I’m under some pressure to get some unrelated things done…
2014-09-23 22:33:25 +01:00
..
android Fix out of source clean-android-examples 2014-05-15 23:28:47 +01:00
chicken Add in CPPFLAGS and LDFLAGS to examples/test-suite 2014-05-15 23:11:08 +01:00
contract fix extern declarations 2005-06-28 21:14:24 +00:00
csharp Fix compiler warnings in examples when using -std=c++98 -std=gnu89 -pedantic -Wreturn-type 2014-05-24 13:13:32 +01:00
d Fix compiler warnings in examples when using -std=c++98 -std=gnu89 -pedantic -Wreturn-type 2014-05-24 13:13:32 +01:00
go Fix compiler warnings in examples when using -std=c++98 -std=gnu89 -pedantic -Wreturn-type 2014-05-24 13:13:32 +01:00
guile Allow examples and test-suite to be built out of source tree 2014-05-11 23:21:10 +02:00
java Fix compiler warnings in examples when using -std=c++98 -std=gnu89 -pedantic -Wreturn-type 2014-05-24 13:13:32 +01:00
javascript Fix Javascript examples so that "make clean" works properly with node 2014-05-29 02:29:27 +02:00
lua Fix compiler warnings in examples when using -std=c++98 -std=gnu89 -pedantic -Wreturn-type 2014-05-24 13:13:32 +01:00
modula3 Fix compiler warnings in examples when using -std=c++98 -std=gnu89 -pedantic -Wreturn-type 2014-05-24 13:13:32 +01:00
mzscheme Allow examples and test-suite to be built out of source tree 2014-05-11 23:21:10 +02:00
ocaml Allow examples and test-suite to be built out of source tree 2014-05-11 23:21:10 +02:00
octave Octave: use common example.mk for examples, patterned after javascript 2014-05-29 23:42:55 +02:00
perl5 Fix compiler warnings in examples when using -std=c++98 -std=gnu89 -pedantic -Wreturn-type 2014-05-24 13:13:32 +01:00
php Fix compiler warnings in examples when using -std=c++98 -std=gnu89 -pedantic -Wreturn-type 2014-05-24 13:13:32 +01:00
pike Allow examples and test-suite to be built out of source tree 2014-05-11 23:21:10 +02:00
python Fully clean Python examples and test-suite 2014-05-29 02:29:27 +02:00
r Allow examples and test-suite to be built out of source tree 2014-05-11 23:21:10 +02:00
ruby Fix compiler warnings in examples when using -std=c++98 -std=gnu89 -pedantic -Wreturn-type 2014-05-24 13:13:32 +01:00
s-exp remove final vestiges of gifplot example 2010-02-28 00:16:39 +00:00
tcl Fix compiler warnings in examples when using -std=c++98 -std=gnu89 -pedantic -Wreturn-type 2014-05-24 13:13:32 +01:00
test-suite Fix Python crash when using -threads iterating containers 2014-09-23 22:33:25 +01:00
xml XML example makefiles tweaks for consistency with other languages 2013-04-19 22:47:29 +01:00
index.html remove final vestiges of gifplot example 2010-02-28 00:16:39 +00:00
Makefile.in For Android examples, replace hard coded tool names with those detected at configure time. 2014-09-15 19:44:18 +01:00
README Improve Examples/README 2014-02-21 08:14:24 +13:00

SWIG Examples

The subdirectories of "Examples" named after SWIG's language backends
contain a number of simple examples that are primarily used for testing.

The file 'index.html' is the top of a hyperlinked document that
contains information about all of the examples along with various
notes related to each example.

Note: All of the examples rely upon the Makefile in this directory.
You may need to edit it to reflect the configuration of your machine
in case the configure script guesses incorrect settings.


*** Special note concerning C++ ***

The configure script is currently unable to handle all of the possible
options for producing dynamically loadable C++ extensions.  Here are
the rules of thumb for making C++ work:

 -  Try using the C++ as the linker for the shared library.  For example:

         g++ -shared $(OBJS) -o module.so

 -  If that doesn't work, you may need to explicitly link against some
    kind of C++ runtime library.  For example:

         ld -G $(OBJS) -L/opt/SUNWspro/lib -lCrun -o module.so

    This can be set by modifying the setting of CPP_DLLIBS in the
    Makefile.


*** Special note for SWIG Maintainers ***

When you add an example, consider arranging for the example to be also
useful as part of the SWIG testing framework.  To do this, include in
the example makefile a target "check" ("check: all" is sufficient for a
first pass), and add an invocation to ../Makefile.in under target
"check-examples" (or whatever is appropriate).  Later, we can add or
expand the actions under target "check" to do more in-depth testing.