* harbour/source/vm/hvm.c
* reduced the mutex lock time in thread exit state
* harbour/source/vm/thread.c
; added note about possible behavior of hb_threadSelf() function
in one very specific situation. It's documented and expected
behavior
* harbour/source/rtl/hbgtcore.c
+ added support for retrieving current HB_GTI_NOTIFIERBLOCK code block
+ added support for removing HB_GTI_NOTIFIERBLOCK code block without
setting the new one
* harbour/source/vm/garbage.c
* unblock HVM before executing destructors and releasing blocks
* harbour/source/vm/fm.c
! do not call internal error with active lock when FM statistic
is enabled
* harbour/source/vm/thread.c
! stop other threads in hb_threadOnce() if the 1-st one
executes bAction block to be sure that it will be completed
before thread leave hb_threadOnce() function
* harbour/source/vm/set.c
! do not call hb_inkeyReset() in set release. It's not necessary
and it could change keyboard buffer size for other threads using
the same GT driver.
* harbour/source/vm/hvm.c
% allocate new thread stack without lock
* harbour/source/rtl/hbgtcore.c
* harbour/source/rtl/gtapi.c
* moved clipboard resetting from hbgtcore.c to gtapi.c
* harbour/source/rtl/filesys.c
! do not use read/write operations with given file offset in Win9X
which seems to not support such functionality
* harbour/include/hbvm.h
* harbour/source/vm/hvm.c
+ added hb_vmProcessDynLibSymbols() which works like
hb_vmProcessSymbolsEx() but always mark registered modules as
dynamic
* harbour/source/vm/maindllp.c
* redirect hb_vmProcessSymbolsEx() to hb_vmProcessDynLibSymbols()
* harbour/source/vm/thread.c
* disabled some low level locking code in non MT HVM mode
* harbour/source/vm/hvm.c
* changed the place where exception handles are set/remove.
Now it's set at the beginning of hb_vmInit() and removed
at the end of hb_vmQuit()
* harbour/source/rdd/dbcmd.c
* harbour/source/rdd/dbf1.c
! added workaround for problem with EVAL block used in PACK
command
* harbour/source/compiler/hbmain.c
* minor simplification
* harbour/include/hbtypes.h
* harbour/source/vm/maindllp.c
! updated casting for current SVN code
[TOMERGE 1.0]
* harbour/include/hbthread.h
* harbour/source/vm/hvm.c
* harbour/source/vm/thread.c
+ added .prg function
hb_threadWait( <pThID> | <apThID>, [ <nTimeOut> ] [, <lAll> ] )
=> <nThInd> | <nThCount> | 0
This function wait for <nTimeOut> seconds (default infinite wait)
until one or all (controlled by <lAll> parameter) of given HVM threads
will have finished execution in HVM area. It does not join the threads.
It returns index to 1-st thread which has finished execution (default)
or number of threads which has finished in given time period when lAll
is .T.
* source/vm/cmdarg.c
* HB_ARGV() will now return the executable name if called
without a parameter.
! HB_ARGSTRING() fixed to return "" in some error
cases instead of NIL.
* harbour/source/vm/runner.c
* harbour/source/vm/codebloc.c
* harbour/source/vm/itemapi.c
* minor casting modification
* harbour/tests/speedtst.prg
* added workaround for timeout parameter not working in xHb Subscribe()
when 3-rd parameter is passed
* harbour/include/hbstack.h
* harbour/source/vm/estack.c
* harbour/source/vm/hvm.c
% moved static USHORT uiPolls to HVM stack to not reduce the HVM
performance in MT mode. In multi CPU environment if many threads
try to change the same memory variable in the same time the overall
performance is strongly reduced on most of tested hardware - probably
some random CPU delay used to resolve the conflict.
* include/hbapierr.h
* source/vm/extrap.c
* source/rtl/errorint.c
! Fixed recent modification on Windows platform, where
GPF would generate an internal error.
It didn't launch the OS error handler.
! Fixed hb_errInternal() being marked as HB_EXPORT
in the headers only.
* harbour/include/Makefile
+ harbour/include/hbatomic.h
* harbour/include/hbthread.h
* harbour/source/vm/garbage.c
* harbour/source/vm/fm.c
* moved atomic and spinlock functions into hbatomic.h
* harbour/include/hbatomic.h
+ added atomic inc/dec for GCC and x86@64 and PPC@32
+ use OSAtomic*() and OSSpin*() functions for atomic inc/dec and
spinlocks in Darwin builds
+ added spinlocks to MS-Win builds
* harbour/source/vm/hvm.c
! fixed last commit typo in thread number allocating - all threads
where using 0 number
* harbour/source/vm/thread.c
! fixed return value in recursive call to hb_mutexLock() - was FALSE
! fixed typo in timeout parameter number
should be 2 instead of 1
* harbour/source/rtl/tobject.prg
! fixed init() return value - it should be ignored and current
object should be returned
* harbour/source/rtl/tthreadx.prg
! probably fixed timeout parameter use in signal:wait() method
I guess that like other xbase++ functions it's in 1/100th of
a second
* harbour/include/hboo.ch
* harbour/include/hbclass.ch
* harbour/source/vm/classes.c
* harbour/source/rtl/tclass.prg
+ added support for SYNC object and CLASS messages working like
in xBase++. Please remember that all locked by thread SYNC messages
objects and classes are unblocked automatically for the time which
thread spends in hb_subscribe[Now]() or signal:wait()
* harbour/include/hbclass.ch
* harbour/include/hboo.ch
+ added SYNC attribute to accepted syntax in class declaration
it allows to compile code which uses this attribute but low
level implementation is not ready yet - work in progress
* harbour/source/vm/garbage.c
! added #define INCL_DOSPROCESS for OS2 builds. For some reasons
#define INCL_DOSDATETIME I've found in DosSleep() documentation
is note enough
* harbour/tests/speedtst.prg
* marked T054 as memory tests
* harbour/source/vm/hvm.c
* harbour/source/vm/thread.c
* added hb_threadOnce( @<onceControl> [, <bAction> ] ) -> <lFirstCall>
This function allow to execute some code only once. It's usefull in
MT environment for initialization.
<onceControl> is variable which holds the execution status and have
to be initialized to NIL. In most of cases it will be simple static
variable in user code.
<bAction> is optional codeblock which is executed only once (on 1-st
call with given <onceControl>)
* harbour/source/rtl/filesys.c
! do not make any file name conversions in hb_fsNameConv() if HVM stack
is not allocated
* harbour/source/rtl/gtcrs/gtcrs.c
* casting
* harbour/tests/speedtst.prg
+ added support for --scale switch - it enables special mode
which compare scalability, f.e.:
./speedtst --thread=4 --scale
executes each test loop 4 times by single thread then
by 4 simultaneous threads, counts total real times in both
cases and presents them with the scale factor.
Please note that exactly the same loop tests are executed
simultaneously so this test should well show all places which
are not well scalable.
This test allows me to locate yet another memory variable written by
each thread on each function call just like uiPolls in main HVM loop.
It's s_bDebugging which is not used in MT mode because we do not have
any MT debugger yet but is was effectively killing the scalability
in my hardware.
If possible I would like to see some Windows results from multi CPU
machine with --scale parameter, f.e.:
speedtst --thread=8 --scale > speedtst.log
Please make some tests.
* harbour/source/vm/hvm.c
% do not assign s_bDebugging in hb_vmDo()/hb_vmSend() when debugger
is not linked
* harbour/source/vm/garbage.c
% enabled spinlocks in all x86 GCC builds
* harbour/source/vm/fm.c
! do not build DL-MM when HB_FM_WIN32_ALLOC is set
* harbour/tests/speedtst.prg
+ added support for --exclude=<tests,...> option to exclude some tests,
f.e.:
./speetest --exclude=029.030.023.025.027.040.041.043.052.053.019.022.031.032
disables all tests which allocates memory. The same tests can be also
excluded by --exclude=mem
* source/vm/extrap.c
+ Now using standard internal error call for Windows too.
+ Implemented //BATCH for OS/2. (please test)
* source/rtl/errorint.c
* Upped internal buffer.
* contrib/hbole/oleauto.prg
* contrib/hbole/ole2.c
* contrib/hbwin/win_tole.prg
* contrib/hbwin/win_ole.c
* OLESHOWEXCEPTION() implemented on the .prg level, using
Alert() rather than MessageBox().
! All MessageBox()es converted to Alert()s.
+ Added OLEEXCEPTIONSOURCE(), OLEEXCEPTIONDESCRIPTION()
to hbole.
* source/vm/maindllp.c
! Changed MessageBox() call to internal error.
* contrib/gtwvg/gtwvg.c
* source/rtl/gtwvt/gtwvt.c
! Changed MessageBox() calls to internal error.
* contrib/gtwvg/gtwvg.c
* Internal error calls synced with GTWVT.
* source/rtl/hbgtcore.c
- Removed "Internal error" text from two internal error descriptions.
* make_vc.mak
- Removed reference to MessageBox() from comment.
; NOTE: No more MessageBox() calls in Harbour.
(except some wrappers for user .prg code)
* include/hbsetup.ch
! Removed some company names from comments.
* source/vm/extrap.c
+ Added //BATCH internal switch to indicate exception handler
to suppress the Windows exception dialog when an exception
occurs. Useful for programs running without user interaction.
NOTE: This may not be the ultimate method. If we can gather
more such situations where such "batch" mode might
be useful, we may as well implement it as a Set().
- Removed Harbour specific exception MessageBox(). Besides
having gotten rid of a MessageBox() call in core VM, Harbour now
got back the standard Windows error handling dialog, which is
more standard and easy to get by than the previous default
method, where several clicks were needed to pass through
the (sometimes hidden) popups. The details of all GPFs are
still logged into hb_out.log.
+ Removed size limit for the logged exception call stack.
* harbour/source/rdd/sdf1.c
! fixed stupid typo (missing !) in last modification which broke
SDF RDD read mode. Thanks to Marco for information and example.
* harbour/include/hbstack.h
* harbour/source/vm/estack.c
* small cleanup in used macros
* harbour/include/hbset.h
* harbour/source/vm/set.c
+ divided __SETCENTURY() PRG function into two functions:
__SETCENTURY() and public C function hb_setSetCentury()
to manipulate century setting from C code.
Modyfication by Francesco Saverio Giudice
* harbour/include/hbvm.h
* harbour/include/hbthread.h
* harbour/source/vm/hvm.c
* harbour/source/vm/thread.c
+ added hb_vmThreadRegister() funtion which allows to register new
thread in HVM without HVM stack allocation
+ added hb_vmThreadRelease() which removes registered thread which
does not have allocated HVM stack yet
+ added hb_threadStateNew() which returns new thread control state
which can be used as parameter to hb_vmThreadInit(),
hb_vmThreadRegister(), hb_vmThreadRelease()
* register thread control state also for main thread
Now hb_threadSelf() returns thread pointer also for main thread
! fixed possible race condition in hb_threadWaitForAll() and
hb_threadTerminateAll() by using hb_vmThreadRegister() before
starting thread.
* harbour/source/rtl/idle.c
* interrupt hb_idleSleep() on QUIT or BREAK requests
* harbour/tests/mt/mttest09.prg
* small cleanup
* harbour/source/vm/thread.c
* release thread return value when is retrieve
* harbour/common.mak
* harbour/source/rtl/Makefile
+ harbour/source/rtl/tthreadx.prg
+ added xBase++ compatible signal class
* harbour/source/rdd/wacore.c
! added missing alias setting after attaching work area
+ harbour/tests/mt/mttest09.prg
+ added test code for using the same work area in different threads
* harbour/include/hbstack.h
* harbour/source/vm/estack.c
+ added assembler inline macros for TLS access in BCC and MinGW32
They are enabled when Harbour is compiled with -DHB_NO_TLS.
Please check the speed difference. If it will be noticeable
then we keep them probably as default. Otherwise they will be
removed.
* source/vm/fm.c
+ Enabled dlmalloc (HB_FM_DL_ALLOC) for MSVC, BCC and MINGW builds.
; It's possible to disable dlmalloc with HB_FM_STD_ALLOC
for testing purposes.
* source/vm/vmmt/Makefile
! Possible fix for mingw build error:
make: *** mainstd: No such file or directory. Stop.
make[3]: *** [first] Error 2
make[2]: *** [first] Error 2
; Please review.
; TOFIX: These DLALLOC warnings are present with MinGW 4.3.2
In file included from ../../fm.c:127:
../../dlmalloc.c:1144: warning: ignoring #pragma warning
In file included from ../../fm.c:127:
../../dlmalloc.c: In function 'sys_alloc':
../../dlmalloc.c:3396: warning: statement with no effect
* tests/memtst.prg
+ Added #include "simpleio.ch" to allow output redirection.
* bin/bld.bat
* bin/bld_os2.cmd
* Removed any HB_GT_LIB "selection" logic. Selection is to
be done from source code, from now on all supported core GTs
are included in the lib list.
* Few other minor cleanups.
* source/vm/cmdarg.c
* Commented code turned into HB_C52_STRICT branch.
* source/vm/vmmt/Makefile
! Fixed cemgw -> mingwce
* config/dos/global.cf
* config/os2/global.cf
* config/w32/global.cf
% Removed unnecessary logic to select default GT. This is
done in Harbour source code now.
; TOFIX: After MT changes, mingw32 build gives this new error:
make: *** mainstd: No such file or directory. Stop.
make[3]: *** [first] Error 2
make[2]: *** [first] Error 2
* source/vm/extrap.c
! Fixed to close .log file before showing MessageBox().
[TOMERGE 1.0]
+ Don't attempt to write into .log file if the _SET_HBOUTLOG
filename is empty.
; TOFIX: Remove all remaining MessageBox() calls from
Harbour sources.
* contrib/rddads/adsmgmnt.c
! Blind fix to ADSMGGETWORKERTHREADACTIVITY() where the
first element in list wasn't returned.
Please test, I couldn't.
* source/vm/fm.c
! Stupid typo. (I guess I'm completely confused by separated
"#" and preprocessor command :/ Second typo in two lines.)
* harbour/source/vm/codebloc.c
* updated old and not longer valid comment
* harbour/source/vm/memvars.c
* minor code formatting
* harbour/source/common/expropt2.c
! fixed bug in power math expression optimization caused
by two lines left in the code by mistake. Many thanks to
Maurilio for locating the problem.
* harbour/include/hbstack.h
* harbour/source/vm/estack.c
* harbour/source/vm/hvm.c
% added support for buffering hb_stack TLS access be preloading
the stack pointer into C stack function local variables.
Please make speed tests for MT mode with different C compilers
and different platforms.
* source/vm/fm.c
! Enabled USE_DL_PREFIX for _MSC_VER compilers.
This may be refined, but without this setting MSVS 2008
would give an error on exit and GPF.
* harbour/ChangeLog
! corrected previous ChangeLog entry: instead of hb_waDetach()/
hb_waRequest() should be db_dbDetach()/hb_dbRequest()
* harbour/source/vm/hvm.c
* disabled PRG tracing in default builds. If someone wants to
use this feature then he should recompile Harbour with HB_PRG_TRACE
macro. In such case tracing can be enabled/disabled by __TRACEPRGCALLS()
function. HB_NO_TRACE macro is not longer usable - it's default in
current code.
* harbour/source/vm/classes.c
+ added PRG function __clsPreallocate() which extends the size of
classes buffer to given value to avoid later RT reallocations.
It may be useful in some very seldom cases for MT programs which
will allocate dynamically at runtime more then 16386 classes.
In practice rather impossible though who knows ;-)
* harbour/source/rdd/workarea.c
* set default preallocation size for RDD nodes to 128
+ added PRG function __rddPreallocate() which extends the size of
RDD nodes buffer to given value to avoid later RT reallocations.
It may be useful in some very seldom cases for MT programs which
will register dynamically at runtime more then 128 RDDs when other
threads are active and may use RDD nodes.
* harbour/include/hbrddcdx.h
* harbour/source/rdd/dbfcdx/dbfcdx1.c
+ added ORDLSTDELETE() method.
Now ordbagClear() should work for DBFCDX.
* harbour/include/hbstack.h
* harbour/source/vm/estack.c
+ added support for using stack macros without native compiler TLS
support in MT mode.
* enabled stack macros by default for OS2 MT builds
David, if possible please try speedtst.prg with current MT HVM