Tcl Source Code

Artifact [afe06cbf7b]
Login

Artifact afe06cbf7ba0bdbaaf7d55056ea027b6fbb2b318:

Attachment "tcl-readdir.patch" to ticket [1095909fff] added by jenglish 2005-01-10 02:31:41.
Date: Sun Jan 09 11:16:49 -0800 2005
Files: unix/tcl.m4 unix/tclUnixPort.h unix/tclConfig.h.in unix/tclUnixThrd.c
Bugid: 1095909

--- unix/tcl.m4.readdir.old	2005-01-04 08:32:22.000000000 -0800
+++ unix/tcl.m4	2005-01-04 08:29:59.000000000 -0800
@@ -514,43 +514,6 @@
 	    fi
 	fi
 	LIBS=$ac_saved_libs
-	AC_CHECK_FUNCS(readdir_r)
-	if test "x$ac_cv_func_readdir_r" = "xyes"; then
-            AC_MSG_CHECKING([how many args readdir_r takes])
-	    # IRIX 5.3 has a 2 arg version of readdir_r
-	    # while other systems have a 3 arg version.
-	    AC_CACHE_VAL(tcl_cv_two_arg_readdir_r,
-	        AC_TRY_COMPILE([#include <stdlib.h>
-#include <sys/types.h>
-#ifdef NO_DIRENT_H
-# include <sys/dir.h>  /* logic from tcl/compat/dirent.h *
-# define dirent direct  *                                */
-#else
-# include <dirent.h>
-#endif
-], [readdir_r(NULL, NULL);],
-	        tcl_cv_two_arg_readdir_r=yes, tcl_cv_two_arg_readdir_r=no))
-	    AC_CACHE_VAL(tcl_cv_three_arg_readdir_r,
-	        AC_TRY_COMPILE([#include <stdlib.h>
-#include <sys/types.h>
-#ifdef NO_DIRENT_H
-# include <sys/dir.h>  /* logic from tcl/compat/dirent.h *
-# define dirent direct  *                                */
-#else
-# include <dirent.h>
-#endif
-], [readdir_r(NULL, NULL, NULL);],
-	        tcl_cv_three_arg_readdir_r=yes, tcl_cv_three_arg_readdir_r=no))
-	    if test "x$tcl_cv_two_arg_readdir_r" = "xyes" ; then
-                AC_MSG_RESULT([2])
-	        AC_DEFINE(HAVE_TWO_ARG_READDIR_R)
-	    elif test "x$tcl_cv_three_arg_readdir_r" = "xyes" ; then
-                AC_MSG_RESULT([3])
-	        AC_DEFINE(HAVE_THREE_ARG_READDIR_R)
-	    else
-	        AC_MSG_ERROR([unknown number of args for readdir_r])
-	    fi
-	fi
     else
 	TCL_THREADS=0
 	AC_MSG_RESULT([no (default)])
--- unix/tclUnixPort.h.readdir.old	2004-11-13 04:29:46.000000000 -0800
+++ unix/tclUnixPort.h	2005-01-04 12:30:46.000000000 -0800
@@ -56,11 +56,9 @@
 #ifdef HAVE_STRUCT_DIRENT64
 typedef struct dirent64	Tcl_DirEntry;
 #   define TclOSreaddir		readdir64
-#   define TclOSreaddir_r	readdir64_r
 #else
 typedef struct dirent	Tcl_DirEntry;
 #   define TclOSreaddir		readdir
-#   define TclOSreaddir_r	readdir_r
 #endif
 
 #ifdef HAVE_TYPE_OFF64_T
@@ -558,17 +556,13 @@
 EXTERN void	TclpMutexInit _ANSI_ARGS_((TclpMutex *mPtr));
 EXTERN void	TclpMutexLock _ANSI_ARGS_((TclpMutex *mPtr));
 EXTERN void	TclpMutexUnlock _ANSI_ARGS_((TclpMutex *mPtr));
-EXTERN Tcl_DirEntry * 	TclpReaddir(DIR *);
 EXTERN struct tm *     	TclpLocaltime(CONST time_t *);
 EXTERN struct tm *     	TclpGmtime(CONST time_t *);
 EXTERN char *          	TclpInetNtoa(struct in_addr);
-#   define readdir(x)	TclpReaddir(x)
 /* #define localtime(x)	TclpLocaltime(x)
  * #define gmtime(x)	TclpGmtime(x)    */
 #   undef inet_ntoa
 #   define inet_ntoa(x)	TclpInetNtoa(x)
-#   undef TclOSreaddir
-#   define TclOSreaddir(x) TclpReaddir(x)
 #   ifdef MAC_OSX_TCL
 /* 
  * On Mac OS X, realpath is currently not
--- unix/tclConfig.h.in.readdir.old	2004-11-24 13:05:11.000000000 -0800
+++ unix/tclConfig.h.in	2005-01-04 08:34:05.000000000 -0800
@@ -63,9 +63,6 @@
 /* Does putenv() copy strings or incorporate them by reference? */
 #undef HAVE_PUTENV_THAT_COPIES
 
-/* Define to 1 if you have the `readdir_r' function. */
-#undef HAVE_READDIR_R
-
 /* Are characters signed? */
 #undef HAVE_SIGNED_CHAR
 
--- unix/tclUnixThrd.c.readdir.old	2004-11-24 13:05:12.000000000 -0800
+++ unix/tclUnixThrd.c	2005-01-09 11:16:46.052938278 -0800
@@ -20,10 +20,6 @@
 
 typedef struct ThreadSpecificData {
     char	    	nabuf[16];
-    struct {
-	Tcl_DirEntry ent;
-	char name[MAXNAMLEN+1];
-    } rdbuf;
 } ThreadSpecificData;
 
 static Tcl_ThreadDataKey dataKey;
@@ -867,56 +863,18 @@
  * Side effects:
  *	See documentation of C functions.
  *
+ * Notes:
+ * 	TclpReaddir is no longer used by the core (see 1095909),
+ * 	but it appears in the internal stubs table (see #589526).
  *----------------------------------------------------------------------
  */
 
-#if defined(TCL_THREADS) && !defined(HAVE_READDIR_R)
-TCL_DECLARE_MUTEX( rdMutex )
-#undef readdir
-#endif
-
 Tcl_DirEntry *
 TclpReaddir(DIR * dir)
 {
-    Tcl_DirEntry *ent;
-#ifdef TCL_THREADS
-    ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
-
-#ifdef HAVE_READDIR_R
-    ent = &tsdPtr->rdbuf.ent;
-# ifdef HAVE_TWO_ARG_READDIR_R
-    if (TclOSreaddir_r(dir, ent) != 0) {
-# else /* HAVE_THREE_ARG_READDIR_R */
-    if (TclOSreaddir_r(dir, ent, &ent) != 0) {
-# endif /* HAVE_TWO_ARG_READDIR_R */
-	ent = NULL;
-    }
-
-#else /* !HAVE_READDIR_R */
-
-    Tcl_MutexLock(&rdMutex);
-#   ifdef HAVE_STRUCT_DIRENT64
-    ent = readdir64(dir);
-#   else /* !HAVE_STRUCT_DIRENT64 */
-    ent = readdir(dir);
-#   endif /* HAVE_STRUCT_DIRENT64 */
-    if (ent != NULL) {
-	memcpy((VOID *) &tsdPtr->rdbuf.ent, (VOID *) ent,
-		sizeof(tsdPtr->rdbuf));
-	ent = &tsdPtr->rdbuf.ent;
-    }
-    Tcl_MutexUnlock(&rdMutex);
-
-#endif /* HAVE_READDIR_R */
-#else
-#   ifdef HAVE_STRUCT_DIRENT64
-    ent = readdir64(dir);
-#   else /* !HAVE_STRUCT_DIRENT64 */
-    ent = readdir(dir);
-#   endif /* HAVE_STRUCT_DIRENT64 */
-#endif
-    return ent;
+    return TclOSreaddir(dir);
 }
+
 char *
 TclpInetNtoa(struct in_addr addr)
 {