[Python-checkins] CVS: python/dist/src/Python dynload_shlib.c,2.8,2.9 pystate.c,2.18,2.19 sysmodule.c,2.88,2.89

Martin v. L?wis loewis@users.sourceforge.net
2001年7月18日 09:17:18 -0700


Update of /cvsroot/python/python/dist/src/Python
In directory usw-pr-cvs1:/tmp/cvs-serv17889/Python
Modified Files:
	dynload_shlib.c pystate.c sysmodule.c 
Log Message:
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Add dlopenflags to PyInterpreterState, and use it in dlopen calls.
Index: dynload_shlib.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/dynload_shlib.c,v
retrieving revision 2.8
retrieving revision 2.9
diff -C2 -r2.8 -r2.9
*** dynload_shlib.c	2001年01月10日 21:17:27	2.8
--- dynload_shlib.c	2001年07月18日 16:17:16	2.9
***************
*** 23,30 ****
 #endif
 
- #ifndef RTLD_LAZY
- #define RTLD_LAZY 1
- #endif
- 
 
 const struct filedescr _PyImport_DynLoadFiletab[] = {
--- 23,26 ----
***************
*** 54,57 ****
--- 50,54 ----
 	char funcname[258];
 	char pathbuf[260];
+ int dlopenflags=0;
 
 	if (strchr(pathname, '/') == NULL) {
***************
*** 81,94 ****
 	}
 
! #ifdef RTLD_NOW
! 	/* RTLD_NOW: resolve externals now
! 	 (i.e. core dump now if some are missing) */
! 	handle = dlopen(pathname, RTLD_NOW);
! #else
 	if (Py_VerboseFlag)
! 		printf("dlopen(\"%s\", %d);\n", pathname,
! 		 RTLD_LAZY);
! 	handle = dlopen(pathname, RTLD_LAZY);
! #endif /* RTLD_NOW */
 	if (handle == NULL) {
 		PyErr_SetString(PyExc_ImportError, dlerror());
--- 78,88 ----
 	}
 
! dlopenflags = PyThreadState_Get()->interp->dlopenflags;
! 
 	if (Py_VerboseFlag)
! 		printf("dlopen(\"%s\", %x);\n", pathname, dlopenflags);
! 
! 	handle = dlopen(pathname, dlopenflags);
! 
 	if (handle == NULL) {
 		PyErr_SetString(PyExc_ImportError, dlerror());
Index: pystate.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/pystate.c,v
retrieving revision 2.18
retrieving revision 2.19
diff -C2 -r2.18 -r2.19
*** pystate.c	2001年07月03日 23:39:52	2.18
--- pystate.c	2001年07月18日 16:17:16	2.19
***************
*** 4,7 ****
--- 4,17 ----
 #include "Python.h"
 
+ #ifdef HAVE_DLOPEN
+ #ifdef HAVE_DLFCN_H
+ #include <dlfcn.h>
+ #endif
+ #ifndef RTLD_LAZY
+ #define RTLD_LAZY 1
+ #endif
+ #endif
+ 
+ 
 #define ZAP(x) { \
 	PyObject *tmp = (PyObject *)(x); \
***************
*** 40,43 ****
--- 50,60 ----
 		interp->checkinterval = 10;
 		interp->tstate_head = NULL;
+ #ifdef HAVE_DLOPEN
+ #ifdef RTLD_NOW
+ interp->dlopenflags = RTLD_NOW;
+ #else
+ 		interp->dlopenflags = RTLD_LAZY;
+ #endif
+ #endif
 
 		HEAD_LOCK();
Index: sysmodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/sysmodule.c,v
retrieving revision 2.88
retrieving revision 2.89
diff -C2 -r2.88 -r2.89
*** sysmodule.c	2001年06月27日 19:19:46	2.88
--- sysmodule.c	2001年07月18日 16:17:16	2.89
***************
*** 395,398 ****
--- 395,440 ----
 recursion from causing an overflow of the C stack and crashing Python.";
 
+ #ifdef HAVE_DLOPEN
+ static PyObject *
+ sys_setdlopenflags(PyObject *self, PyObject *args)
+ {
+ 	int new_val;
+ PyThreadState *tstate = PyThreadState_Get();
+ 	if (!PyArg_ParseTuple(args, "i:setdlopenflags", &new_val))
+ 		return NULL;
+ if (!tstate)
+ 		return NULL;
+ tstate->interp->dlopenflags = new_val;
+ 	Py_INCREF(Py_None);
+ 	return Py_None;
+ }
+ 
+ static char setdlopenflags_doc[] =
+ "setdlopenflags(n) -> None\n\
+ \n\
+ Set the flags that will be used for dlopen() calls. Among other\n\
+ things, this will enable a lazy resolving of symbols when imporing\n\
+ a module, if called as sys.setdlopenflags(0)\n\
+ To share symols across extension modules, call as\n\
+ sys.setdlopenflags(dl.RTLD_NOW|dl.RTLD_GLOBAL)";
+ 
+ static PyObject *
+ sys_getdlopenflags(PyObject *self, PyObject *args)
+ {
+ PyThreadState *tstate = PyThreadState_Get();
+ 	if (!PyArg_ParseTuple(args, ":getdlopenflags"))
+ 		return NULL;
+ if (!tstate)
+ 		return NULL;
+ return PyInt_FromLong(tstate->interp->dlopenflags);
+ }
+ 
+ static char getdlopenflags_doc[] =
+ "getdlopenflags() -> int\n\
+ \n\
+ Return the current value of the flags that are used for dlopen()\n\
+ calls. The flag constants are defined in the dl module.";
+ #endif
+ 
 #ifdef USE_MALLOPT
 /* Link with -lmalloc (or -lmpc) on an SGI */
***************
*** 502,505 ****
--- 544,551 ----
 	{"getdefaultencoding", sys_getdefaultencoding, 1,
 	 getdefaultencoding_doc}, 
+ #ifdef HAVE_DLOPEN
+ {"getdlopenflags", sys_getdlopenflags, 1, 
+ getdlopenflags_doc},
+ #endif
 #ifdef COUNT_ALLOCS
 	{"getcounts",	sys_getcounts, 1},
***************
*** 523,526 ****
--- 569,576 ----
 	{"setcheckinterval",	sys_setcheckinterval, 1,
 	 setcheckinterval_doc}, 
+ #ifdef HAVE_DLOPEN
+ {"setdlopenflags", sys_setdlopenflags, 1, 
+ setdlopenflags_doc},
+ #endif
 	{"setprofile",	sys_setprofile, 0, setprofile_doc},
 	{"setrecursionlimit", sys_setrecursionlimit, 1,
***************
*** 660,666 ****
--- 710,718 ----
 exc_info() -- return thread-safe information about the current exception\n\
 exit() -- exit the interpreter by raising SystemExit\n\
+ getdlopenflags() -- returns flags to be used for dlopen() calls\n\
 getrefcount() -- return the reference count for an object (plus one :-)\n\
 getrecursionlimit() -- return the max recursion depth for the interpreter\n\
 setcheckinterval() -- control how often the interpreter checks for events\n\
+ setdlopenflags() -- set the flags to be used for dlopen() calls\n\
 setprofile() -- set the global profiling function\n\
 setrecursionlimit() -- set the max recursion depth for the interpreter\n\

AltStyle によって変換されたページ (->オリジナル) /