From: Luke Howard Date: Sat, 17 Sep 2011 06:17:57 +0000 (+1000) Subject: create TLD on-demand for threads started pre-DLL load X-Git-Url: http://www.project-moonshot.org/gitweb/?p=mech_eap.orig;a=commitdiff_plain;h=23bbef1fbb4bcaffb9b954a409942b2807476a08 create TLD on-demand for threads started pre-DLL load Conflicts: moonshot/mech_eap/util_tld.c --- diff --git a/build-aux/compile b/build-aux/compile index bac481c..5360806 100755 --- a/build-aux/compile +++ b/build-aux/compile @@ -1,9 +1,9 @@ #! /bin/sh # Wrapper for compilers which do not understand `-c -o'. -scriptversion=2010-11-15.09; # UTC +scriptversion=2009-10-06.20; # UTC -# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009, 2010 Free Software +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009 Free Software # Foundation, Inc. # Written by Tom Tromey . # @@ -18,7 +18,8 @@ scriptversion=2010-11-15.09; # UTC # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a @@ -29,171 +30,6 @@ scriptversion=2010-11-15.09; # UTC # bugs to or send patches to # . -nl=' -' - -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent tools from complaining about whitespace usage. -IFS=" "" $nl" - -file_conv= - -# func_file_conv build_file lazy -# Convert a $build file to $host form and store it in $file -# Currently only supports Win32 hosts. If the determined conversion -# type is listed in (the comma separated) LAZY, no conversion will -# take place. -func_file_conv () -{ - file=$1 - case $file in - / | /[!/]*) # absolute file, and not a UNC file - if test -z "$file_conv"; then - # lazily determine how to convert abs files - case `uname -s` in - MINGW*) - file_conv=mingw - ;; - CYGWIN*) - file_conv=cygwin - ;; - *) - file_conv=wine - ;; - esac - fi - case $file_conv/,$2, in - *,$file_conv,*) - ;; - mingw/*) - file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` - ;; - cygwin/*) - file=`cygpath -m "$file" || echo "$file"` - ;; - wine/*) - file=`winepath -w "$file" || echo "$file"` - ;; - esac - ;; - esac -} - -# func_cl_wrapper cl arg... -# Adjust compile command to suit cl -func_cl_wrapper () -{ - # Assume a capable shell - lib_path= - shared=: - linker_opts= - for arg - do - if test -n "$eat"; then - eat= - else - case $1 in - -o) - # configure might choose to run compile as `compile cc -o foo foo.c'. - eat=1 - case $2 in - *.o | *.[oO][bB][jJ]) - func_file_conv "$2" - set x "$@" -Fo"$file" - shift - ;; - *) - func_file_conv "$2" - set x "$@" -Fe"$file" - shift - ;; - esac - ;; - -I*) - func_file_conv "${1#-I}" mingw - set x "$@" -I"$file" - shift - ;; - -l*) - lib=${1#-l} - found=no - save_IFS=$IFS - IFS=';' - for dir in $lib_path $LIB - do - IFS=$save_IFS - if $shared && test -f "$dir/$lib.dll.lib"; then - found=yes - set x "$@" "$dir/$lib.dll.lib" - break - fi - if test -f "$dir/$lib.lib"; then - found=yes - set x "$@" "$dir/$lib.lib" - break - fi - done - IFS=$save_IFS - - test "$found" != yes && set x "$@" "$lib.lib" - shift - ;; - -L*) - func_file_conv "${1#-L}" - if test -z "$lib_path"; then - lib_path=$file - else - lib_path="$lib_path;$file" - fi - linker_opts="$linker_opts -LIBPATH:$file" - ;; - -static) - shared=false - ;; - -Wl,*) - arg=${1#-Wl,} - save_ifs="$IFS"; IFS=',' - for flag in $arg; do - IFS="$save_ifs" - linker_opts="$linker_opts $flag" - done - IFS="$save_ifs" - ;; - -Xlinker) - eat=1 - linker_opts="$linker_opts $2" - ;; - -*) - set x "$@" "$1" - shift - ;; - *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) - func_file_conv "$1" - set x "$@" -Tp"$file" - shift - ;; - *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) - func_file_conv "$1" mingw - set x "$@" "$file" - shift - ;; - *) - set x "$@" "$1" - shift - ;; - esac - fi - shift - done - if test -n "$linker_opts"; then - linker_opts="-link$linker_opts" - fi - exec "$@" $linker_opts - exit 1 -} - -eat= - case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 @@ -218,13 +54,11 @@ EOF echo "compile $scriptversion" exit $? ;; - cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) - func_cl_wrapper "$@" # Doesn't return... - ;; esac ofile= cfile= +eat= for arg do diff --git a/mech_eap/util_tld.c b/mech_eap/util_tld.c index 10e3359..05bc3d1 100644 --- a/mech_eap/util_tld.c +++ b/mech_eap/util_tld.c @@ -56,19 +56,23 @@ destroyThreadLocalData(struct gss_eap_thread_local_data *tld) * data and uses this index with TlsSetValue() to store it. * It can then subsequently be retrieved with TlsGetValue(). */ -static DWORD tlsIndex; +static DWORD tlsIndex = TLS_OUT_OF_INDEXES; /* Access thread-local data */ struct gss_eap_thread_local_data * gssEapGetThreadLocalData(void) { - struct gss_eap_thread_local_data *tld; + struct gss_eap_thread_local_data *tlsData; - tld = TlsGetValue(tlsIndex); + GSSEAP_ASSERT(tlsIndex != TLS_OUT_OF_INDEXES); - GSSEAP_ASSERT(tld != NULL); + tlsData = TlsGetValue(tlsIndex); + if (tlsData == NULL) { + tlsData = GSSEAP_CALLOC(1, sizeof(*tlsData)); + TlsSetValue(tlsIndex, tlsData); + } - return tld; + return tlsData; } BOOL WINAPI @@ -93,8 +97,9 @@ DllMain(HINSTANCE hDLL, /* DLL module handle */ case DLL_THREAD_ATTACH: /* Initialize the TLS index for this thread. */ tlsData = GSSEAP_CALLOC(1, sizeof(*tlsData)); - if (tlsData != NULL) - TlsSetValue(tlsIndex, tlsData); + if (tlsData == NULL) + return FALSE; + TlsSetValue(tlsIndex, tlsData); break; case DLL_THREAD_DETACH: /* Release the allocated memory for this thread. */