From 662e3f9cf9ef3534b5ac05ea668b44fd912d2180 Mon Sep 17 00:00:00 2001 From: das Date: Tue, 6 Aug 2002 01:49:27 +0000 Subject: * generic/tclInt.decls: * unix/tclUnixThrd.c: Added stubs and implementations for non-threaded build for the tclUnixThrd.c procs TclpReaddir, TclpLocaltime, TclpGmtime and TclpInetNtoa. Fixes link errors in stubbed & threaded extensions that include tclUnixPort.h and use any of the procs readdir, localtime, gmtime or inet_ntoa (e.g. TclX 8.4) [Bug 589526] * generic/tclIntPlatDecls.h: * generic/tclStubInit.c: Regen. --- ChangeLog | 12 ++++++++++++ generic/tclInt.decls | 20 +++++++++++++++++++- generic/tclIntPlatDecls.h | 30 +++++++++++++++++++++++++++++- generic/tclStubInit.c | 6 +++++- unix/tclUnixThrd.c | 32 +++++++++++++++++++++++++++----- 5 files changed, 92 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6fa764e..ae8228e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2002-08-06 Daniel Steffen + + * generic/tclInt.decls: + * unix/tclUnixThrd.c: Added stubs and implementations for + non-threaded build for the tclUnixThrd.c procs TclpReaddir, + TclpLocaltime, TclpGmtime and TclpInetNtoa. + Fixes link errors in stubbed & threaded extensions that include + tclUnixPort.h and use any of the procs readdir, localtime, + gmtime or inet_ntoa (e.g. TclX 8.4) [Bug 589526] + * generic/tclIntPlatDecls.h: + * generic/tclStubInit.c: Regen. + 2002-08-05 Don Porter * library/tcltest/tcltest.tcl: The setup and cleanup scripts are now diff --git a/generic/tclInt.decls b/generic/tclInt.decls index 5a91a50..8c1e733 100644 --- a/generic/tclInt.decls +++ b/generic/tclInt.decls @@ -12,7 +12,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: tclInt.decls,v 1.54 2002/08/05 03:24:40 dgp Exp $ +# RCS: @(#) $Id: tclInt.decls,v 1.55 2002/08/06 01:49:27 das Exp $ library tcl @@ -954,3 +954,21 @@ declare 9 unix { TclFile TclpCreateTempFile(CONST char *contents) } +# Added in 8.4: + +declare 10 unix { + Tcl_DirEntry * TclpReaddir(DIR * dir) +} + +declare 11 unix { + struct tm * TclpLocaltime(time_t * clock) +} + +declare 12 unix { + struct tm * TclpGmtime(time_t * clock) +} + +declare 13 unix { + char * TclpInetNtoa(struct in_addr addr) +} + diff --git a/generic/tclIntPlatDecls.h b/generic/tclIntPlatDecls.h index 090d3d1..b430443 100644 --- a/generic/tclIntPlatDecls.h +++ b/generic/tclIntPlatDecls.h @@ -9,7 +9,7 @@ * Copyright (c) 1998-1999 by Scriptics Corporation. * All rights reserved. * - * RCS: @(#) $Id: tclIntPlatDecls.h,v 1.17 2002/04/19 14:18:38 das Exp $ + * RCS: @(#) $Id: tclIntPlatDecls.h,v 1.18 2002/08/06 01:49:27 das Exp $ */ #ifndef _TCLINTPLATDECLS @@ -59,6 +59,14 @@ EXTERN int TclUnixWaitForFile _ANSI_ARGS_((int fd, int mask, /* 9 */ EXTERN TclFile TclpCreateTempFile _ANSI_ARGS_(( CONST char * contents)); +/* 10 */ +EXTERN Tcl_DirEntry * TclpReaddir _ANSI_ARGS_((DIR * dir)); +/* 11 */ +EXTERN struct tm * TclpLocaltime _ANSI_ARGS_((time_t * clock)); +/* 12 */ +EXTERN struct tm * TclpGmtime _ANSI_ARGS_((time_t * clock)); +/* 13 */ +EXTERN char * TclpInetNtoa _ANSI_ARGS_((struct in_addr addr)); #endif /* UNIX */ #ifdef __WIN32__ /* 0 */ @@ -218,6 +226,10 @@ typedef struct TclIntPlatStubs { TclFile (*tclpOpenFile) _ANSI_ARGS_((CONST char * fname, int mode)); /* 7 */ int (*tclUnixWaitForFile) _ANSI_ARGS_((int fd, int mask, int timeout)); /* 8 */ TclFile (*tclpCreateTempFile) _ANSI_ARGS_((CONST char * contents)); /* 9 */ + Tcl_DirEntry * (*tclpReaddir) _ANSI_ARGS_((DIR * dir)); /* 10 */ + struct tm * (*tclpLocaltime) _ANSI_ARGS_((time_t * clock)); /* 11 */ + struct tm * (*tclpGmtime) _ANSI_ARGS_((time_t * clock)); /* 12 */ + char * (*tclpInetNtoa) _ANSI_ARGS_((struct in_addr addr)); /* 13 */ #endif /* UNIX */ #ifdef __WIN32__ void (*tclWinConvertError) _ANSI_ARGS_((DWORD errCode)); /* 0 */ @@ -332,6 +344,22 @@ extern TclIntPlatStubs *tclIntPlatStubsPtr; #define TclpCreateTempFile \ (tclIntPlatStubsPtr->tclpCreateTempFile) /* 9 */ #endif +#ifndef TclpReaddir +#define TclpReaddir \ + (tclIntPlatStubsPtr->tclpReaddir) /* 10 */ +#endif +#ifndef TclpLocaltime +#define TclpLocaltime \ + (tclIntPlatStubsPtr->tclpLocaltime) /* 11 */ +#endif +#ifndef TclpGmtime +#define TclpGmtime \ + (tclIntPlatStubsPtr->tclpGmtime) /* 12 */ +#endif +#ifndef TclpInetNtoa +#define TclpInetNtoa \ + (tclIntPlatStubsPtr->tclpInetNtoa) /* 13 */ +#endif #endif /* UNIX */ #ifdef __WIN32__ #ifndef TclWinConvertError diff --git a/generic/tclStubInit.c b/generic/tclStubInit.c index eb9480b..a9f5ab4 100644 --- a/generic/tclStubInit.c +++ b/generic/tclStubInit.c @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclStubInit.c,v 1.73 2002/07/17 18:21:55 msofer Exp $ + * RCS: @(#) $Id: tclStubInit.c,v 1.74 2002/08/06 01:49:27 das Exp $ */ #include "tclInt.h" @@ -267,6 +267,10 @@ TclIntPlatStubs tclIntPlatStubs = { TclpOpenFile, /* 7 */ TclUnixWaitForFile, /* 8 */ TclpCreateTempFile, /* 9 */ + TclpReaddir, /* 10 */ + TclpLocaltime, /* 11 */ + TclpGmtime, /* 12 */ + TclpInetNtoa, /* 13 */ #endif /* UNIX */ #ifdef __WIN32__ TclWinConvertError, /* 0 */ diff --git a/unix/tclUnixThrd.c b/unix/tclUnixThrd.c index c0640cd..1dd2d99 100644 --- a/unix/tclUnixThrd.c +++ b/unix/tclUnixThrd.c @@ -13,10 +13,10 @@ */ #include "tclInt.h" +#include "tclPort.h" #ifdef TCL_THREADS -#include "tclPort.h" #include "pthread.h" typedef struct ThreadSpecificData { @@ -772,6 +772,7 @@ TclpFinalizeCondition(condPtr) *condPtr = NULL; } } +#endif /* TCL_THREADS */ /* *---------------------------------------------------------------------- @@ -790,7 +791,7 @@ TclpFinalizeCondition(condPtr) *---------------------------------------------------------------------- */ -#ifndef HAVE_READDIR_R +#if defined(TCL_THREADS) && !defined(HAVE_READDIR_R) TCL_DECLARE_MUTEX( rdMutex ) #undef readdir #endif @@ -798,8 +799,9 @@ TCL_DECLARE_MUTEX( rdMutex ) Tcl_DirEntry * TclpReaddir(DIR * dir) { - ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); Tcl_DirEntry *ent; +#ifdef TCL_THREADS + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); #ifdef HAVE_READDIR_R ent = &tsdPtr->rdbuf.ent; @@ -823,10 +825,17 @@ TclpReaddir(DIR * dir) 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; } -#if !defined(HAVE_GMTIME_R) || !defined(HAVE_LOCALTIME_R) +#if defined(TCL_THREADS) && (!defined(HAVE_GMTIME_R) || !defined(HAVE_LOCALTIME_R)) TCL_DECLARE_MUTEX( tmMutex ) #undef localtime #undef gmtime @@ -835,6 +844,7 @@ TCL_DECLARE_MUTEX( tmMutex ) struct tm * TclpLocaltime(time_t * clock) { +#ifdef TCL_THREADS ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); #ifdef HAVE_LOCALTIME_R @@ -843,13 +853,17 @@ TclpLocaltime(time_t * clock) Tcl_MutexLock( &tmMutex ); memcpy( (VOID *) &tsdPtr->ltbuf, (VOID *) localtime( clock ), sizeof (struct tm) ); Tcl_MutexUnlock( &tmMutex ); - return &tsdPtr->ltbuf; + return &tsdPtr->ltbuf; #endif +#else + return localtime(clock); +#endif } struct tm * TclpGmtime(time_t * clock) { +#ifdef TCL_THREADS ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); #ifdef HAVE_GMTIME_R @@ -860,11 +874,15 @@ TclpGmtime(time_t * clock) Tcl_MutexUnlock( &tmMutex ); return &tsdPtr->gtbuf; #endif +#else + return gmtime(clock); +#endif } char * TclpInetNtoa(struct in_addr addr) { +#ifdef TCL_THREADS ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); union { unsigned long l; @@ -874,8 +892,12 @@ TclpInetNtoa(struct in_addr addr) u.l = (unsigned long) addr.s_addr; sprintf(tsdPtr->nabuf, "%u.%u.%u.%u", u.b[0], u.b[1], u.b[2], u.b[3]); return tsdPtr->nabuf; +#else + return inet_ntoa(addr); +#endif } +#ifdef TCL_THREADS /* * Additions by AOL for specialized thread memory allocator. */ -- cgit v0.12