* src/rtl/hbini.prg
! use hb_ATokens( <cData>, .T. ) to divide .ini file to lines
It's much faster and fixes problem existing from initial version
of this code that .ini files with mixed EOLs cannot be correctly
decoded, i.e. .ini files with LF EOLs was couldn't be decoded if
someone added even single line with CRLF.
* small .ini read code reorganization
* include/hbcompdf.h
* include/hbexprb.c
* src/common/funcid.c
* src/vm/hvm.c
% optimize Array() function by replacing function call with HB_P_ARRAYDIM
PCODE. Because this optimization changes RTE and interacts with broken
code like
aVal := Array( 10, 0, "A" )
then it's not enabled by default. User can enable it by -ko switch.
* utils/hbtest/rt_array.prg
* use #pragma -ko- to for tests which interacts with above modification
* src/rtl/hbproces.c
% optimize memory allocation for redirected STDOUT and STDERR buffers in
hb_processRun() function.
The previous implementation was extremly inneficient when
hb_processRun() was used to extract very long output from
child process.
* src/rtl/hbtoken.c
+ added support for dividing text into lines using EOLs used by different
platform. To enable it it's enough to specify .T. as delimiter.
* src/rtl/filesys.c
* pacified MSVC warning - in fact this modification is significant only
for bugy code which changes current directory in MT programs. It's bug
on all platforms using current directory as process not thread
attribute (common behavior).
* include/inkey.ch
* src/rtl/hbgtcore.c
+ added new extended keycodes:
HB_K_TERMINATE
HB_K_MENU
* contrib/gtqtc/gtqtc1.cpp
+ center and rescale to console window dimension keeping aspect size ratio
picture passed to HB_GTI_DISPIMAGE when second parameter is .T.
+ added support for HB_K_MENU key
! fixed dynamic font size modification in fullscreen, maximized and
HB_GTI_RESIZEMODE_ROWS modes
* include/hbsocket.ch
+ added HB_SOCKET_ERR_NONE
* src/rtl/hbsocket.c
* clear socket error when hb_socketRecv*() or hb_socketSend*() returns
value greater then 0
% removed unnecessary error code setting in MS-Windows builds
of hb_socketGetIFaces()
* src/rtl/filesys.c
! allocate dynamically buffer for current directory name if default
one is too small when current disk is checked
* src/rtl/hbzlib.c
* use hb_xalloc()/hb_xfree() to allocate/free memory during
ZLIB compression and decompression instead of ZLIB default
ones (finished code started in Viktor's branch)
* src/rtl/tlabel.prg
* src/rtl/treport.prg
% use hb_ATokens() instead of local functions ListAsArray()
* simplified reading labels and reports from files
* src/rtl/teditor.prg
* src/rtl/tget.prg
* src/rtl/tlabel.prg
* src/rtl/treport.prg
* synced with Viktor's branch:
removed explicit NIL from parameters, formatting, updated comments
and variable names, use FOR EACH and SWITCH statements,
use hb_defaultValue(), use hb_StrShrink(), formatting, few fixes
* src/rtl/langcomp.prg
* synced with Viktor's branch
* src/rtl/memoedit.prg
* synced with Viktor's branch, optimizations, formatting and fixes:
; 2014-03-28 13:09 UTC+0100 Viktor Szakats
+ MemoEdit(): allow BLOCK and SYMBOL types for user callbacks
(only in the default, non-strict mode)
! MemoEdit(): fixed to only handle certain types of events in ME_INIT
stage in harmony with Cl*pper documentation
! MemoEdit(): fixed to not get into an infinite loop on initialization
when user callback is returning unhandled value
https://github.com/harbour/core/issues/21
! MemoEdit()/HBMemoEditor():KeyboardHook(): fixed to fall back to
default handling of K_ESC if getting called recursively
https://github.com/harbour/core/issues/21
+ HBMemoEditor():HandleUserKey(): now returns whether the event was
handled (as logical value) (previously: Self) [INCOMPATIBLE]
* fixed some misleading variable names
; 2014-01-28 03:11 UTC+0100 Viktor Szakáts
! MemoEdit() fixed to pass-through without interactivity
when the user function is a boolean .F.
; 2014-01-27 15:15 UTC+0100 Viktor Szakáts
% abort key checking optimized and made unicode compatible
* src/rtl/listbox.prg
* synced with Viktor's branch, optimizations, formatting and fixes:
; 2014-07-21 08:56 UTC+0200 Viktor Szakats
! ListBox():findData(): fixed to be able to search for non-string
data, to the same extent Cl*ipper is able to.
! ListBox():findData(): fixed exact/case-insensitive regression
from 6f8508ff54a3955822b36bf4a65a2775a11bab23
; 2014-07-21 03:26 UTC+0200 Viktor Szakats
+ LISTBOX object instance area made compatible with Cl*pper
(relevant when object is accessed as array)
; 2014-07-21 01:20 UTC+0200 Viktor Szakats
* renamed variable and macro to reflect their type
+ ListBox():findData(): documented potential RTE
; 2014-07-21 01:04 UTC+0200 Viktor Szakats
% ListBox():findText(), ListBox():findData(): use hb_LeftEq[I]()
! ListBox():findText(), ListBox():findData(): fixed to not RTrim()
while searching in EXACT mode. Regression from f61409bf19
+ ListBox():findText(), ListBox():findData(): allow to search
for any type of data in HB_CLP_STRICT mode to mimic Cl*pper behavior
! ListBox():findText(): fixed to allow zero length search text,
like Cl*pper. Regression from 93d3a46d84
! ListBox():addItem( cText, cData ): fixed to allow any type for cData,
not just NIL and string, like Cl*pper
+ ListBox():setData(): documented a Cl*pper bug
; 2014-03-09 18:19 UTC+0100 Viktor Szakáts
! ListBox():scroll() fixed to ignore non-numeric parameter
(like Cl*pper) instead of an RTE
* src/rtl/hbrand.c
! fixed memory leak
* src/rtl/philes.c
! fixed number to handle casting
* src/rtl/version.c
! added missing break in switch statement
* src/rtl/hbsockhb.c
* formatting and protection against wrong parameter passed
to hb_socketGetHosts()
; above modifications borrowed from Viktor's branch with some small
modifications
* src/rtl/hbsocket.c
! always set pSockAddr and puiLen parameters passed to hb_socketAccept()
and hb_socketRecvFrom() functions
* formatting and comment syncing with Viktor's branch
* contrib/gtqtc/gtqtc.hbc
* contrib/gtqtc/gtqtc.hbp
! fixed detecting QT when both QT4 and GT5 versions are installed
in OSX (synced with Viktor's branch)
* src/rtl/gttrm/gttrm.c
* small modification for future usage
* contrib/hbnetio/netiosrv.c
* small simplification
* src/rtl/hbznet.c
! fixed possible data stream corruption which could be exploited in
systems which can accept only one byte in socket write operation
when internal TCP output buffers are full. Rather seldom situation
but theoretically possible, i.e. in VPN.
* src/rtl/hbsocket.c
* clear socket error after successful connect
* src/rtl/hbznet.c
! fixed possible connection interrupting when data incomes fragmented
in very small peaces
* include/hbgtinfo.ch
+ added HB_GTI_MINIMIZED
* contrib/gtqtc/gtqtc.h
* contrib/gtqtc/gtqtc1.cpp
+ added support for HB_GTI_MINIMIZED
* src/rtl/gtxwc/gtxwc.c
+ added support for HB_GTI_MINIMIZED and HB_GTI_MAXIMIZED
; All above modifications created by Rolf - thanks
* contrib/hbnetio/netiocli.c
* updated some RTEs to be a little bit more precise
* contrib/hbblat/hbblat.hbp
* disabled unconditional dynamic library build
* src/rtl/gtxwc/gtxwc.c
! fixed size of picture shown by HB_GTI_DISPIMAGE
! fixed indexes used to restore text data after
hb_gtInfo( HB_GTI_DISPIMAGE, "" )
* src/Makefile
! fixed to only include compilable GTs in Harbour dynlib
(borrowed from Viktor's fork)
* src/rtl/gtxwc/gtxwc.c
+ redraw screen area when empty string is passed as image body
to HB_GTI_DISPIMAGE, i.e.:
hb_gtInfo( HB_GTI_DISPIMAGE, "" [, <aCords> ] )
If <aCords> is not given then whole screen is refreshed.
* src/3rd/tiff/tiff.dif
* src/3rd/tiff/tiffconf.h
* do not redefine O_* macros in all *nix builds
* src/compiler/harbour.yyc
* src/compiler/harbour.yyh
* src/macro/macro.yyc
* src/macro/macro.yyh
* regenerated with bison 3.0.2.
* src/rtl/hbcom.c
! fixed compilation with OpenWatcom for Linux
* src/rtl/hbsocket.c
* pacified warning in OpenWatcom Linux builds
* src/rtl/hbjson.c
* own code for conversion integer numbers
* include/hbapi.h
* src/common/hbstr.c
+ added new function hb_strAtI() - it works like hb_strAt() but it
ignores the case of the ASCII characters
* src/rtl/ati.c
* renamed local static function hb_strAtI() to s_strAtI() to avoid
conflict with new public hb_strAtI() function.
* contrib/xhb/xhbat.c
- removed local static function hb_strAtI() - current public hb_strAtI()
is compatible with it.
* contrib/sddsqlt3/core.c
+ added new code to set column type giving the highest priority SQLITE3
declared column types.
Please test - I haven't made any.
! do not cast floating point values to integer
* contrib/hbwin/hbwin.hbx
* contrib/hbwin/win_prn2.c
! fixed win_printerGetDefault() in Win9x builds - fix and some
formatting and casting borrowed from Viktor's fork.
+ added new PRG function:
win_PrintDataRaw( <cPrinter>, <cData> [, <cDocName>] )
-> <nBytesPrinted>
It's similar to win_PrintFileRaw() but sends to given printer passed
in 2-nd parameter <cData> instead of file body.
On error it returns negative value.
* cleaned casting and minor formatting
* src/rtl/gtxwc/gtxwc.c
+ added support for HB_GTI_DISPIMAGE. It's slightly modified code sent
by Rolf to Harbour devel list. In comparison to original version it
supports <nDepth> as 4-th item of array with bitmap description to use
with some other GTs which can support different color depths or can
make conversion. It also supports bitmaps passed as strings.
% slightly improved HB_GFX_GETPIXEL
* contrib/gtqtc/gtqtc1.cpp
* src/rtl/gtwvt/gtwvt.c
* contrib/gtwvg/gtwvgd.c
* use hb_vmRequestQuit() instead of hb_vmRequestCancel() when
close event is received - it is GTXWC compatible behavior and
allows to execute user EXIT PROCEDUREs.
Please also remember that all ALWAYS sections are executed too
regardles of requested event (QUIT, BREAK, CANCEL)
* src/rtl/gtwvt/gtwvt.c
! fixed processing WM_QUERYENDSESSION and WM_ENDSESSION messages.
Now GTWVT applications do not interrupt system shutdown process
and do not close application if other process interrupted it.
In the future we can also add support for blocking system shutdown
operation, i.e. using HB_GTI_CLOSEMODE as bitfield, anyhow before
we begin to change it we should agree final version.
! applied Rolf's patch which fixes circle and ellipse cords.
I haven't tested it and I hope that they were verified visually
on the screen - some of Windows GUI functions do not access
border points.
* contrib/hbmysql/tmysql.prg
* added support for nFlags in TMySQLServer constructor as
suggested by Fernando Athayde
* src/rtl/gtcgi/gtcgi.c
% replaced hb_cdpnDup() with hb_cdpnDup3() to eliminate unnecessary
memory block duplicating when translation is not activated.
* src/vm/itemapi.c
* removed old ugly hack used to mark infinite or undefined double
value using double item length field. The code which created such
item have been eliminated many years ago.
* use HB_DEFAULT_WIDTH instead of hardcoded 99 to force numeric value
length recalculation.
* contrib/hbct/ctwin.c
! fixed typo in window area checking when current window is 0
It fixes problem with debugger reported by Rolf.
* src/debug/dbgentry.c
% few optimizations
! added few protections against GPF when wrong parameters are passed
! fixed missing support for symbol, date and timestamp values in
tracepoints
+ added __dbgCntWatch()
* src/rtl/filesys.c
* src/rtl/hbproces.c
* pacified warning in more aggressive way for newer GCC versions
* include/harbour.hbx
* refreshed
* include/harbour.hbx
* src/rtl/val.c
+ added new function: hb_Val( <cStr> [, <nLen> ] ) -> <nVal>
it works like a val but set length for numeric result to passed string
length or <nLen> parameter if is large enough.
* src/rtl/tget.prg
! use hb_Val() instead of Val() for numeric GETs to replicate Clipper
behavior for pictures longer then 10 characters.
* src/rtl/itemseri.c
* minor update in comments
* contrib/hbct/ctwin.c
* src/rtl/hbgtcore.c
! fixed GTCTW window handle save/restore on debugger activation
I broke in 107b36e847
Thanks to Rolf for the info and patch.
* contrib/hbziparc/ziparc.prg
* synced with Viktor's branch.
This code should contain Rolf fixes. Please test.
* src/rtl/gtwin/gtwin.c
+ added support for disabling [x] button of console window in older
MS-Windows versions which do not have GetConsoleWindow() function,
i.e. Win9x/ME
* include/hbserial.ch
* src/rtl/itemseri.c
+ added HB_SERIALIZE_IGNOREREF flag.
This flag fully disables logic used to detect multireferences to the
same complex (sub)items like arrays or hashes. It increses the speed
of serialization but serialized data does not contain any information
about refences, i.e. aVal[ 1 ] and aVal[ 2 ] in code below:
aSub := { 1, 2, 3 }
aVal := { aSub, aSub }
are serialized as separated arrays. Additionally items with cyclic
references like:
aSub[ 2 ] := aSub
cannot be serialized at all with HB_SERIALIZE_IGNOREREF flag because
it will create infinite serialization loop and crash with out of
memory message.
* src/rtl/itemseri.c
% rewritten algorithm used to detect cyclic and multi references in
serialized items. The original algorithm has very high overhead when
huge arrays were serialized, i.e. serialization of array with 1'000'000
of subarrays needed about 30 minutes on my i5@3.30GHz. Now it needs
less then a second and this time is only a little bit bigger then
used by serialization with HB_SERIALIZE_IGNOREREF flag.
This modification improve performance also in other code using Harbour
serialization mechanism like I18N files, HBNETIO, GTNET, ... when large
arrays or hashes are saved or transmitted.
* include/hbapi.h
* include/hbapicls.h
* src/vm/arrays.c
* src/vm/classes.c
* src/vm/hashes.c
* src/vm/itemapi.c
* replaced algorithm used to detect cyclic and multi references in
array and hash clone operations with new one similar to current
item serial code. The speed improvement for very large arrays is
the same as in case of serialization code.
* src/rtl/gtsln/mousesln.c
! typo in while loop - synced with Viktor's branch
* contrib/hbtip/mail.prg
! fixed missing 1-st adress in CC and BCC parameters - many
for information about the bug and patch
* contrib/hbtip/sendmail.prg
! typo in comment - thanks to Heinz V Bergen too
* src/rtl/gtwvt/gtwvt.c
* some minor modification to sync code with Vitkor's branch
* src/vm/hvm.c
* src/vm/itemapi.c
* small optimization in string comparison
* extras/gtwvw/gtwvwd.c
! fixed typo in WVW_SETICON() - thanks to Ash
* src/rdd/dbcmd53.c
! typo in comment
* src/rtl/dateshb.c
% use hb_retclen() instead of hb_retc() when size is well known.
* src/rtl/valtoexp.prg
% use hb_defaultValue()
* src/vm/estack.c
* minor cleanup
* src/vm/fm.c
* modified a little bit HB_MEMINFO structure to force strict alignment
+ added debug code covered by HB_FM_FORCE_REALLOC macro which forces
allocateing new block in each hb_xrealloc() call
! protect realloc() in HB_FM_STATISTIC by mutex, it fixes issue #77.
* src/rtl/hbproces.c
% unlock HVM waiting for process in OS2 builds
! build array of argument passed to process in hb_processRun() in
parent process not forked one. It fixes possible deadlock in forked
process because memory is allocated to create arguments array and
in MT program memory managers may use mutexes internally which can
be cloned to forked process in locked state.
It fixes seldom and random HBMK2 freezing during compilation
with -jobs=<n> parameter.
* utils/hbmk2/hbmk2.prg
! fixed race condition in concurrent C compiler execution (-jobs=<n>)
with script file
* src/debug/dbgentry.c
! fixed crash when wrong expression is used as tracepoint
! fixed expression analyzer to correctly recognized extended strings e"..."
* formatting
* src/debug/dbgbrwsr.prg
* src/debug/dbghelp.prg
* src/debug/dbgtarr.prg
* src/debug/dbgthsh.prg
* src/debug/dbgtinp.prg
* src/debug/dbgtmenu.prg
* src/debug/dbgtobj.prg
* src/debug/dbgtwin.prg
* src/debug/dbgwa.prg
* src/debug/debugger.prg
* added calls to ::NotSupported() method for some still missing
functionality
! do not use SetColor() but directly pass colors to used objects
and functions
! do not use SetPos() and Row()/Col() for core functionality - it was
source of few minor bugs
% enable cursor only in input objects and disable it just after
% eliminated code to save and restore cursor position and shape
! fixed initial positioning in help window
+ implemented HiLite() and DeHiLite() methods in HBDbBrowser() class
! fixed positioning when end of source data is reached in browser
% eliminated some redundant or completely useless code and comments
% use some fully functional HBDbBrowser() features instead of manual
encoding similar functionality
! validate watchpoint and tracepoint expressions
% use SWITCH statements
! fixed expression presentation (added __dbgValToExp() and __dbgValToStr())
! fixed input for new expressions
! fixed browser scrolling in object inspector
! fixed inkey() processing inside debugger (ALT+D and ALT+C)
! fixed browsers highliting in WA inspector
! fixed hardcoded limit for 512 workareas in WA inspector
! fixed initial WA positioning in WA inspector
* resized WA inspector window
* many other minor fixes and improvements
* contrib/hbwin/olecore.c
+ added some additional error codes to win_oleErrorText() function
* contrib/hbwin/hbole.ch
+ added OLE error code definitions with WIN_* prefix for errors returned
by win_oleErrorText()
* contrib/xhb/xhb.hbx
* contrib/xhb/xhbole.prg
+ aded new function OleDefaultArg()
% minor simplification
* src/rtl/itemseri.c
* do not generate RTE when wrong string is deserialized.
Now RTE 3016 is generated only when compressed data is deserialized
and ZLIB is not linked with final binaries so users can easy locate
the source of problem.
* src/vm/garbage.c
% added missing static in s_gcSpinLock declaration
* src/rtl/hbi18n1.c
* typo in comment
* src/rdd/dbf1.c
* src/rdd/dbffpt/dbffpt1.c
* src/rdd/dbsql.c
* formatting
* src/rdd/usrrdd/rdds/logrdd.prg
* src/rdd/usrrdd/usrrdd.c
* src/rtl/checkbox.prg
* src/rtl/getsys.prg
* src/rtl/listbox.prg
* src/rtl/menuto.prg
* src/rtl/pushbtn.prg
* src/rtl/radiobtn.prg
* src/rtl/radiogrp.prg
* src/rtl/scrollbr.prg
* src/rtl/tbrowse.prg
* src/rtl/tget.prg
* src/rtl/tgetint.prg
* src/rtl/tgetlist.prg
* src/rtl/tmenuitm.prg
* src/rtl/errapi.c
* src/rtl/hbgtcore.c
* src/rtl/hbi18n1.c
* src/rtl/hbinet.c
* src/rtl/idle.c
* src/rtl/math.c
* src/rtl/setkey.c
* src/vm/asort.c
* src/vm/hashfunc.c
* src/vm/thread.c
* accept any EVAL item not only codeblocks. Actually it means that
also SYMBOL items are accepted but in the future we may extend it
and accept also objects of classes with :eval() message.
* src/rtl/tget.prg
! fixed GET default PICTURE for TIMESTAMP type
fixes https://github.com/harbour/core/issues/65
2014-05-11 00:05 UTC+0200 Viktor Szakats
! fixed GET colors when _SET_INTENSITY == .F.
2014-04-22 02:35 UTC+0200 Viktor Szakats
% use Stuff() instead of different combinations of Left() and SubStr()
* include/harbour.hbx
* src/rtl/left.c
+ added new function to replace "=" operator without the SET EXACT ambiguity
in its most common pattern of usage:
hb_LeftEq( <cString1>, <cString2> ) -> <lResult>
it's equivalent to this expression, but faster and shorter:
( Left( <cString1>, Len( <cString2> ) ) == <cString2> )
2014-01-22 03:09 UTC+0100 Viktor Szakáts
+ added hb_LeftEqI(). Same as hb_LeftEq() but case-insensitive.
hb_LeftEqI( <cString1>, <cString2> ) -> <lResult>
2014-02-04 13:38 UTC+0100 Viktor Szakáts
* include/harbour.hbx
* src/rtl/chruni.c
+ added hb_BRAt(). Same as hb_RAt() but for raw/binary strings
2014-06-25 19:54 UTC+0200 Viktor Szakats
* contrib/sddsqlt3/core.c
! fixed missing first record of query
2013-11-08 21:43 UTC+0100 Viktor Szakats
; many of above modification was borrowed directly or try to follow some
changes in Viktor's branch - thanks.
* src/common/hbfsapi.c
* src/rtl/filesys.c
* src/rtl/filebuf.c
* contrib/hbmzip/mzip.c
* contrib/xhb/filestat.c
! if available always use stat64() instead of stat() in *nixes builds.
On 32-bit platforms stat() fails for larger files (>2GB).
It should fix problem reported by Lorenzo.
* src/rtl/filebuf.c
! fixed bad typo inside hb_fileIsLocalName() - result was reverted.
Many thanks to Juan Gálvez for locating the problem.
* src/debug/dbgbrwsr.prg
! fixed typo in previous commit.
It should fix also problem with positioning in debugger source
window reported by Alexey Myronenko.
% minor simplification
* contrib/hbmisc/udpds.prg
! updated to send correct broadcast messages in * nixes and
respect broadcast addresses returned by system for IP interfaces
* src/rdd/hbdbsort.c
* src/rdd/hbsix/sxcompr.c
* pacified warnings
* src/rtl/cdpapi.c
* src/rtl/iousr.c
* src/rtl/hbjson.c
* src/rtl/gtcrs/gtcrs.c
* src/rtl/gtsln/gtsln.c
* src/rtl/gttrm/gttrm.c
* src/rtl/gtxwc/gtxwc.c
* src/rdd/workarea.c
* src/rdd/hbsix/sxcompr.c
* contrib/hbct/token2.c
* contrib/hbsqlit3/core.c
* pacified some of -Wshadow warnings
* include/hbapicdp.h
! typo in comment: bytes -> bits
* src/vm/garbage.c
* src/vm/thread.c
* disabled some code with spinlocks when HB_HELGRIND_FRIENDLY macro
is defined. It causes that final MT HVM code is slower using native
platform mutexes but only such ones helgrind can recognize so the
new macro can be useful for people who want to make some tests with
helgrind. In such case they should rebuild Harbour with
HB_USER_CFLAGS=HB_HELGRIND_FRIENDLY
We use spinlocks and atomic integer operations also in few other
places so it's possible that deeper tests can exploit them and
we will have to cover them by HB_HELGRIND_FRIENDLY too just to
easy detect real problems.
* contrib/gtqtc/gtqtc.h
* contrib/gtqtc/gtqtc1.cpp
* overload inputMethodEvent() in console object and insert
commitString() data into GT keyboard input queue.
It's necessary for Android working with SoftwareInputPanel
and it fixes problem with eaten standard characters.
QT documentation says that QInputMethodEvent are generated
only when Qt::WA_InputMethodEnabled attribute is set but
tests shows that it's not true and these events are generated
instead of keyPress/keyRelease ones for simple text input.
CTRL modifier, ESC, INS, HOME, END, PGUP, PGDN and Fn keys
still does not work with GTQTC in Android builds.
* src/rtl/tbrowse.prg
! fixed compilation with HB_BRW_STATICMOUSE
! do not cover dummy ivar with HB_COMPAT_C53 macro
* minor simplification
* src/vm/arrays.c
* removed old commented code not used with current GC
* src/rtl/filebufd.c
* src/rtl/iousr.c
* slightly modified code to pacify warnings in some older GCC versions
* contrib/gtwvg/gtwvg.hbx
* regenerated with new function
* 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/Makefile
+ include/hbiousr.ch
* src/rtl/Makefile
+ src/rtl/iousr.c
+ added module for writting Harbour FILE IO redirectors at PRG level
+ tests/iotcp.prg
+ example code for FILE IO redirector written in PRG.
It's IOTCP and gives exactly the same functionality as TCP redirector
in contrib which is written in C.
* src/vm/runner.c
% modified internal structure to eliminate some memory allocations
* contrib/hbpgsql/rddcopy.c
% small simplification
* 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