[Python-checkins] CVS: python/dist/src/Modules socketmodule.h,1.3,1.4

M.-A. Lemburg lemburg@users.sourceforge.net
Mon, 25 Feb 2002 06:45:42 -0800


Update of /cvsroot/python/python/dist/src/Modules
In directory usw-pr-cvs1:/tmp/cvs-serv7444

Modified Files:
	socketmodule.h 
Log Message:
Add documentation about how the inter-module linking works.



Index: socketmodule.h
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/socketmodule.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** socketmodule.h	17 Feb 2002 04:13:21 -0000	1.3
--- socketmodule.h	25 Feb 2002 14:45:40 -0000	1.4
***************
*** 78,81 ****
--- 78,129 ----
  /* --- C API ----------------------------------------------------*/
  
+ /* Short explanation of what this C API export mechanism does
+    and how it works:
+ 
+     The _ssl module needs access to the type object defined in 
+     the _socket module. Since cross-DLL linking introduces a lot of
+     problems on many platforms, the "trick" is to wrap the
+     C API of a module in a struct which then gets exported to
+     other modules via a PyCObject.
+ 
+     The code in socketmodule.c defines this struct (which currently
+     only contains the type object reference, but could very
+     well also include other C APIs needed by other modules)
+     and exports it as PyCObject via the module dictionary
+     under the name "CAPI".
+ 
+     Other modules can now include the socketmodule.h file
+     which defines the needed C APIs to import and set up
+     a static copy of this struct in the importing module.
+ 
+     After initialization, the importing module can then
+     access the C APIs from the _socket module by simply
+     referring to the static struct, e.g.
+ 
+     Load _socket module and its C API; this sets up the global
+     PySocketModule:
+     
+ 	if (PySocketModule_ImportModuleAndAPI())
+ 	    return;
+ 
+ 
+     Now use the C API as if it were defined in the using
+     module:
+ 
+         if (!PyArg_ParseTuple(args, "O!|zz:ssl",
+ 
+ 			      PySocketModule.Sock_Type,
+ 
+ 			      (PyObject*)&Sock,
+ 			      &key_file, &cert_file))
+ 	    return NULL;
+ 
+     Support could easily be extended to export more C APIs/symbols
+     this way. Currently, only the type object is exported, 
+     other candidates would be socket constructors and socket
+     access functions.
+ 
+ */
+ 
  /* C API for usage by other Python modules */
  typedef struct {
***************
*** 85,89 ****
  /* XXX The net effect of the following appears to be to define a function
     XXX named PySocketModule_APIObject in _ssl.c.  It's unclear why it isn't
!    XXX defined there directly. */
  #ifndef PySocket_BUILDING_SOCKET
  
--- 133,142 ----
  /* XXX The net effect of the following appears to be to define a function
     XXX named PySocketModule_APIObject in _ssl.c.  It's unclear why it isn't
!    XXX defined there directly. 
! 
!    >>> It's defined here because other modules might also want to use
!    >>> the C API.
! 
! */
  #ifndef PySocket_BUILDING_SOCKET