title: Pickling a Python Extension type defined as a C struct having PyObject* members
body: <p>I am running C++ code via Python and would like to pickle an extension type.</p>
  
  <p>So I have a C++ struct (py_db_manager) containing pointers to a database object and a object manager object (both written in C++) that I wrapped with a python type object (t_db_manager). My problem is that this python type needs to know how to pickle the two pointers in order to send it to some child multicore  processes. So I registered the type with the copy_reg module (this is equivalent to writing a <strong>reduce</strong>() method on the type. However, I'm not too sure what to put in it. Should I build a tuple with the PyObject* or just the integer pointers?. Can anyone help?</p>
  
  <pre><code>typedef struct
  {
    PyObject_HEAD
    PyObject* man_inst_ ;
    PyObject* db_inst_ ;
  
  }py_db_manager;`
  </code></pre>
  
  <p>Here's the Py_TypeObject </p>
  
  <pre><code>PyTypeObject t_db_manager = {
      PyObject_HEAD_INIT(0)               /* tp_head */
      0,                                  /* tp_internal */
      ".py_db_manager",                  /* tp_name */
      sizeof(py_db_manager)};
  </code></pre>
  
  <p>And here's the code that would be in the <strong>reduce</strong> method:</p>
  
  <pre><code>PyObject *pickle_manager(PyObject *module, PyObject *args)
  {
      py_db_manager *cpp_manager =0;
      PyObject *values = NULL,
          *tuple = NULL;
      char text[512];
  
      if (!PyArg_ParseTuple(args, "O!", &amp;t_db_manager, &amp;cpp_manager))
          goto error;
      sprintf(text,"man_inst_, db_inst_");
      if ((values = Py_BuildValue("(sii)", text,
                                  cpp_manager-&gt;man_inst_, cpp_manager-&gt;db_inst_)) == NULL)
          goto error;
      tuple = Py_BuildValue("(OO)", manager_constructor, values);
  
  error:
      Py_XDECREF(values);
      return tuple;
  }
  </code></pre>