From 26623b9f34ba5056fad863f8a17f7e1ae7c509da Mon Sep 17 00:00:00 2001 From: Przemyslaw Czerpak Date: Mon, 15 Sep 2008 02:34:44 +0000 Subject: [PATCH] 2008-09-15 04:33 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/bin/pack_src.sh * added file list to archive so it's possible to recreate it later without SVN data * harbour/common.mak * harbour/make_b32.mak * harbour/make_gcc.mak + added HBVMMT library for default builds BCC version not tested - please test. * harbour/source/vm/hvm.c * moved language and code page setting before class and error initialization * harbour/source/rtl/fserror.c * harbour/source/rtl/fstemp.c * harbour/source/rtl/fssize.c * harbour/source/rtl/hbffind.c * harbour/source/rtl/filesys.c ! fixed overloading FS error codes by other operations, f.e. accessing TLS data by OS API function call --- harbour/ChangeLog | 21 +++++++ harbour/bin/pack_src.sh | 17 +++-- harbour/common.mak | 5 ++ harbour/make_b32.mak | 29 ++++++++- harbour/make_gcc.mak | 36 ++++++++++- harbour/source/rtl/filesys.c | 119 +++++++++++++++++------------------ harbour/source/rtl/fserror.c | 22 ++++--- harbour/source/rtl/fssize.c | 4 +- harbour/source/rtl/fstemp.c | 4 +- harbour/source/rtl/hbffind.c | 8 +-- harbour/source/vm/hvm.c | 11 ++-- 11 files changed, 183 insertions(+), 93 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index a02b32c5b5..d7ee2c84c7 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,27 @@ 2008-12-31 13:59 UTC+0100 Foo Bar (foo.bar foobar.org) */ +2008-09-15 04:33 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/bin/pack_src.sh + * added file list to archive so it's possible to recreate it later without SVN data + + * harbour/common.mak + * harbour/make_b32.mak + * harbour/make_gcc.mak + + added HBVMMT library for default builds + BCC version not tested - please test. + + * harbour/source/vm/hvm.c + * moved language and code page setting before class and error initialization + + * harbour/source/rtl/fserror.c + * harbour/source/rtl/fstemp.c + * harbour/source/rtl/fssize.c + * harbour/source/rtl/hbffind.c + * harbour/source/rtl/filesys.c + ! fixed overloading FS error codes by other operations, f.e. accessing + TLS data by OS API function call + 2008-09-15 01:00 UTC+0200 Viktor Szakats (harbour.01 syenar hu) * source/common/hbverdsp.c * Undone prev change. diff --git a/harbour/bin/pack_src.sh b/harbour/bin/pack_src.sh index cfed898183..bf4a014651 100755 --- a/harbour/bin/pack_src.sh +++ b/harbour/bin/pack_src.sh @@ -67,16 +67,21 @@ hb_collect_all_svn() done } +hb_rmflst="no" hb_flst="bin/hb_flst.tmp" -#format=`cat $hb_rootdir/.svn/format` -if [ "$format" = 4 ] || [ "$format" = 8 ]; then - (cd "$hb_rootdir";hb_collect_all) > "$hb_rootdir/$hb_flst" -else - (cd "$hb_rootdir";hb_collect_all_svn) > "$hb_rootdir/$hb_flst" +if [ -d "$hb_rootdir/.svn" ] || [ ! -r "$hb_rootdir/$hb_flst" ]; then + hb_rmflst="yes" + #format=`cat $hb_rootdir/.svn/format` + if [ "$format" = 4 ] || [ "$format" = 8 ]; then + (cd "$hb_rootdir";hb_collect_all) > "$hb_rootdir/$hb_flst" + else + (cd "$hb_rootdir";hb_collect_all_svn) > "$hb_rootdir/$hb_flst" + fi + echo "$hb_flst" >> "$hb_rootdir/$hb_flst" fi if [ "$hb_archbin" = "zip" ]; then (cd "$hb_rootdir";$hb_archbin -r -q $hb_filename . "-i@$hb_flst") else (cd "$hb_rootdir";$hb_archbin $hb_archopt $hb_filename --files-from "$hb_flst") fi -rm -fR "$hb_rootdir/$hb_flst" +[ "$hb_rmflst" != "yes" ] || rm -fR "$hb_rootdir/$hb_flst" diff --git a/harbour/common.mak b/harbour/common.mak index 9b78a15f4f..5a96d7feb8 100644 --- a/harbour/common.mak +++ b/harbour/common.mak @@ -94,6 +94,8 @@ BIN_DIR = bin\$(HB_CC_NAME) OBJ_DIR = obj\$(HB_CC_NAME) LIB_DIR = lib\$(HB_CC_NAME) +MT_OBJ_DIR = obj\$(HB_CC_NAME)_mt + DLL_ROOTDIR = obj\dll DLL_OBJ_DIR = $(DLL_ROOTDIR)\$(HB_CC_NAME) @@ -103,6 +105,8 @@ HB_DEST_DIRS = \ $(OBJ_DIR) \ $(LIB_DIR) \ \ + $(MT_OBJ_DIR) \ + \ $(DLL_ROOTDIR) \ $(DLL_OBJ_DIR) @@ -211,6 +215,7 @@ COMMON_LIB = $(LIB_DIR)\$(LIBPREF)hbcommon$(LIBEXT) COMPILER_LIB = $(LIB_DIR)\$(LIBPREF)hbcplr$(LIBEXT) PP_LIB = $(LIB_DIR)\$(LIBPREF)hbpp$(LIBEXT) VM_LIB = $(LIB_DIR)\$(LIBPREF)hbvm$(LIBEXT) +VMMT_LIB = $(LIB_DIR)\$(LIBPREF)hbvmmt$(LIBEXT) RTL_LIB = $(LIB_DIR)\$(LIBPREF)hbrtl$(LIBEXT) MACRO_LIB = $(LIB_DIR)\$(LIBPREF)hbmacro$(LIBEXT) DEBUG_LIB = $(LIB_DIR)\$(LIBPREF)hbdebug$(LIBEXT) diff --git a/harbour/make_b32.mak b/harbour/make_b32.mak index 1bfa6e2c4f..2feae4fd2e 100644 --- a/harbour/make_b32.mak +++ b/harbour/make_b32.mak @@ -93,6 +93,8 @@ MKLIB = tlib.exe DLL_OBJS = $(TMP_DLL_OBJS:$(OBJ_DIR)=$(DLL_OBJ_DIR)) +VMMT_LIB_OBJS = $(VM_LIB_OBJS:$(OBJ_DIR)=$(MT_OBJ_DIR)) + #********************************************************** # C compiler, Harbour compiler and Linker flags. #********************************************************** @@ -104,6 +106,7 @@ INCLUDE_DIR = include # C Compiler Flags CFLAGS = -I$(INCLUDE_DIR) -I$(OBJ_DIR) $(C_USR) +CFLAGSMT = -tWM -DHB_MT_VM $(CFLAGSMT) #----------- !ifndef BCC_NOOPTIM @@ -120,7 +123,9 @@ CFLAGS = -I$(INCLUDE_DIR) -I$(OBJ_DIR) $(C_USR) !endif #----------- !if "$(HB_BUILD_ST)" != "yes" - CFLAGS = -tWM $(CFLAGS) -DHB_MT_VM + CFLAGS = $(CFLAGS) $(CFLAGSMT) +!else + HB_BUILD_TARGETS = $(HB_BUILD_TARGETS) $(VMMT_LIB) !endif #----------- !if "$(HB_GT_DEFAULT)" != "" @@ -185,6 +190,17 @@ ARFLAGS = /P32 $(A_USR) $(CC) $(CLIBFLAGS) -o$@ $(OBJ_DIR)\$&.c #********************************************************** +#********************************************************** +# General *.c --> *.obj COMPILE rule for STATIC MT Libraries +{$(ALL_SRC_DIRS)}.c{$(MT_OBJ_DIR)}$(OBJEXT): + $(CC) $(CLIBFLAGS) $(CFLAGSMT) -o$@ $< +#********************************************************** +# General *.prg --> *.obj COMPILE rule for STATIC MT Libraries +{$(ALL_SRC_DIRS)}.prg{$(MT_OBJ_DIR)}$(OBJEXT): + $(HB) $(HARBOURFLAGS) -o$(MT_OBJ_DIR)\ $** + $(CC) $(CLIBFLAGS) $(CFLAGSMT) -o$@ $(MT_OBJ_DIR)\$&.c +#********************************************************** + #********************************************************** # General *.c --> *.obj COMPILE rule for SHARED Libraries {$(ALL_LIB_SRC_DIRS)}.c{$(DLL_OBJ_DIR)}$(OBJEXT): @@ -276,6 +292,14 @@ $(VM_LIB) :: $(VM_LIB_OBJS) +) ! #********************************************************** +$(VMMT_LIB) :: BasicExes +$(VMMT_LIB) :: $(VMMT_LIB_OBJS) + IF EXIST "$(VMMT_LIB)" $(DEL) "$(VMMT_LIB)" > NUL + $(MKLIB) "$(VMMT_LIB)" $(ARFLAGS) @&&! ++$(**: = &^ ++) +! +#********************************************************** $(RTL_LIB) :: BasicExes $(RTL_LIB) :: $(RTL_LIB_OBJS) IF EXIST "$(RTL_LIB)" $(DEL) "$(RTL_LIB)" > NUL @@ -638,6 +662,9 @@ doClean: -if exist $(OBJ_DIR)\*.obj $(DEL) $(OBJ_DIR)\*.obj > nul -if exist $(OBJ_DIR)\*.c $(DEL) $(OBJ_DIR)\*.c > nul -if exist $(OBJ_DIR)\*.h $(DEL) $(OBJ_DIR)\*.h > nul + -if exist $(MT_OBJ_DIR)\*.obj $(DEL) $(MT_OBJ_DIR)\*.obj > nul + -if exist $(MT_OBJ_DIR)\*.c $(DEL) $(MT_OBJ_DIR)\*.c > nul + -if exist $(MT_OBJ_DIR)\*.h $(DEL) $(MT_OBJ_DIR)\*.h > nul -if exist $(INCLUDE_DIR)\hbverbld.h $(DEL) $(INCLUDE_DIR)\hbverbld.h > nul -if exist $(DLL_OBJ_DIR)\*.obj $(DEL) $(DLL_OBJ_DIR)\*.obj > nul -if exist $(DLL_OBJ_DIR)\*.c $(DEL) $(DLL_OBJ_DIR)\*.c > nul diff --git a/harbour/make_gcc.mak b/harbour/make_gcc.mak index 7b64bd8137..026f54086a 100644 --- a/harbour/make_gcc.mak +++ b/harbour/make_gcc.mak @@ -40,6 +40,7 @@ # (if you don't have slang installed) # # HB_COMMERCE - If set to yes disables pure GNU modules (slang,GPM,...) +# HB_BUILD_ST - If set to yes builds harbour in SingleThread mode # HB_BUILD_DLL - If set to yes enables building harbour VM+RTL # dll in addition to normal static build (currently not working) # HB_BUILD_DEBUG - If set to yes causes to compile with debug info @@ -56,6 +57,12 @@ .SUFFIXES: +# GCC has ST mode as default +ifeq ($(HB_BUILD_ST),) + HB_BUILD_ST=yes +endif + + #********************************************************** ifndef ECHO @@ -130,13 +137,15 @@ endif #********************************************************** # Default sources directory search paths -VPATH := $(ALL_SRC_DIRS) $(LIB_DIR) $(BIN_DIR) $(OBJ_DIR) $(DLL_OBJ_DIR) +VPATH := $(ALL_SRC_DIRS) $(LIB_DIR) $(BIN_DIR) $(OBJ_DIR) $(MT_OBJ_DIR) $(DLL_OBJ_DIR) #********************************************************** # Some definitions cannot be kept in common.mak # due to serious limitations of Microsoft Nmake +VMMT_LIB_OBJS = $(subst $(OBJ_DIR),$(MT_OBJ_DIR),$(VM_LIB_OBJS)) + # Do not perform an extra compilation phase for shared libraries # if gcc -fPIC compilation flag is already passed to a makefile ifeq ($(findstring -fPIC,$(C_USR) $(CFLAGS)),-fPIC) @@ -160,6 +169,7 @@ endif INCLUDE_DIR := include CFLAGS := -W -Wall -I$(INCLUDE_DIR) $(C_USR) $(CFLAGS) -I$(OBJ_DIR) +CFLAGSMT := -DHB_MT_VM $(CFLAGSMT) #----------- ifndef GCC_NOOPTIM CFLAGS := -O3 $(CFLAGS) @@ -181,6 +191,15 @@ CLIBFLAGS := -c $(CFLAGS) CLIBFLAGSDLL := -DHB_DYNLIB $(CLIBFLAGS) $(CLIBFLAGSDLL) CEXEFLAGSDLL := $(CFLAGS) $(CEXEFLAGSDLL) +ifeq ($(findstring $(HB_ARCHITECTURE),dos),) +ifneq ($(HB_BUILD_ST),yes) + CLIBFLAGS += $(CFLAGSMT) + CLIBFLAGSDLL += $(CFLAGSMT) +else + HB_BUILD_TARGETS += $(VMMT_LIB) +endif +endif + # Under architectures other than "DOS based" add -fPIC # to gcc compiler flags for compiling shared libraries ifeq ($(findstring $(HB_ARCHITECTURE),w32 os2),) @@ -248,9 +267,18 @@ $(OBJ_DIR)/%$(OBJEXT) : %.prg $(HB) $(HARBOURFLAGS) -o$(OBJ_DIR)/ $< $(CC) $(CLIBFLAGS) -o$@ $(OBJ_DIR)/$( *.o COMPILE rule for STATIC MT Libraries +$(MT_OBJ_DIR)/%$(OBJEXT) : %.prg + $(HB) $(HARBOURFLAGS) -o$(MT_OBJ_DIR)/ $< + $(CC) $(CLIBFLAGS) $(CFLAGSMT) -o$@ $(MT_OBJ_DIR)/$( *.o COMPILE rule for STATIC Libraries $(OBJ_DIR)/%$(OBJEXT) : %.c $(CC) $(CLIBFLAGS) -o$@ $< +#---------------------------------------------------------- +# General *.c --> *.o COMPILE rule for STATIC MT Libraries +$(MT_OBJ_DIR)/%$(OBJEXT) : %.c + $(CC) $(CLIBFLAGS) $(CFLAGSMT) -o$@ $< #******************************************************* # General *.prg --> *.o COMPILE rule for SHARED Libraries $(DLL_OBJ_DIR)/%$(OBJEXT) : %.prg @@ -306,6 +334,9 @@ $(COMPILER_LIB) : $(COMPILER_LIB_OBJS) $(VM_LIB) : $(VM_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** +$(VMMT_LIB) : $(VMMT_LIB_OBJS) + $(MKLIB) $(ARFLAGS) $@ $^ +#********************************************************** ifneq ($(findstring $(HB_ARCHITECTURE),w32 os2),) $(MAIN_LIB) : $(MAIN_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ @@ -546,6 +577,9 @@ doClean: -$(DEL) $(OBJ_DIR)/*$(OBJEXT) -$(DEL) $(OBJ_DIR)/*.c -$(DEL) $(OBJ_DIR)/*.h + -$(DEL) $(MT_OBJ_DIR)/*$(OBJEXT) + -$(DEL) $(MT_OBJ_DIR)/*.c + -$(DEL) $(MT_OBJ_DIR)/*.h -$(DEL) $(INCLUDE_DIR)/hbverbld.h -$(DEL) $(DLL_OBJ_DIR)/*$(OBJEXT) -$(DEL) $(DLL_OBJ_DIR)/*.c diff --git a/harbour/source/rtl/filesys.c b/harbour/source/rtl/filesys.c index 377c586c02..3756aa7d5b 100644 --- a/harbour/source/rtl/filesys.c +++ b/harbour/source/rtl/filesys.c @@ -622,9 +622,8 @@ HB_EXPORT HB_FHANDLE hb_fsPOpen( BYTE * pFilename, BYTE * pMode ) close( hPipeHandle[1] ); } } - hb_vmLock(); - hb_fsSetIOError( hFileHandle != FS_ERROR, 0 ); + hb_vmLock(); if( pbyTmp ) hb_xfree( pbyTmp ); @@ -660,8 +659,8 @@ HB_EXPORT HB_FHANDLE hb_fsOpen( BYTE * pFilename, USHORT uiFlags ) hb_vmUnlock(); hFile = ( HANDLE ) CreateFileA( ( char * ) pFilename, dwMode, dwShare, NULL, dwCreat, dwAttr, NULL ); - hb_vmLock(); hb_fsSetIOError( hFile != ( HANDLE ) INVALID_HANDLE_VALUE, 0 ); + hb_vmLock(); hFileHandle = ( HB_FHANDLE ) hFile; } @@ -685,8 +684,8 @@ HB_EXPORT HB_FHANDLE hb_fsOpen( BYTE * pFilename, USHORT uiFlags ) #else hFileHandle = open( ( char * ) pFilename, flags | share, mode ); #endif - hb_vmLock(); hb_fsSetIOError( hFileHandle != FS_ERROR, 0 ); + hb_vmLock(); } #else @@ -720,9 +719,8 @@ HB_EXPORT HB_FHANDLE hb_fsCreate( BYTE * pFilename, ULONG ulAttr ) hb_vmUnlock(); hFile = ( HANDLE ) CreateFileA( ( char * ) pFilename, dwMode, dwShare, NULL, dwCreat, dwAttr, NULL ); - hb_vmLock(); - hb_fsSetIOError( hFile != ( HANDLE ) INVALID_HANDLE_VALUE, 0 ); + hb_vmLock(); hFileHandle = ( HB_FHANDLE ) hFile; } @@ -740,8 +738,8 @@ HB_EXPORT HB_FHANDLE hb_fsCreate( BYTE * pFilename, ULONG ulAttr ) #else hFileHandle = open( ( char * ) pFilename, flags | share, mode ); #endif - hb_vmLock(); hb_fsSetIOError( hFileHandle != FS_ERROR, 0 ); + hb_vmLock(); } #else @@ -781,9 +779,8 @@ HB_EXPORT HB_FHANDLE hb_fsCreateEx( BYTE * pFilename, ULONG ulAttr, USHORT uiFla hb_vmUnlock(); hFile = ( HANDLE ) CreateFileA( ( char * ) pFilename, dwMode, dwShare, NULL, dwCreat, dwAttr, NULL ); - hb_vmLock(); - hb_fsSetIOError( hFile != ( HANDLE ) INVALID_HANDLE_VALUE, 0 ); + hb_vmLock(); hFileHandle = ( HB_FHANDLE ) hFile; } @@ -799,8 +796,8 @@ HB_EXPORT HB_FHANDLE hb_fsCreateEx( BYTE * pFilename, ULONG ulAttr, USHORT uiFla #else hFileHandle = open( ( char * ) pFilename, flags | share, mode ); #endif - hb_vmLock(); hb_fsSetIOError( hFileHandle != FS_ERROR, 0 ); + hb_vmLock(); } #else @@ -940,8 +937,8 @@ HB_EXPORT BOOL hb_fsGetFileTime( BYTE * pszFileName, LONG * plJulian, LONG * plM fResult = TRUE; } - hb_vmLock(); hb_fsSetIOError( fResult, 0 ); + hb_vmLock(); hb_fsClose( hFile ); } } @@ -966,9 +963,8 @@ HB_EXPORT BOOL hb_fsGetFileTime( BYTE * pszFileName, LONG * plJulian, LONG * plM fResult = TRUE; } - hb_vmLock(); - hb_fsSetIOError( fResult, 0 ); + hb_vmLock(); if( fFree ) hb_xfree( pszFileName ); @@ -1008,28 +1004,26 @@ HB_EXPORT BOOL hb_fsGetAttr( BYTE * pszFileName, ULONG * pulAttr ) *pulAttr = hb_fsAttrFromRaw( dwAttr ); fResult = TRUE; } - hb_vmLock(); hb_fsSetIOError( fResult, 0 ); + hb_vmLock(); } #elif defined( HB_OS_DOS ) + hb_vmUnlock(); { #if defined( __DJGPP__ ) || defined(__BORLANDC__) - int attr; - hb_vmUnlock(); - attr = _chmod( ( char * ) pszFileName, 0, 0 ); - hb_vmLock(); + int attr = _chmod( ( char * ) pszFileName, 0, 0 ); if( attr != -1 ) #else unsigned int attr = 0; - hb_vmUnlock(); if( _dos_getfileattr( ( char * ) pszFileName, &attr ) == 0 ) #endif { *pulAttr = hb_fsAttrFromRaw( attr ); fResult = TRUE; } - hb_vmLock(); + hb_fsSetIOError( fResult, 0 ); } + hb_vmLock(); #elif defined( HB_OS_OS2 ) { FILESTATUS3 fs3; @@ -1037,13 +1031,13 @@ HB_EXPORT BOOL hb_fsGetAttr( BYTE * pszFileName, ULONG * pulAttr ) hb_vmUnlock(); ulrc = DosQueryPathInfo( ( PSZ ) pszFileName, FIL_STANDARD, &fs3, sizeof( fs3 ) ); - hb_vmLock(); if( ulrc == NO_ERROR ) { *pulAttr = hb_fsAttrFromRaw( fs3.attrFile ); fResult = TRUE; } hb_fsSetIOError( fResult, 0 ); + hb_vmLock(); } #elif defined( HB_OS_UNIX ) { @@ -1055,8 +1049,8 @@ HB_EXPORT BOOL hb_fsGetAttr( BYTE * pszFileName, ULONG * pulAttr ) *pulAttr = hb_fsAttrFromRaw( sStat.st_mode ); fResult = TRUE; } - hb_vmLock(); hb_fsSetIOError( fResult, 0 ); + hb_vmLock(); } #else { @@ -1116,8 +1110,8 @@ HB_EXPORT BOOL hb_fsSetFileTime( BYTE * pszFileName, LONG lJulian, LONG lMillise SystemTimeToFileTime( &st, &local_ft ); LocalFileTimeToFileTime( &local_ft, &ft ); fResult = SetFileTime( DosToWinHandle( hFile ), NULL, &ft, &ft ) != 0; - hb_vmLock(); hb_fsSetIOError( fResult, 0 ); + hb_vmLock(); hb_fsClose( hFile ); } } @@ -1167,9 +1161,9 @@ HB_EXPORT BOOL hb_fsSetFileTime( BYTE * pszFileName, LONG lJulian, LONG lMillise ulrc = DosSetPathInfo( ( PSZ ) pszFileName, FIL_STANDARD, &fs3, sizeof( fs3 ), DSPI_WRTTHRU ); } - hb_vmLock(); fResult = ulrc == NO_ERROR; hb_fsSetIOError( fResult, 0 ); + hb_vmLock(); if( fFree ) hb_xfree( pszFileName ); } @@ -1179,11 +1173,10 @@ HB_EXPORT BOOL hb_fsSetFileTime( BYTE * pszFileName, LONG lJulian, LONG lMillise pszFileName = hb_fsNameConv( pszFileName, &fFree ); + hb_vmUnlock(); if( lJulian <= 0 && lMillisec ) { - hb_vmUnlock(); fResult = utime( ( char * ) pszFileName, NULL ) == 0; - hb_vmLock(); } else { @@ -1191,7 +1184,6 @@ HB_EXPORT BOOL hb_fsSetFileTime( BYTE * pszFileName, LONG lJulian, LONG lMillise struct tm new_value; time_t tim; - hb_vmUnlock(); if( lJulian <= 0 || lMillisec < 0 ) { time_t current_time; @@ -1226,9 +1218,9 @@ HB_EXPORT BOOL hb_fsSetFileTime( BYTE * pszFileName, LONG lJulian, LONG lMillise # endif buf.actime = buf.modtime = mktime( &new_value ); fResult = utime( ( char * ) pszFileName, &buf ) == 0; - hb_vmLock(); } hb_fsSetIOError( fResult, 0 ); + hb_vmLock(); if( fFree ) hb_xfree( pszFileName ); } @@ -1267,8 +1259,8 @@ HB_EXPORT BOOL hb_fsSetAttr( BYTE * pszFileName, ULONG ulAttr ) dwFlags |= FILE_ATTRIBUTE_NORMAL; hb_vmUnlock(); fResult = SetFileAttributesA( ( char * ) pszFileName, dwFlags ); - hb_vmLock(); hb_fsSetIOError( fResult, 0 ); + hb_vmLock(); } #elif defined( HB_OS_OS2 ) { @@ -1293,9 +1285,9 @@ HB_EXPORT BOOL hb_fsSetAttr( BYTE * pszFileName, ULONG ulAttr ) ulrc = DosSetPathInfo( ( PSZ ) pszFileName, FIL_STANDARD, &fs3, sizeof( fs3 ), DSPI_WRTTHRU ); } - hb_vmLock(); fResult = ulrc == NO_ERROR; hb_fsSetIOError( fResult, 0 ); + hb_vmLock(); } #elif defined( HB_OS_DOS ) @@ -1306,8 +1298,8 @@ HB_EXPORT BOOL hb_fsSetAttr( BYTE * pszFileName, ULONG ulAttr ) # else fResult = _dos_setfileattr( ( char * ) pszFileName, ulAttr ) != -1; # endif - hb_vmLock(); hb_fsSetIOError( fResult, 0 ); + hb_vmLock(); #elif defined( HB_OS_UNIX_COMPATIBLE ) { @@ -1330,8 +1322,8 @@ HB_EXPORT BOOL hb_fsSetAttr( BYTE * pszFileName, ULONG ulAttr ) } hb_vmUnlock(); fResult = chmod( ( char * ) pszFileName, iAttr ) != -1; - hb_vmLock(); hb_fsSetIOError( fResult, 0 ); + hb_vmLock(); } #else { @@ -1363,16 +1355,16 @@ HB_EXPORT USHORT hb_fsRead( HB_FHANDLE hFileHandle, BYTE * pBuff, USHORT uiCount hb_vmUnlock(); fResult = ReadFile( DosToWinHandle( hFileHandle ), pBuff, ( DWORD ) uiCount, &dwRead, NULL ); - hb_vmLock(); hb_fsSetIOError( fResult, 0 ); + hb_vmLock(); uiRead = fResult ? ( USHORT ) dwRead : 0; } #else hb_vmUnlock(); uiRead = read( hFileHandle, pBuff, uiCount ); - hb_vmLock(); hb_fsSetIOError( uiRead != ( USHORT ) -1, 0 ); + hb_vmLock(); #endif if( uiRead == ( USHORT ) -1 ) @@ -1411,8 +1403,8 @@ HB_EXPORT USHORT hb_fsWrite( HB_FHANDLE hFileHandle, const BYTE * pBuff, USHORT dwWritten = 0; fResult = SetEndOfFile( DosToWinHandle( hFileHandle ) ); } - hb_vmLock(); hb_fsSetIOError( fResult, 0 ); + hb_vmLock(); uiWritten = fResult ? ( USHORT ) dwWritten : 0; } @@ -1421,8 +1413,8 @@ HB_EXPORT USHORT hb_fsWrite( HB_FHANDLE hFileHandle, const BYTE * pBuff, USHORT { hb_vmUnlock(); uiWritten = write( hFileHandle, pBuff, uiCount ); - hb_vmLock(); hb_fsSetIOError( uiWritten != ( USHORT ) -1, 0 ); + hb_vmLock(); if( uiWritten == ( USHORT ) -1 ) uiWritten = 0; } @@ -1467,8 +1459,8 @@ HB_EXPORT ULONG hb_fsReadLarge( HB_FHANDLE hFileHandle, BYTE * pBuff, ULONG ulCo { hb_vmUnlock(); ulRead = read( hFileHandle, pBuff, ulCount ); - hb_vmLock(); hb_fsSetIOError( ulRead != (ULONG) -1, 0 ); + hb_vmLock(); } #else { @@ -1511,8 +1503,8 @@ HB_EXPORT ULONG hb_fsReadLarge( HB_FHANDLE hFileHandle, BYTE * pBuff, ULONG ulCo ulRead += ( ULONG ) uiRead; pPtr += uiRead; } - hb_vmLock(); hb_fsSetIOError( ulLeftToRead == 0, 0 ); + hb_vmLock(); } #endif @@ -1554,8 +1546,8 @@ HB_EXPORT ULONG hb_fsWriteLarge( HB_FHANDLE hFileHandle, const BYTE * pBuff, ULO { hb_vmUnlock(); ulWritten = write( hFileHandle, pBuff, ulCount ); - hb_vmLock(); hb_fsSetIOError( ulWritten != ( ULONG ) -1, 0 ); + hb_vmLock(); if( ulWritten == ( ULONG ) -1 ) ulWritten = 0; } @@ -1601,8 +1593,8 @@ HB_EXPORT ULONG hb_fsWriteLarge( HB_FHANDLE hFileHandle, const BYTE * pBuff, ULO ulWritten += ( ULONG ) uiWritten; pPtr += uiWritten; } - hb_vmLock(); hb_fsSetIOError( ulLeftToWrite == 0, 0 ); + hb_vmLock(); } #endif else @@ -1698,8 +1690,8 @@ HB_EXPORT void hb_fsCommit( HB_FHANDLE hFileHandle ) close( dup_handle ); fResult = TRUE; } - hb_vmLock(); hb_fsSetIOError( fResult, 0 ); + hb_vmLock(); } #else @@ -1760,8 +1752,8 @@ HB_EXPORT BOOL hb_fsLock( HB_FHANDLE hFileHandle, ULONG ulStart, default: bResult = FALSE; } - hb_vmLock(); hb_fsSetIOError( bResult, 0 ); + hb_vmLock(); #elif defined(HB_OS_OS2) { struct _FILELOCK fl, ful; @@ -1794,8 +1786,8 @@ HB_EXPORT BOOL hb_fsLock( HB_FHANDLE hFileHandle, ULONG ulStart, default: bResult = FALSE; } - hb_vmLock(); hb_fsSetIOError( bResult, 0 ); + hb_vmLock(); } #elif defined(_MSC_VER) || defined(__DMC__) { @@ -1817,8 +1809,8 @@ HB_EXPORT BOOL hb_fsLock( HB_FHANDLE hFileHandle, ULONG ulStart, default: bResult = FALSE; } - hb_vmLock(); hb_fsSetIOError( bResult, 0 ); + hb_vmLock(); lseek( hFileHandle, ulOldPos, SEEK_SET ); } #elif defined(__MINGW32__) @@ -1841,8 +1833,8 @@ HB_EXPORT BOOL hb_fsLock( HB_FHANDLE hFileHandle, ULONG ulStart, default: bResult = FALSE; } - hb_vmLock(); hb_fsSetIOError( bResult, 0 ); + hb_vmLock(); lseek( hFileHandle, ulOldPos, SEEK_SET ); } #elif defined(HB_OS_UNIX) @@ -1881,8 +1873,8 @@ HB_EXPORT BOOL hb_fsLock( HB_FHANDLE hFileHandle, ULONG ulStart, default: bResult = FALSE; } - hb_vmLock(); hb_fsSetIOError( bResult, 0 ); + hb_vmLock(); } #elif defined(HAVE_POSIX_IO) && !defined(__IBMCPP__) && ( !defined(__GNUC__) || defined(__DJGPP__) ) @@ -1900,8 +1892,8 @@ HB_EXPORT BOOL hb_fsLock( HB_FHANDLE hFileHandle, ULONG ulStart, default: bResult = FALSE; } - hb_vmLock(); hb_fsSetIOError( bResult, 0 ); + hb_vmLock(); #else @@ -1980,8 +1972,8 @@ HB_EXPORT BOOL hb_fsLockLarge( HB_FHANDLE hFileHandle, HB_FOFFSET ulStart, default: bResult = FALSE; } - hb_vmLock(); hb_fsSetIOError( bResult, 0 ); + hb_vmLock(); } #elif defined(HB_USE_LARGEFILE64) { @@ -2017,8 +2009,8 @@ HB_EXPORT BOOL hb_fsLockLarge( HB_FHANDLE hFileHandle, HB_FOFFSET ulStart, default: bResult = FALSE; } - hb_vmLock(); hb_fsSetIOError( bResult, 0 ); + hb_vmLock(); } #else bResult = hb_fsLock( hFileHandle, (ULONG) ulStart, (ULONG) ulLength, uiMode ); @@ -2199,15 +2191,15 @@ HB_EXPORT BOOL hb_fsDelete( BYTE * pFilename ) hb_vmUnlock(); bResult = DeleteFileA( ( char * ) pFilename ); - hb_vmLock(); hb_fsSetIOError( bResult, 0 ); + hb_vmLock(); #elif defined(HB_FS_FILE_IO) hb_vmUnlock(); bResult = ( remove( ( char * ) pFilename ) == 0 ); - hb_vmLock(); hb_fsSetIOError( bResult, 0 ); + hb_vmLock(); #else @@ -2276,8 +2268,8 @@ HB_EXPORT BOOL hb_fsMkDir( BYTE * pDirname ) hb_vmUnlock(); bResult = CreateDirectoryA( ( char * ) pDirname, NULL ); - hb_vmLock(); hb_fsSetIOError( bResult, 0 ); + hb_vmLock(); #elif defined(HAVE_POSIX_IO) || defined(__MINGW32__) @@ -2289,8 +2281,8 @@ HB_EXPORT BOOL hb_fsMkDir( BYTE * pDirname ) # else bResult = ( mkdir( ( char * ) pDirname, S_IRWXU | S_IRWXG | S_IRWXO ) == 0 ); # endif - hb_vmLock(); hb_fsSetIOError( bResult, 0 ); + hb_vmLock(); #else @@ -2318,15 +2310,15 @@ HB_EXPORT BOOL hb_fsChDir( BYTE * pDirname ) hb_vmUnlock(); bResult = SetCurrentDirectoryA( ( char * ) pDirname ); - hb_vmLock(); hb_fsSetIOError( bResult, 0 ); + hb_vmLock(); #elif defined(HAVE_POSIX_IO) || defined(__MINGW32__) hb_vmUnlock(); bResult = ( chdir( ( char * ) pDirname ) == 0 ); - hb_vmLock(); hb_fsSetIOError( bResult, 0 ); + hb_vmLock(); #else @@ -2354,15 +2346,15 @@ HB_EXPORT BOOL hb_fsRmDir( BYTE * pDirname ) hb_vmUnlock(); bResult = RemoveDirectoryA( ( char * ) pDirname ); - hb_vmLock(); hb_fsSetIOError( bResult, 0 ); + hb_vmLock(); #elif defined(HAVE_POSIX_IO) || defined(__MINGW32__) hb_vmUnlock(); bResult = ( rmdir( ( char * ) pDirname ) == 0 ); - hb_vmLock(); hb_fsSetIOError( bResult, 0 ); + hb_vmLock(); #else @@ -2422,29 +2414,29 @@ HB_EXPORT USHORT hb_fsCurDirBuff( USHORT uiDrive, BYTE * pbyBuffer, ULONG ulLen hb_vmUnlock(); fResult = GetCurrentDirectoryA( ulLen, ( char * ) pbyBuffer ); - hb_vmLock(); hb_fsSetIOError( fResult, 0 ); + hb_vmLock(); #elif defined(HB_OS_OS2) hb_vmUnlock(); fResult = ( _getcwd1( (char *) pbyBuffer, uiDrive + 'A' - 1 ) == 0 ); - hb_vmLock(); hb_fsSetIOError( fResult, 0 ); + hb_vmLock(); #elif defined(HAVE_POSIX_IO) hb_vmUnlock(); fResult = ( getcwd( ( char * ) pbyBuffer, ulLen ) != NULL ); - hb_vmLock(); hb_fsSetIOError( fResult, 0 ); + hb_vmLock(); #elif defined(__MINGW32__) hb_vmUnlock(); fResult = ( _getdcwd( uiDrive, pbyBuffer, ulLen ) != NULL ); - hb_vmLock(); hb_fsSetIOError( fResult, 0 ); + hb_vmLock(); #else @@ -2617,8 +2609,8 @@ HB_EXPORT BOOL hb_fsIsDevice( HB_FHANDLE hFileHandle ) hb_vmUnlock(); bResult = GetFileType( DosToWinHandle( hFileHandle ) ) == FILE_TYPE_CHAR; - hb_vmLock(); hb_fsSetIOError( bResult, 0 ); + hb_vmLock(); #elif defined(HB_FS_FILE_IO) @@ -2628,8 +2620,8 @@ HB_EXPORT BOOL hb_fsIsDevice( HB_FHANDLE hFileHandle ) #else bResult = isatty( hFileHandle ) != 0; #endif - hb_vmLock(); hb_fsSetIOError( bResult, 0 ); + hb_vmLock(); #else @@ -2877,6 +2869,7 @@ HB_EXPORT BOOL hb_fsEof( HB_FHANDLE hFileHandle ) } #else fResult = eof( hFileHandle ) != 0; + hb_fsSetIOError( fResult, 0 ); #endif hb_vmLock(); diff --git a/harbour/source/rtl/fserror.c b/harbour/source/rtl/fserror.c index 2d8695a987..f121a2e1b6 100644 --- a/harbour/source/rtl/fserror.c +++ b/harbour/source/rtl/fserror.c @@ -223,20 +223,21 @@ HB_EXPORT void hb_fsSetError( USHORT uiError ) /* set error code for last operation */ HB_EXPORT void hb_fsSetIOError( BOOL fResult, USHORT uiOperation ) { - PHB_IOERRORS pIOErrors = hb_stackIOErrors(); + USHORT uiOsErrorLast, uiErrorLast; + PHB_IOERRORS pIOErrors; /* TODO: implement it */ HB_SYMBOL_UNUSED( uiOperation ); if( fResult ) { - pIOErrors->uiOsErrorLast = pIOErrors->uiErrorLast = 0; + uiOsErrorLast = uiErrorLast = 0; } else { #if defined(HB_WIN32_IO) || defined(HB_OS_WIN_32) - pIOErrors->uiOsErrorLast = ( USHORT ) GetLastError(); - pIOErrors->uiErrorLast = ( USHORT ) hb_WinToDosError( pIOErrors->uiOsErrorLast ); + uiOsErrorLast = ( USHORT ) GetLastError(); + uiErrorLast = ( USHORT ) hb_WinToDosError( uiOsErrorLast ); #elif defined(_MSC_VER) || defined(__DMC__) #ifdef __XCC__ extern unsigned long _doserrno; @@ -245,16 +246,19 @@ HB_EXPORT void hb_fsSetIOError( BOOL fResult, USHORT uiOperation ) #endif if( _doserrno != 0 ) { - pIOErrors->uiOsErrorLast = pIOErrors->uiErrorLast = _doserrno; + uiOsErrorLast = uiErrorLast = _doserrno; } else { - pIOErrors->uiOsErrorLast = errno; - pIOErrors->uiErrorLast = hb_errnoToDosError( errno ); + uiOsErrorLast = errno; + uiErrorLast = hb_errnoToDosError( errno ); } #else - pIOErrors->uiOsErrorLast = errno; - pIOErrors->uiErrorLast = hb_errnoToDosError( pIOErrors->uiOsErrorLast ); + uiOsErrorLast = errno; + uiErrorLast = hb_errnoToDosError( uiOsErrorLast ); #endif } + pIOErrors = hb_stackIOErrors(); + pIOErrors->uiOsErrorLast = uiOsErrorLast; + pIOErrors->uiErrorLast = uiErrorLast; } diff --git a/harbour/source/rtl/fssize.c b/harbour/source/rtl/fssize.c index e39ac30472..8e8c1ec8e0 100644 --- a/harbour/source/rtl/fssize.c +++ b/harbour/source/rtl/fssize.c @@ -102,10 +102,10 @@ HB_FOFFSET hb_fsFSize( BYTE * pszFileName, BOOL bUseDirEntry ) pszFileName = hb_fsNameConv( pszFileName, &fFree ); hb_vmUnlock(); fResult = stat64( ( char * ) pszFileName, &statbuf ) == 0; + hb_fsSetIOError( fResult, 0 ); hb_vmLock(); if( fFree ) hb_xfree( pszFileName ); - hb_fsSetIOError( fResult, 0 ); if( fResult ) return ( HB_FOFFSET ) statbuf.st_size; #else @@ -114,10 +114,10 @@ HB_FOFFSET hb_fsFSize( BYTE * pszFileName, BOOL bUseDirEntry ) pszFileName = hb_fsNameConv( pszFileName, &fFree ); hb_vmUnlock(); fResult = stat( ( char * ) pszFileName, &statbuf ) == 0; + hb_fsSetIOError( fResult, 0 ); hb_vmLock(); if( fFree ) hb_xfree( pszFileName ); - hb_fsSetIOError( fResult, 0 ); if( fResult ) return ( HB_FOFFSET ) statbuf.st_size; #endif diff --git a/harbour/source/rtl/fstemp.c b/harbour/source/rtl/fstemp.c index 2b383c4f85..27962a3f3c 100644 --- a/harbour/source/rtl/fstemp.c +++ b/harbour/source/rtl/fstemp.c @@ -105,9 +105,9 @@ static BOOL hb_fsTempName( BYTE * pszBuffer, const BYTE * pszDir, const BYTE * p #endif + hb_fsSetIOError( fResult, 0 ); hb_vmLock(); - hb_fsSetIOError( fResult, 0 ); return fResult; } @@ -225,8 +225,8 @@ HB_EXPORT HB_FHANDLE hb_fsCreateTemp( const BYTE * pszDir, const BYTE * pszPrefi hb_strncat( ( char * ) pszName, "XXXXXX", _POSIX_PATH_MAX ); hb_vmUnlock(); fd = ( HB_FHANDLE ) mkstemp( ( char * ) pszName ); - hb_vmLock(); hb_fsSetIOError( fd != ( HB_FHANDLE ) -1, 0 ); + hb_vmLock(); } else #endif diff --git a/harbour/source/rtl/hbffind.c b/harbour/source/rtl/hbffind.c index c965c2ac5e..b7625ce3fe 100644 --- a/harbour/source/rtl/hbffind.c +++ b/harbour/source/rtl/hbffind.c @@ -838,14 +838,14 @@ HB_EXPORT void hb_fsFindClose( PHB_FFIND ffind ) { if( ffind ) { - hb_vmUnlock(); - /* Do platform dependant cleanup */ if( ffind->info ) { PHB_FFIND_INFO info = ( PHB_FFIND_INFO ) ffind->info; + hb_vmUnlock(); + #if defined(HB_OS_DOS) #if defined(__DJGPP__) || defined(__BORLANDC__) @@ -893,11 +893,11 @@ HB_EXPORT void hb_fsFindClose( PHB_FFIND ffind ) #endif + hb_vmLock(); + hb_xfree( ( void * ) ffind->info ); } hb_xfree( ( void * ) ffind ); - - hb_vmLock(); } } diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index b0884ed802..ec8a9c4cfb 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -758,17 +758,18 @@ HB_EXPORT void hb_vmInit( BOOL bStartMainProc ) #if defined( HB_MT_VM ) hb_vmStackAdd( NULL ); #endif - hb_clsInit(); /* initialize Classy/OO system */ - hb_errInit(); - - /* initialize dynamic symbol for evaluating codeblocks */ - hb_symEval.pDynSym = hb_dynsymGetCase( hb_symEval.szName ); /* Set the language and codepage to the default */ /* This trick is needed to stringify the macro value */ hb_langSelectID( HB_MACRO2STRING( HB_LANG_DEFAULT ) ); hb_cdpSelectID( HB_MACRO2STRING( HB_CODEPAGE_DEFAULT ) ); + hb_clsInit(); /* initialize Classy/OO system */ + hb_errInit(); + + /* initialize dynamic symbol for evaluating codeblocks */ + hb_symEval.pDynSym = hb_dynsymGetCase( hb_symEval.szName ); + hb_setInitialize( hb_stackSetStruct() ); hb_conInit();