* src/rtl/filebuf.c
! unlock HVM stack before locking local mutex and calling hb_fs*()
functions which also unlocks HVM. It fixes possible deadlock condition
when hb_gcAll( .T. ) is executed.
* include/hbapi.h
* src/vm/garbage.c
! changed mark function semantic.
Adding support for user defined mark function I created race condition
in MT GC code. It happens because blocks marked as deleted were not
scanned by GC mark code so their subitems where not accessible.
To fix it we have to change mark function semantic. Now mark function
can be executed also for blocks currently deleted. It means that GC
block destructor should clean references to just removed items and
subblocks. The best place to make it is clearing pointers to GC blocks
just after hb_itemRelease() or hb_gcRefFree().
It is save to clean the reference just before hb_itemRelease() or
hb_gcRefFree() but only for the single block passed to these functions.
It is not save to clear reference to more then one block and then
execute above functions.
+ check reference count after destructor execution for all blocks
not only arrays - warning it may exploit some wrong C code.
- removed not longer used hb_gcRefCheck() function.
* include/hbvm.h
* src/vm/hvm.c
+ added new internal function hb_vmLockForce()
! fixed to mark GC blocks with active threads
* src/vm/thread.c
* include/hbthread.h
% modified sync mutexes used by xBase++ signal class emulation
to not use item array internally
* updated mutex destructor to new GC mark semantic
! mark GT items if GT is bound with thread item
! fixed mutex notify/subscribe code to not change GC items
when HVM stack is unlocked
! use hb_vmLockForce() to eliminate potential deadlock
+ added new C function hb_threadEnterCriticalSectionGC().
It should be used instead of hb_threadEnterCriticalSection()
in code which manipulates GC items inside critical section.
It's slower but eliminates possible deadlock condition.
Please remember that remember that both functions cannot
be used for the same mutex. So if it's necessary to use
hb_threadEnterCriticalSectionGC() in one place then it
has to be used in all others when the same mutex is locked.
* src/vm/arrays.c
* src/vm/codebloc.c
* src/vm/hashes.c
* src/rtl/hbgtcore.c
* contrib/hbcurl/core.c
* contrib/hbexpat/core.c
* updated destructors to new GC mark semantic
* contrib/hbxpp/dllx.c
! fixed destructor for pointer item created by DllPrepareCall()
Now it respects reference counter.
; added note about real behavior of library handle destructor,
I haven't changed existing code behavior but maybe it should
be done.
* contrib/xhb/hbserv.c
* src/debug/dbgentry.c
* src/rdd/wacore.c
! fixed possible deadlocks by using hb_threadEnterCriticalSectionGC()
instead of hb_threadEnterCriticalSection().
* contrib/hbmemio/memio.c
! slightly modified hb_memfsDirectory() code to avoid race condition
without using hb_threadEnterCriticalSectionGC()
* src/vm/fm.c
% reduce the lock range in HB_FM_STAT builds
* src/rtl/hbsocket.c
! added missing HVM stack unlocking in hb_socketSelect() function
* src/rtl/gtxwc/gtxwc.c
! added few missing locks for version compiled with HB_XWC_XLIB_NEEDLOCKS
* src/rdd/dbtotal.prg
* allow to use symbols instead of codeblocks
* modified Harbour extension which uses ordKey() as default group
signature to work also without index. In such case all records
are summarized into single one.
; Most of above modifications were critical for stability of MT programs.
They should allow to activate GC in any place.
* include/hbapifs.h
* src/rtl/filebuf.c
* src/rtl/filebufd.c
* contrib/hbcomio/comio.c
* contrib/hbmemio/memio.c
* contrib/hbnetio/netiocli.c
* contrib/hbtcpio/tcpio.c
* changed internal FILE IO API. Now all functions which do
not operate on PHB_FILE receive pointer to function table
(PHB_FILE_FUNCS) used by given redirector.
* src/rtl/vfile.c
* open wirtual files in READWRITE mode by default
* translate FO_* attributes to FXO_* ones
* src/vm/classes.c
! fixed typo in RTE message
* src/vm/garbage.c
* use different error code (1301/1302) for destructor RTE
* src/rtl/gtxwc/gtxwc.c
* src/rtl/gtxwc/gtxwc.h
+ added support for HB_GTI_FONTWEIGHT with HB_GTI_FONTW_* actions
* contrib/hbpgsql/rddcopy.c
! fixed memory leak
% encapsulate PQ calls in hb_vmUnlock()/hb_vmLock() to not stop
other threads when GC is activated
* src/vm/set.c
! fixed freed memory access exploited by interactions between
modifications in last few years.
! do not try to remove trailing ^Z char reading from the stream
if FS_END seek reports 0.
! if possible open printer/alternate/extra output in write only mode
to avoid problem on devices where read access is not available.
* src/rtl/langapi.c
* keep EN lang active after deinitialization
* src/rtl/filesys.c
! fixed condition for file time refresh in *nix builds
! fixed file time setting in *nix builds
* include/hbapifs.h
* src/rtl/Makefile
* src/rtl/filebuf.c
+ src/rtl/filebufd.c
* renamed hb_fileRegister2() to hb_fileRegisterFull()
+ added new function hb_fileRegisterPart() which simplifies writing
small FILE IO redirectors.
* contrib/hbmemio/memio.c
* contrib/hbnetio/netiocli.c
* use hb_fileRegisterFull()
* contrib/hbplist.txt
+ contrib/hbtcpio/hbtcpio.hbc
+ contrib/hbtcpio/hbtcpio.hbp
+ contrib/hbtcpio/hbtcpio.hbx
+ contrib/hbtcpio/tcpio.c
+ added new Harbour FILE IO redirector.
It recognizes and process names with "tcp:" prefix, in form like:
tcp:<host>:<port>[:<timeout>]
It can be used in different subsystems using Harbour FILE IO and
stream read/write operations, i.e.
REQUEST HB_TCPIO
SET PRINTER TO tcp:192.168.0.110:9100
can be used to connect to network printers using TCP direct printing.
* utils/hbmk2/po/hbmk2.pt_BR.po
! fixed typo in translation
* ChangeLog.txt
* include/harbour.hbx
* src/rtl/Makefile
- src/rtl/xfile.c
+ src/rtl/vfile.c
* renamed PRG functions HB_X*() to HB_VF*()
* renamed PRG functions hb_vf[GS]etAttr() to hb_vfAttr[GS]et()
* renamed PRG functions hb_vf[GS]etDateTime() to hb_vfTime[GS]et()
* include/hbapifs.h
* src/rtl/filebuf.c
* src/rtl/fscopy.c
* contrib/hbmemio/memio.c
* contrib/hbnetio/netio.h
* contrib/hbnetio/netiocli.c
* contrib/hbnetio/netiosrv.c
* renamed C functions hb_file[GS]etAttr() to hb_fileAttr[GS]et()
* renamed C functions hb_file[GS]etFileTime() to hb_fileTime[GS]et()
* contrib/hbnetio/netio.h
* contrib/hbnetio/netiocli.c
* contrib/hbnetio/netiosrv.c
+ added support for redirecting hb_vfConfig() to the server.
NETIO does not use it anyhow NETIO works as full redirector
to server system and it may be used on the server side.
* contrib/hbhpdf/3rd/libhpdf/hpdffdfj.c
! removed executable attribute
* src/vm/thread.c
! fixed typo reported by Viktor - thanks.
* include/hbapifs.h
* src/rtl/hbproces.c
* src/rtl/spfiles.c
* src/rtl/filesys.c
* src/rtl/file.c
* synced parameter file and dir names used in declarations and
implementations
* include/hbrddcdx.h
+ added few fields used in ADI files
* src/codepage/cp_utf8.c
* src/rtl/cdpapi.c
! always return -1, 0 and 1 from hb_cdpcmp() function.
Workaround for problem exploited by optimized memcmp() function.
* src/rdd/dbfntx/dbfntx1.c
! fixed possible sort problem when optimized memcmp() is used
* added feew missing const declarations
* src/rdd/dbfntx/dbfntx1.c
* src/rdd/dbfnsx/dbfnsx1.c
* src/rdd/dbfntx/dbfntx1.c
! fixed OrdWildSeek() to work with optimized memcmp()
* include/hbapifs.h
* src/rtl/disksphb.c
+ added new C function:
double hb_fsDiskSpace( const char * pszPath, HB_USHORT uiType );
* include/hbapifs.h
* src/rtl/direct.c
+ added new C function:
PHB_ITEM hb_fsDirectory( const char * pszDirSpec,
const char * pszAttributes );
* src/rtl/filesys.c
! report EOF in hb_fsEof() also when file position is out of file size
* updated comment
* include/hbapifs.h
* src/rtl/filebuf.c
+ extended Harbour FILE IO API and added support for read/write filepos,
directory and link operations.
Read/write filepos support in some systems (i.e. *nixes) needs additional
emulation code. If it's not necessary then this functionality can be
disabled by FXO_NOSEEKPOS attribute. Now this attribute is used by our
RDD code.
* src/rtl/Makefile
+ src/rtl/xfile.c
+ added PRG interface to Harbour FILE IO API
The following PRG functions are available for Harbour programmers:
HB_XEXISTS( <cFileName>, [ @<cDestFileName> ] ) -> <lOK>
HB_XERASE( <cFileName> ) -> <nResult>
HB_XRENAME( <cFileSrc>, <cFileDst> ) -> <nResult>
HB_XCOPYFILE( <cFileSrc>, <cFileDst> ) -> <nResult>
HB_XDIREXISTS( <cDirName> ) -> <lExists>
HB_XDIRMAKE( <cDirName> ) -> <nSuccess>
HB_XDIRREMOVE( <cDirName> ) -> <nSuccess>
HB_XDIRECTORY( [ <cDirSpec> ], [ <cAttr> ] ) -> <aDirectory>
HB_XDIRSPACE( <cDirName>, [ <nInfoType> ] ) -> <nFreeSpace>
HB_XGETATTR( <cFileName>, @<nAttr> ) -> <lOK>
HB_XSETATTR( <cFileName>, <nAttr> ) -> <lOK>
HB_XGETDATETIME( <cFileName>, @<tsDateTime> ) -> <lOK>
HB_XSETDATETIME( <cFileName>, <tsDateTime> ) -> <lOK>
HB_XLINK( <cExistingFileName>, <cNewFileName> ) -> <nSuccess>
HB_XLINKSYM( <cTargetFileName>, <cNewFileName> ) -> <nSuccess>
HB_XLINKREAD( <cFileName> ) -> <cDestFileName> | ""
HB_XOPEN( <cFileName>, [ <nMode> ], [ <nAttr> ] ) -> <pHandle> | NIL
HB_XCLOSE( <pHandle> ) -> <lOK>
HB_XLOCK( <pHandle>, <nStart>, <nLen>, [ <nType> ] ) -> <lOK>
HB_XUNLOCK( <pHandle>, <nStart>, <nLen> ) -> <lOK>
HB_XLOCKTEST( <pHandle>, <nStart>, <nLen>, [ <nType> ] ) ;
-> <nPID> | 0 (nolock) | -1 (err)
HB_XREAD( <pHandle>, @<cBuff>, [ <nToRead> ], [ <nTimeOut> ] ) ;
-> <nRead>
HB_XWRITE( <pHandle>, <cBuff>, [ <nToWrite> ], [ <nTimeOut> ] ) ;
-> <nWritten>
HB_XREADAT( <pHandle>, @<cBuff>, [ <nToRead> ], [ <nAtOffset> ] ) ;
-> <nRead>
HB_XWRITEAT( <pHandle>, <cBuff>, [ <nToWrite> ], [ <nAtOffset> ] ) ;
-> <nWritten>
HB_XSEEK( <pHandle>, <nOffset>, [ <nWhence> ] ) -> <nOffset>
HB_XTRUNC( <pHandle>, [ <nAtOffset> ] ) -> <lOK>
HB_XSIZE( <pHandle> ) -> <nSize>
HB_XEOF( <pHandle> ) -> <lEOF>
HB_XFLUSH( <pHandle>, [ <lDirtyOnly> ] ) -> NIL
HB_XCOMMIT( <pHandle> ) -> NIL
HB_XCONFIG( <pHandle>, <nSet>, [ <nParam> ] ) -> <nResult>
HB_XHANDLE( <pHandle> ) -> <nOsHandle>
HB_XTEMPFILE( @<cFileName>, [ <cDir> ], [ <cPrefix> ], [ <cExt> ], ;
[ <nAttr> ] ) -> <pHandle> | NIL
Please remember that not all redirectors have to support all of them.
I.e. MEMIO allows to use directory names in files but does not allow to
create or remove directories. It also does not support file attributes
and times in current implementation though it can be easy added.
HB_XCONFIG() is general function which can be used by redirector
authors to make some special operations which are specific to given
device.
HB_XTEMPFILE() always creates temporary files on local system without
switching to FILE IO redirector. It's intentional behavior.
* src/rtl/fscopy.c
* used Harbour FILE IO API in hb_fsCopy()/HB_FCOPY()
Please remember that HB_FCOPY() always makes operation using current
system when HB_XCOPY() may optimize it moving the operation to low
level subsystem or even other computer i.e. NETIO can do that when
both files are located on the same server.
* src/rdd/delim1.c
* src/rdd/sdf1.c
* src/rdd/dbf1.c
* src/rdd/dbfcdx/dbfcdx1.c
* src/rdd/dbffpt/dbffpt1.c
* src/rdd/dbfnsx/dbfnsx1.c
* src/rdd/dbfntx/dbfntx1.c
* src/rdd/hsx/hsx.c
* open files with FXO_NOSEEKPOS attribute to inform low level API that
read/write filepos is not used (disables unnecessary filepos emulation).
* contrib/hbnetio/netio.h
* contrib/hbnetio/netiocli.c
* contrib/hbnetio/netiosrv.c
+ added support for extended Harbour FILE IO API.
* contrib/hbnetio/utils/hbnetio/netiomgm.hb
! renamed "quit" command to "shutdown" as suggested by Rolf.
* contrib/hbnetio/utils/hbnetio/hbnetio.prg
* allow to interrupt server process using ESC when run in console window.
* contrib/hbmemio/memio.c
+ added support for extended Harbour FILE IO API.
I left two minor TODO notes - maybe someone will try to implement it.
* (all files)
* stripped svn header
* minor cleanups
; use following command to find out the history of files:
git log
git log --follow
git blame
git annotate