From e80d61bf6acee54bf4835396b8b715e70833fae0 Mon Sep 17 00:00:00 2001 From: Wan-Teh Chang Date: Fri, 28 Aug 2009 19:53:48 -0700 Subject: [PATCH] Update NSPR to the NSPR_HEAD_20090828 CVS tag. Contains fixes for bug 366194, bug 506502, bug 508165, bug 509243, bug 510705, bug 511315, bug 512806. --- nsprpub/config/prdepend.h | 1 - nsprpub/configure | 71 ++++++++++---------- nsprpub/configure.in | 16 +++-- nsprpub/lib/ds/Makefile.in | 7 -- nsprpub/lib/libc/include/Makefile.in | 5 -- nsprpub/lib/libc/src/Makefile.in | 5 -- nsprpub/lib/msgc/include/Makefile.in | 4 -- nsprpub/lib/msgc/src/Makefile.in | 5 -- nsprpub/pr/include/md/_os2.h | 8 ++- nsprpub/pr/include/md/_riscos.h | 6 +- nsprpub/pr/include/md/_win95.h | 5 ++ nsprpub/pr/include/prlink.h | 2 + nsprpub/pr/src/Makefile.in | 6 -- nsprpub/pr/src/linking/prlink.c | 20 +++--- nsprpub/pr/src/md/os2/os2misc.c | 97 +++++++++++++++++++++++----- nsprpub/pr/src/md/windows/ntmisc.c | 63 ++++++++++++------ nsprpub/pr/src/misc/prtime.c | 3 + nsprpub/pr/tests/Makefile.in | 4 ++ 18 files changed, 201 insertions(+), 127 deletions(-) diff --git a/nsprpub/config/prdepend.h b/nsprpub/config/prdepend.h index 55444c40b3aa..df72c56882d2 100644 --- a/nsprpub/config/prdepend.h +++ b/nsprpub/config/prdepend.h @@ -42,4 +42,3 @@ */ #error "Do not include this header file." - diff --git a/nsprpub/configure b/nsprpub/configure index 6c923af51cc8..b3cefb6f6cb5 100755 --- a/nsprpub/configure +++ b/nsprpub/configure @@ -2788,6 +2788,7 @@ if test -n "$CROSS_COMPILE"; then mingw*) OS_ARCH=WINNT ;; wince*) OS_ARCH=WINCE ;; darwin*) OS_ARCH=Darwin ;; + riscos*) OS_ARCH=RISCOS ;; esac else OS_ARCH=`uname -s | sed -e 's|/|_|g'` @@ -2974,17 +2975,17 @@ EOF DSO_LDOPTS='-brtl -bnortllib -bM:SRE -bnoentry -bexpall -blibpath:/usr/lib:/lib' ac_safe=`echo "sys/atomic_op.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for sys/atomic_op.h""... $ac_c" 1>&6 -echo "configure:2978: checking for sys/atomic_op.h" >&5 +echo "configure:2979: checking for sys/atomic_op.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2988: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2989: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -3141,7 +3142,7 @@ EOF _DEBUG_FLAGS='-gdwarf-2 -O0' MKSHLIB='$(CCC) $(DSO_LDOPTS) -o $@' echo $ac_n "checking for gethostbyaddr in -lbind""... $ac_c" 1>&6 -echo "configure:3145: checking for gethostbyaddr in -lbind" >&5 +echo "configure:3146: checking for gethostbyaddr in -lbind" >&5 ac_lib_var=`echo bind'_'gethostbyaddr | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3149,7 +3150,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lbind $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3165: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -4227,9 +4228,9 @@ EOF DLLFLAGS='-OUT:"$@"' if test -n "$MOZ_DEBUG_SYMBOLS"; then - OS_LDFLAGS=-DEBUG -DEBUGTYPE:CV - OS_DLLFLAGS=-DEBUG -DEBUGTYPE:CV - DSO_LDOPTS=-DEBUG -DEBUGTYPE:CV + OS_LDFLAGS='-DEBUG -DEBUGTYPE:CV' + OS_DLLFLAGS='-DEBUG -DEBUGTYPE:CV' + DSO_LDOPTS='-DEBUG -DEBUGTYPE:CV' fi _DEBUG_FLAGS=-Zi _OPTIMIZE_FLAGS=-O2 @@ -4506,17 +4507,17 @@ EOF _OPTIMIZE_FLAGS="$_OPTIMIZE_FLAGS -Olimit 4000" ac_safe=`echo "machine/builtins.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for machine/builtins.h""... $ac_c" 1>&6 -echo "configure:4510: checking for machine/builtins.h" >&5 +echo "configure:4511: checking for machine/builtins.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:4520: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:4521: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -4605,8 +4606,9 @@ EOF USE_PTHREADS=1 MDCPUCFG_H=_riscos.cfg PR_MD_CSRCS=riscos.c - DLL_SUFFIX=a - LD="/home/riscos/env/ro-ar cr" + DSO_CFLAGS=-fPIC + DSO_LDOPTS='-shared -Wl,-soname -Wl,$(notdir $@)' + MKSHLIB='$(CC) $(DSO_LDOPTS) -o $@' ;; *-*-sco*) @@ -5132,7 +5134,6 @@ EOF if test -n "$MOZ_OPTIMIZE"; then DSO_LDOPTS="$DSO_LDOPTS -Zlinker /EXEPACK:2 -Zlinker /PACKCODE -Zlinker /PACKDATA" fi - OS_LIBS="-lsocket" IMPLIB='emximp -o' FILTER='emxexp -o' if test -n "$MOZ_OS2_HIGH_MEMORY"; then @@ -5161,11 +5162,11 @@ if test -z "$SKIP_LIBRARY_CHECKS"; then case $target in -*-darwin*|*-beos*) +*-darwin*|*-beos*|*-os2*) ;; *) echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 -echo "configure:5169: checking for dlopen in -ldl" >&5 +echo "configure:5170: checking for dlopen in -ldl" >&5 ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -5173,7 +5174,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:5189: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -5201,17 +5202,17 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_safe=`echo "dlfcn.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for dlfcn.h""... $ac_c" 1>&6 -echo "configure:5205: checking for dlfcn.h" >&5 +echo "configure:5206: checking for dlfcn.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:5215: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:5216: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -5244,13 +5245,13 @@ esac if test $ac_cv_prog_gcc = yes; then echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6 -echo "configure:5248: checking whether ${CC-cc} needs -traditional" >&5 +echo "configure:5249: checking whether ${CC-cc} needs -traditional" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_pattern="Autoconf.*'x'" cat > conftest.$ac_ext < Autoconf TIOCGETP @@ -5268,7 +5269,7 @@ rm -f conftest* if test $ac_cv_prog_gcc_traditional = no; then cat > conftest.$ac_ext < Autoconf TCGETA @@ -5292,12 +5293,12 @@ fi for ac_func in lchown strerror do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:5296: checking for $ac_func" >&5 +echo "configure:5297: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:5325: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -5361,7 +5362,7 @@ hpux*) if test -z "$GNU_CC"; then echo $ac_n "checking for +Olit support""... $ac_c" 1>&6 -echo "configure:5365: checking for +Olit support" >&5 +echo "configure:5366: checking for +Olit support" >&5 if eval "test \"`echo '$''{'ac_cv_hpux_usable_olit_option'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -5400,7 +5401,7 @@ darwin*) *) echo $ac_n "checking for pthread_create in -lpthreads""... $ac_c" 1>&6 -echo "configure:5404: checking for pthread_create in -lpthreads" >&5 +echo "configure:5405: checking for pthread_create in -lpthreads" >&5 echo " #include void *foo(void *v) { return v; } @@ -5422,7 +5423,7 @@ echo " echo "$ac_t""no" 1>&6 echo $ac_n "checking for pthread_create in -lpthread""... $ac_c" 1>&6 -echo "configure:5426: checking for pthread_create in -lpthread" >&5 +echo "configure:5427: checking for pthread_create in -lpthread" >&5 echo " #include void *foo(void *v) { return v; } @@ -5444,7 +5445,7 @@ echo " echo "$ac_t""no" 1>&6 echo $ac_n "checking for pthread_create in -lc_r""... $ac_c" 1>&6 -echo "configure:5448: checking for pthread_create in -lc_r" >&5 +echo "configure:5449: checking for pthread_create in -lc_r" >&5 echo " #include void *foo(void *v) { return v; } @@ -5466,7 +5467,7 @@ echo " echo "$ac_t""no" 1>&6 echo $ac_n "checking for pthread_create in -lc""... $ac_c" 1>&6 -echo "configure:5470: checking for pthread_create in -lc" >&5 +echo "configure:5471: checking for pthread_create in -lc" >&5 echo " #include void *foo(void *v) { return v; } @@ -5598,7 +5599,7 @@ if test -n "$USE_PTHREADS"; then rm -f conftest* ac_cv_have_dash_pthread=no echo $ac_n "checking whether ${CC-cc} accepts -pthread""... $ac_c" 1>&6 -echo "configure:5602: checking whether ${CC-cc} accepts -pthread" >&5 +echo "configure:5603: checking whether ${CC-cc} accepts -pthread" >&5 echo 'int main() { return 0; }' | cat > conftest.c ${CC-cc} -pthread -o conftest conftest.c > conftest.out 2>&1 if test $? -eq 0; then @@ -5621,7 +5622,7 @@ echo "configure:5602: checking whether ${CC-cc} accepts -pthread" >&5 ac_cv_have_dash_pthreads=no if test "$ac_cv_have_dash_pthread" = "no"; then echo $ac_n "checking whether ${CC-cc} accepts -pthreads""... $ac_c" 1>&6 -echo "configure:5625: checking whether ${CC-cc} accepts -pthreads" >&5 +echo "configure:5626: checking whether ${CC-cc} accepts -pthreads" >&5 echo 'int main() { return 0; }' | cat > conftest.c ${CC-cc} -pthreads -o conftest conftest.c > conftest.out 2>&1 if test $? -eq 0; then diff --git a/nsprpub/configure.in b/nsprpub/configure.in index e6b0d9c06fe5..e4d14554ac06 100644 --- a/nsprpub/configure.in +++ b/nsprpub/configure.in @@ -649,6 +649,7 @@ if test -n "$CROSS_COMPILE"; then mingw*) OS_ARCH=WINNT ;; wince*) OS_ARCH=WINCE ;; darwin*) OS_ARCH=Darwin ;; + riscos*) OS_ARCH=RISCOS ;; esac else OS_ARCH=`uname -s | sed -e 's|/|_|g'` @@ -1679,9 +1680,9 @@ tools are selected during the Xcode/Developer Tools installation.]) DLLFLAGS='-OUT:"$@"' if test -n "$MOZ_DEBUG_SYMBOLS"; then - OS_LDFLAGS=-DEBUG -DEBUGTYPE:CV - OS_DLLFLAGS=-DEBUG -DEBUGTYPE:CV - DSO_LDOPTS=-DEBUG -DEBUGTYPE:CV + OS_LDFLAGS='-DEBUG -DEBUGTYPE:CV' + OS_DLLFLAGS='-DEBUG -DEBUGTYPE:CV' + DSO_LDOPTS='-DEBUG -DEBUGTYPE:CV' fi _DEBUG_FLAGS=-Zi _OPTIMIZE_FLAGS=-O2 @@ -1881,8 +1882,9 @@ mips-sony-newsos*) USE_PTHREADS=1 MDCPUCFG_H=_riscos.cfg PR_MD_CSRCS=riscos.c - DLL_SUFFIX=a - LD="/home/riscos/env/ro-ar cr" + DSO_CFLAGS=-fPIC + DSO_LDOPTS='-shared -Wl,-soname -Wl,$(notdir $@)' + MKSHLIB='$(CC) $(DSO_LDOPTS) -o $@' ;; *-*-sco*) @@ -2229,7 +2231,6 @@ mips-sony-newsos*) if test -n "$MOZ_OPTIMIZE"; then DSO_LDOPTS="$DSO_LDOPTS -Zlinker /EXEPACK:2 -Zlinker /PACKCODE -Zlinker /PACKDATA" fi - OS_LIBS="-lsocket" IMPLIB='emximp -o' FILTER='emxexp -o' if test -n "$MOZ_OS2_HIGH_MEMORY"; then @@ -2279,9 +2280,10 @@ dnl AC_CHECK_LIB(vms_jackets, main) dnl We don't want anything to link with libdl even if it's present on OS X, dnl since it's not used and not part of the default installation. dnl The same goes for BeOS. +dnl OS/2 has dlfcn in libc. case $target in -*-darwin*|*-beos*) +*-darwin*|*-beos*|*-os2*) ;; *) AC_CHECK_LIB(dl, dlopen, diff --git a/nsprpub/lib/ds/Makefile.in b/nsprpub/lib/ds/Makefile.in index 751ea7380333..82dca0360d28 100644 --- a/nsprpub/lib/ds/Makefile.in +++ b/nsprpub/lib/ds/Makefile.in @@ -184,10 +184,3 @@ else $(INSTALL) -m 444 $(SHARED_LIBRARY) $(dist_bindir) endif endif -ifeq ($(MOZ_BITS),16) - $(INSTALL) -m 444 $(HEADERS) $(MOZ_INCL) - $(INSTALL) -m 444 $(TARGETS) $(MOZ_DIST)/lib - $(INSTALL) -m 444 $(TARGETS) $(MOZ_DIST)/bin -endif - - diff --git a/nsprpub/lib/libc/include/Makefile.in b/nsprpub/lib/libc/include/Makefile.in index 9d5e2e18668e..a64a66c57100 100644 --- a/nsprpub/lib/libc/include/Makefile.in +++ b/nsprpub/lib/libc/include/Makefile.in @@ -54,8 +54,3 @@ include $(topsrcdir)/config/rules.mk export:: $(HEADERS) $(INSTALL) -m 444 $(HEADERS) $(dist_includedir) -ifeq ($(MOZ_BITS),16) - $(INSTALL) -m 444 $(HEADERS) $(MOZ_INCL) -endif - - diff --git a/nsprpub/lib/libc/src/Makefile.in b/nsprpub/lib/libc/src/Makefile.in index 5388f8f2a406..2cafb1a76a00 100644 --- a/nsprpub/lib/libc/src/Makefile.in +++ b/nsprpub/lib/libc/src/Makefile.in @@ -185,8 +185,3 @@ else $(INSTALL) -m 444 $(SHARED_LIBRARY) $(dist_bindir) endif endif -ifeq ($(MOZ_BITS),16) - $(INSTALL) -m 444 $(TARGETS) $(MOZ_DIST)/lib - $(INSTALL) -m 444 $(TARGETS) $(MOZ_DIST)/bin -endif - diff --git a/nsprpub/lib/msgc/include/Makefile.in b/nsprpub/lib/msgc/include/Makefile.in index 60803a028612..86e152a590b7 100644 --- a/nsprpub/lib/msgc/include/Makefile.in +++ b/nsprpub/lib/msgc/include/Makefile.in @@ -55,7 +55,3 @@ include $(topsrcdir)/config/rules.mk export:: $(EXPORT_HEADERS) $(INSTALL) -m 444 $(EXPORT_HEADERS) $(dist_includedir) -ifeq ($(MOZ_BITS),16) - $(INSTALL) -m 444 $(EXPORT_HEADERS) $(MOZ_INCL) -endif - diff --git a/nsprpub/lib/msgc/src/Makefile.in b/nsprpub/lib/msgc/src/Makefile.in index 5d5a11462647..bcc586248d94 100644 --- a/nsprpub/lib/msgc/src/Makefile.in +++ b/nsprpub/lib/msgc/src/Makefile.in @@ -91,8 +91,3 @@ export:: $(TARGETS) ifdef SHARED_LIBRARY $(INSTALL) -m 444 $(SHARED_LIBRARY) $(dist_bindir) endif -ifeq ($(MOZ_BITS),16) - $(INSTALL) -m 444 $(TARGETS) $(MOZ_DIST)/lib - $(INSTALL) -m 444 $(TARGETS) $(MOZ_DIST)/bin -endif - diff --git a/nsprpub/pr/include/md/_os2.h b/nsprpub/pr/include/md/_os2.h index e5ea98332315..67280dce1cb5 100644 --- a/nsprpub/pr/include/md/_os2.h +++ b/nsprpub/pr/include/md/_os2.h @@ -450,10 +450,12 @@ extern struct PRThread * _MD_CURRENT_THREAD(void); #define _MD_INIT_STACK(stack, redzone) #define _MD_CLEAR_STACK(stack) -/* --- Memory-mapped files stuff --- not implemented on OS/2 */ - +/* --- Memory-mapped files stuff --- */ +/* ReadOnly and WriteCopy modes are simulated on OS/2; + * ReadWrite mode is not supported. + */ struct _MDFileMap { - PRInt8 unused; + PROffset64 maxExtent; }; extern PRStatus _MD_CreateFileMap(struct PRFileMap *fmap, PRInt64 size); diff --git a/nsprpub/pr/include/md/_riscos.h b/nsprpub/pr/include/md/_riscos.h index 5a0309eb3e46..c95067cfb140 100644 --- a/nsprpub/pr/include/md/_riscos.h +++ b/nsprpub/pr/include/md/_riscos.h @@ -44,7 +44,7 @@ #define PR_LINKER_ARCH "riscos" #define _PR_SI_SYSNAME "RISCOS" #define _PR_SI_ARCHITECTURE "arm" -#define PR_DLL_SUFFIX ".a" +#define PR_DLL_SUFFIX ".so" #define _PR_POLL_AVAILABLE #define _PR_USE_POLL @@ -60,8 +60,8 @@ #undef HAVE_STACK_GROWING_UP -#undef HAVE_DLL -#undef USE_DLFCN +#define HAVE_DLL +#define USE_DLFCN #define NEED_STRFTIME_LOCK #define NEED_TIME_R #define PT_NO_SIGTIMEDWAIT diff --git a/nsprpub/pr/include/md/_win95.h b/nsprpub/pr/include/md/_win95.h index 42eed5cf2f8a..af8497d3eaf7 100644 --- a/nsprpub/pr/include/md/_win95.h +++ b/nsprpub/pr/include/md/_win95.h @@ -487,6 +487,11 @@ extern PRStatus _PR_KillWindowsProcess(struct PRProcess *process); /* --- Time --- */ extern void _PR_FileTimeToPRTime(const FILETIME *filetime, PRTime *prtm); +#ifdef WINCE +extern void _MD_InitTime(void); +extern void _MD_CleanupTime(void); +#endif + /* --- Native-Thread Specific Definitions ------------------------------- */ extern struct PRThread * _MD_CURRENT_THREAD(void); diff --git a/nsprpub/pr/include/prlink.h b/nsprpub/pr/include/prlink.h index d15a271df245..8cbcc4d916a2 100644 --- a/nsprpub/pr/include/prlink.h +++ b/nsprpub/pr/include/prlink.h @@ -165,6 +165,8 @@ typedef struct PRLibSpec { #define PR_LD_NOW 0x2 /* equivalent to RTLD_NOW on Unix */ #define PR_LD_GLOBAL 0x4 /* equivalent to RTLD_GLOBAL on Unix */ #define PR_LD_LOCAL 0x8 /* equivalent to RTLD_LOCAL on Unix */ +/* The following is equivalent to LOAD_WITH_ALTERED_SEARCH_PATH on Windows */ +#define PR_LD_ALT_SEARCH_PATH 0x10 /* 0x8000 reserved for NSPR internal use */ /* diff --git a/nsprpub/pr/src/Makefile.in b/nsprpub/pr/src/Makefile.in index e3e68c848255..a3bf4c3a72f3 100644 --- a/nsprpub/pr/src/Makefile.in +++ b/nsprpub/pr/src/Makefile.in @@ -398,14 +398,8 @@ else $(INSTALL) -m 444 $(SHARED_LIBRARY) $(dist_bindir) endif endif -ifeq ($(MOZ_BITS),16) - $(INSTALL) -m 444 $(TARGETS) $(MOZ_DIST)/lib - $(INSTALL) -m 444 $(TARGETS) $(MOZ_DIST)/bin -endif ifeq ($(BUILD_AIX_RTL_LIBC),1) $(AIX_RTL_LIBC): /usr/ccs/lib/libc.a rtl_enable -o $@ $< endif - - diff --git a/nsprpub/pr/src/linking/prlink.c b/nsprpub/pr/src/linking/prlink.c index 0f976e0e8c52..ce4c0c4407ea 100644 --- a/nsprpub/pr/src/linking/prlink.c +++ b/nsprpub/pr/src/linking/prlink.c @@ -188,18 +188,12 @@ void _PR_InitLinker(void) #if defined(XP_PC) lm = PR_NEWZAP(PRLibrary); lm->name = strdup("Executable"); - /* - ** In WIN32, GetProcAddress(...) expects a module handle in order to - ** get exported symbols from the executable... - ** - ** However, in WIN16 this is accomplished by passing NULL to - ** GetProcAddress(...) - */ -#if defined(_WIN32) - lm->dlh = GetModuleHandle(NULL); +#if defined(XP_OS2) + lm->dlh = NULLHANDLE; #else - lm->dlh = (HINSTANCE)NULL; -#endif /* ! _WIN32 */ + /* A module handle for the executable. */ + lm->dlh = GetModuleHandle(NULL); +#endif /* ! XP_OS2 */ lm->refCount = 1; lm->staticTable = NULL; @@ -758,7 +752,9 @@ pr_LoadLibraryByPathname(const char *name, PRIntn flags) { HINSTANCE h; - h = LoadLibraryW(wname); + h = LoadLibraryExW(wname, NULL, + (flags & PR_LD_ALT_SEARCH_PATH) ? + LOAD_WITH_ALTERED_SEARCH_PATH : 0); if (h == NULL) { oserr = _MD_ERRNO(); PR_DELETE(lm); diff --git a/nsprpub/pr/src/md/os2/os2misc.c b/nsprpub/pr/src/md/os2/os2misc.c index 3021b23dafe3..05e0f2f0a1bb 100644 --- a/nsprpub/pr/src/md/os2/os2misc.c +++ b/nsprpub/pr/src/md/os2/os2misc.c @@ -21,6 +21,7 @@ * * Contributor(s): * Davide Bresolin + * Rich Walsh * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or @@ -544,45 +545,109 @@ _PR_MD_WAKEUP_CPUS( void ) return; } - /* ********************************************************************** * - * Memory-mapped files are not supported on OS/2 (or Win16). + * Memory-mapped files + * + * A credible emulation of memory-mapped i/o on OS/2 would require + * an exception-handler on each thread that might access the mapped + * memory. In the Mozilla environment, that would be impractical. + * Instead, the following simulates those modes which don't modify + * the mapped file. It reads the entire mapped file segment at once + * when MemMap is called, and frees it on MemUnmap. CreateFileMap + * only does sanity-checks, while CloseFileMap does almost nothing. * ********************************************************************** */ PRStatus _MD_CreateFileMap(PRFileMap *fmap, PRInt64 size) { - PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0); - return PR_FAILURE; + PRFileInfo64 info; + + /* assert on PR_PROT_READWRITE which modifies the underlying file */ + PR_ASSERT(fmap->prot == PR_PROT_READONLY || + fmap->prot == PR_PROT_WRITECOPY); + if (fmap->prot != PR_PROT_READONLY && + fmap->prot != PR_PROT_WRITECOPY) { + PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0); + return PR_FAILURE; + } + if (PR_GetOpenFileInfo64(fmap->fd, &info) == PR_FAILURE) { + return PR_FAILURE; + } + /* reject zero-byte mappings & zero-byte files */ + if (!size || !info.size) { + PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); + return PR_FAILURE; + } + /* file size rounded up to the next page boundary */ + fmap->md.maxExtent = (info.size + 0xfff) & ~(0xfff); + + return PR_SUCCESS; } PRInt32 _MD_GetMemMapAlignment(void) { - PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0); - return -1; + /* OS/2 pages are 4k */ + return 0x1000; } -void * _MD_MemMap( - PRFileMap *fmap, - PROffset64 offset, - PRUint32 len) +void * _MD_MemMap(PRFileMap *fmap, PROffset64 offset, PRUint32 len) { - PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0); - return NULL; + PRUint32 rv; + void *addr; + + /* prevent mappings beyond EOF + remainder of page */ + if (offset + len > fmap->md.maxExtent) { + PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); + return NULL; + } + if (PR_Seek64(fmap->fd, offset, PR_SEEK_SET) == -1) { + return NULL; + } + /* try for high memory, fall back to low memory if hi-mem fails */ + rv = DosAllocMem(&addr, len, OBJ_ANY | PAG_COMMIT | PAG_READ | PAG_WRITE); + if (rv) { + rv = DosAllocMem(&addr, len, PAG_COMMIT | PAG_READ | PAG_WRITE); + if (rv) { + PR_SetError(PR_OUT_OF_MEMORY_ERROR, rv); + return NULL; + } + } + if (PR_Read(fmap->fd, addr, len) == -1) { + DosFreeMem(addr); + return NULL; + } + /* don't permit writes if readonly */ + if (fmap->prot == PR_PROT_READONLY) { + rv = DosSetMem(addr, len, PAG_READ); + if (rv) { + DosFreeMem(addr); + PR_SetError(PR_UNKNOWN_ERROR, rv); + return NULL; + } + } + return addr; } PRStatus _MD_MemUnmap(void *addr, PRUint32 len) { - PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0); - return PR_FAILURE; + PRUint32 rv; + + /* we just have to trust that addr & len are those used by MemMap */ + rv = DosFreeMem(addr); + if (rv) { + PR_SetError(PR_INVALID_ARGUMENT_ERROR, rv); + return PR_FAILURE; + } + return PR_SUCCESS; } PRStatus _MD_CloseFileMap(PRFileMap *fmap) { - PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0); - return PR_FAILURE; + /* nothing to do except free the PRFileMap struct */ + PR_Free(fmap); + return PR_SUCCESS; } diff --git a/nsprpub/pr/src/md/windows/ntmisc.c b/nsprpub/pr/src/md/windows/ntmisc.c index ce3c587bd497..c47b5995e7d5 100644 --- a/nsprpub/pr/src/md/windows/ntmisc.c +++ b/nsprpub/pr/src/md/windows/ntmisc.c @@ -1,4 +1,4 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * @@ -76,13 +76,15 @@ PRIntn _PR_MD_PUT_ENV(const char *name) */ #ifdef __GNUC__ const PRTime _pr_filetime_offset = 116444736000000000LL; +const PRTime _pr_filetime_divisor = 10LL; #else const PRTime _pr_filetime_offset = 116444736000000000i64; +const PRTime _pr_filetime_divisor = 10i64; #endif #ifdef WINCE -#define FILETIME2INT64(ft) \ +#define FILETIME_TO_INT64(ft) \ (((PRInt64)ft.dwHighDateTime) << 32 | (PRInt64)ft.dwLowDateTime) static void @@ -108,6 +110,9 @@ typedef struct CalibrationData { static CalibrationData calibration; +typedef void (*GetSystemTimeAsFileTimeFcn)(LPFILETIME); +static GetSystemTimeAsFileTimeFcn ce6_GetSystemTimeAsFileTime = NULL; + static void NowCalibrate(void) { @@ -136,11 +141,11 @@ NowCalibrate(void) timeEndPeriod(1); calibration.granularity = - (FILETIME2INT64(ft) - FILETIME2INT64(ftStart))/10; + (FILETIME_TO_INT64(ft) - FILETIME_TO_INT64(ftStart))/10; QueryPerformanceCounter(&now); - calibration.offset = (long double) FILETIME2INT64(ft); + calibration.offset = (long double) FILETIME_TO_INT64(ft); calibration.timer_offset = (long double) now.QuadPart; /* * The windows epoch is around 1600. The unix epoch is around 1970. @@ -159,27 +164,34 @@ NowCalibrate(void) #define DATALOCK_SPINCOUNT 4096 #define LASTLOCK_SPINCOUNT 4096 -static PRStatus +void _MD_InitTime(void) { - memset(&calibration, 0, sizeof(calibration)); - NowCalibrate(); - InitializeCriticalSection(&calibration.calibration_lock); - InitializeCriticalSection(&calibration.data_lock); - return PR_SUCCESS; + /* try for CE6 GetSystemTimeAsFileTime first */ + HANDLE h = GetModuleHandleW(L"coredll.dll"); + ce6_GetSystemTimeAsFileTime = (GetSystemTimeAsFileTimeFcn) + GetProcAddressA(h, "GetSystemTimeAsFileTime"); + + /* otherwise go the slow route */ + if (ce6_GetSystemTimeAsFileTime == NULL) { + memset(&calibration, 0, sizeof(calibration)); + NowCalibrate(); + InitializeCriticalSection(&calibration.calibration_lock); + InitializeCriticalSection(&calibration.data_lock); + } } void _MD_CleanupTime(void) { - DeleteCriticalSection(&calibration.calibration_lock); - DeleteCriticalSection(&calibration.data_lock); + if (ce6_GetSystemTimeAsFileTime == NULL) { + DeleteCriticalSection(&calibration.calibration_lock); + DeleteCriticalSection(&calibration.data_lock); + } } #define MUTEX_SETSPINCOUNT(m, c) -static PRCallOnceType calibrationOnce; - /* *----------------------------------------------------------------------- * @@ -205,8 +217,23 @@ PR_Now(void) PRInt64 returnedTime; long double cachedOffset = 0.0; - /* For non threadsafe platforms, _MD_InitTime is not necessary */ - PR_CallOnce(&calibrationOnce, _MD_InitTime); + if (ce6_GetSystemTimeAsFileTime) { + union { + FILETIME ft; + PRTime prt; + } currentTime; + + PR_ASSERT(sizeof(FILETIME) == sizeof(PRTime)); + + ce6_GetSystemTimeAsFileTime(¤tTime.ft); + + /* written this way on purpose, since the second term becomes + * a constant, and the entire expression is faster to execute. + */ + return currentTime.prt/_pr_filetime_divisor - + _pr_filetime_offset/_pr_filetime_divisor; + } + do { if (!calibration.calibrated || needsCalibration) { EnterCriticalSection(&calibration.calibration_lock); @@ -233,8 +260,8 @@ PR_Now(void) /* Calculate a low resolution time */ LowResTime(&ft); - lowresTime = ((long double)(FILETIME2INT64(ft) - _pr_filetime_offset)) - * 0.1; + lowresTime = + ((long double)(FILETIME_TO_INT64(ft) - _pr_filetime_offset)) * 0.1; if (calibration.freq > 0.0) { long double highresTime, diff; diff --git a/nsprpub/pr/src/misc/prtime.c b/nsprpub/pr/src/misc/prtime.c index 287ab88f822d..dee268cba94c 100644 --- a/nsprpub/pr/src/misc/prtime.c +++ b/nsprpub/pr/src/misc/prtime.c @@ -586,6 +586,9 @@ void _PR_InitTime(void) #ifdef HAVE_LOCALTIME_MONITOR monitor = PR_NewLock(); #endif +#ifdef WINCE + _MD_InitTime(); +#endif } void _PR_CleanupTime(void) diff --git a/nsprpub/pr/tests/Makefile.in b/nsprpub/pr/tests/Makefile.in index 86c961321bb4..b27e9e5fccc8 100644 --- a/nsprpub/pr/tests/Makefile.in +++ b/nsprpub/pr/tests/Makefile.in @@ -456,6 +456,10 @@ EXTRA_LIBS = -ldl endif endif +ifeq ($(OS_ARCH),RISCOS) +EXTRA_LIBS = -ldl +endif + ifeq ($(USE_PTHREADS),1) LIBPTHREAD = -lpthread ifeq ($(OS_ARCH),AIX)