eb214d1e4b7f5665ce46ba1e85594de5027af488
62 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
bdc6e81793 |
2009-02-13 11:08 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbpp.h
* harbour/source/pp/hbpp.c
* harbour/source/pp/ppcore.c
* harbour/source/compiler/hbmain.c
+ added support for dynamically calculated #define results
! removed old code which was adding __FILE__ #define constant
It was not working correctly like in other compilers ignoring
#include
+ added __FILE__ and __LINE__ #define directives using dynamically
calculated results - now it works as expected respecting #include
directives and the implementation is local to PP without any hacks
in core compiler code.
* harbour/contrib/hbct/files.c
* added support for optional milliseconds part in HB_FSETDATETIME()/
HB_FGETDATETIME().
* harbour/source/rtl/philes.c
! minor fix in return value
|
||
|
|
1e894d019e |
2009-02-06 18:46 UTC+0100 Viktor Szakats (harbour.01 syenar hu)
* include/hbdefs.h
+ Added HB_ISALNUM() macro.
* include/hbpp.h
* include/hbapicdp.h
* contrib/hbct/pos1.c
* contrib/hbct/ascpos.c
* contrib/xhb/hbxml.c
* contrib/hbtip/utils.c
* contrib/examples/pp/hbppcore.c
* source/vm/itemapi.c
* source/vm/memvars.c
* source/vm/set.c
* source/vm/classes.c
* source/debug/dbgentry.c
* source/common/hbstr.c
* source/common/expropt2.c
* source/rtl/strcase.c
* source/rtl/cdpapi.c
* source/rtl/is.c
* source/rtl/transfrm.c
* source/rtl/dates.c
* source/rtl/natmsg.c
* source/rtl/soundex.c
* source/rtl/hbffind.c
* source/rdd/workarea.c
* source/compiler/hbmain.c
* source/compiler/harbour.yyc
* source/compiler/harbour.y
* Replaced:
isdigit() -> HB_ISDIGIT()
isalpha() -> HB_ISALPHA()
isalnum() -> HB_ISALNUM()
isupper() -> HB_ISUPPER()
islower() -> HB_ISLOWER()
tolower() -> HB_TOLOWER()
toupper() -> HB_TOUPPER()
* source/rtl/natmsg.c
! Fixed to use CP sensitive case conversion in
__NATISNEGATIVE() and __NATISAFFIRM().
* source/rtl/is.c
! Fixed typo in recently added hb_charIsUpper()/hb_charIsLower()
functions.
; TODO: Remove DJGPP to*() hack.
; TODO: Replace HB_PP_UPPER(), HB_PP_ISDIGIT() with equivalent
new macros.
; TOFIX: Some of the above macros should better be replaced
by CP sensitive versions. F.e. the one in hbtip.
; TOFIX: Remove remaining #include <ctype.h> lines.
|
||
|
|
50083b874c |
2009-02-04 23:39 UTC+0100 Viktor Szakats (harbour.01 syenar hu)
* source/compiler/cmdcheck.c
* source/compiler/hbmain.c
* source/compiler/hbusage.c
* Minor rename.
|
||
|
|
6054f2132d |
2009-01-22 18:20 UTC+0200 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt)
* harbour/source/compiler/hbmain.c
* harbour/source/pp/hbpp.c
* harbour/source/pp/ppcore.c
+ added __FILE__ define for .prg code
; Please, look if this is implemented the right and optimal way.
I'm a little confused about PP initialization order, and how
__DATE__, etc, survive after hb_pp_reset in compiler.
|
||
|
|
61ac0ae0b4 |
2009-01-15 03:20 UTC+0200 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt)
* harbour/include/hbcomp.h
* harbour/include/hbcompdf.h
* harbour/include/hbexprb.c
* harbour/source/compiler/harbour.y
* harbour/source/compiler/harbour.yyc
* harbour/source/compiler/harbour.yyh
* harbour/source/compiler/hbcomp.c
* harbour/source/compiler/hbmain.c
* removed global variables HB_COMP_PARAM->cVarType, ->szFromClass
|
||
|
|
7a7a4856c9 |
2008-12-30 12:02 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbcomp.h
* harbour/include/hbcompdf.h
* harbour/include/hbexprb.c
* harbour/source/common/expropt2.c
* harbour/source/compiler/hbmain.c
* harbour/source/compiler/hbcomp.c
* harbour/source/compiler/harbour.y
* harbour/source/compiler/harbour.yyc
! fixed <cConst1> == <cConst2> => <lConst> optimizations if
<cConst1> or <cConst2> contains valid ¯o. Such expressions
cannot be optimized if -kM compiler switch is not used, f.e.:
M->V := "ABC"
? "[&V]" == "[ABC]"
! fixed <cConst1> $ <cConst2> => <lConst> optimizations if
<cConst1> or <cConst2> contains valid ¯o. Such expressions
cannot be optimized if -kM compiler switch is not used, f.e.:
M->V := "ABC"
? "[&V]" $ " [ABC] "
% do not disable <cConst1> + <cConst2> => <cConst> and
<cConst1> - <cConst2> => <cConst> optimization when <cConst1> or
<cConst2> contains valid ¯o but -kM compiler switch is used.
* harbour/include/hbexprb.c
* cover ! ! <exp> => <exp> optimization by -ko compile time switch
* harbour/doc/cmpopt.txt
* updated compiler optimization description
|
||
|
|
89a6b920b4 |
2008-12-18 15:30 UTC+0200 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt)
* include/hbcomp.h
* source/compiler/hbmain.c
* source/compiler/hbopt.c
! fixed warnings of last commit
* contrib/hbpgsql/tpostgre.prg
! fixed assigned but not used variable
|
||
|
|
dde57c5c70 |
2008-12-18 05:02 UTC+0200 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt)
* include/hbclass.ch
* include/hbcomp.ch
* include/hberrors.h
* include/hbgenerr.c
* include/hbmain.c
* include/hbopt.c
+ PCode optimizations:
1) Self := QSELF(), Self:method -> QSELF():method
2) Declared, but unused variables are removed from code
These optimizations are enabled if jump optimizations are enabled.
+ added recursive pcode tree tracer. It is capable to generate new
warning: Variable %s is assigned, but not used.
Warning is not generated in these cases:
1) unoptimal Self := QSELF() pcode [generated by preprocessor rules]
2) if variable name starts with '_nowarn_'. This allows to
suppress warning in case unoptimal pcode is generated by
preprocessor rules
3) assigned value is NIL. This let us force garbage collection
using oVar := NIL
Warning has warning level 3.
; NOTE: if you are using -w3 -es2 in makefiles, you'll need to fix your
redundant code to compile the project
* source/rtl/achoice.prg
* source/rtl/browse.prg
* source/rtl/tbrowse.prg
* source/rtl/teditor.prg
* source/rtl/tget.prg
* source/rtl/tgetlist.prg
* source/rtl/tlabel.prg
* source/rtl/tmenusys.prg
* source/rtl/tpersist.prg
* source/rtl/treport.prg
* source/debug/dbgtmenu.prg
* source/debug/debugger.prg
* source/debug/dbgtobj.prg
* fixed 'assigned but not used' warnings
* utils/hbdoc/hbdoc.prg
* utils/hbdoc/genasc.prg
* utils/hbdoc/genhpc.prg
* utils/hbdoc/genhtm.prg
* utils/hbdoc/genchm.prg
* utils/hbdoc/genng.prg
* utils/hbdoc/genos2.prg
* utils/hbdoc/genrtf.prg
* utils/hbdoc/gentrf.prg
* utils/hbdoc/ft_funcs.prg
* utils/hbmake/hbmake.prg
* #pragma -w2
; NOTE: I've been fixing warnings in utils/hbdoc/* for 2 hours,
but only fixed half of files. There are a lot of garbage code here.
I do not thing this code is working...
I used fallback method: restored original files and used -w2
; NOTE: hbmake.prg has about 140 unused assignments.
I've also fallback to -w2, because some of unused code is complex,
ex., ASCAN() with block parameters. I'm not using hbmake, and I'm
affraid to break something important.
* compiler/hbpcode.c
- removed Ron's copyright on hb_compStrongType(). We do not have this
functions in the compiler at all. I guess this text is just a result
of .c header copy-paste from xHarbour's hbstrong.c some time ago.
|
||
|
|
fa31aa6f70 |
2008-12-11 19:48 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbthread.h
* harbour/source/vm/thread.c
+ added hb_atomic_set(), hb_atomic_get(), hb_atomic_inc() and
hb_atomic_dec() functions which operates on HB_COUNTER or smaller
type if it's necessary for some platforms which can be access/assign
increment/decrement in MT safe atom operations.
hb_atomic_dec() returns true if counter is 0 after decrementation
* harbour/include/hbatomic.h
! fixed compilation in Linux and OpenWatcom
* harbour/include/hbapiitm.h
* harbour/source/rtl/itemseri.c
+ make hb_itemSerialize() and hb_itemDeserialize() public functions
! fixed serialization items with internal item references
* harbour/source/vm/hvm.c
* release memvars after closing RDDs
* harbour/source/debug/dbgentry.c
! fixed buffer overflow reported by Rodrigo
* harbour/source/vm/macro.c
* harbour/source/compiler/hbmain.c
* formatting
* harbour/include/hbexprb.c
! fixed wrongly recognized functions with HB_I18N_ prefix as
HB_I18N_GETTEXT()
* harbour/include/hbapi.h
* harbour/include/hbstack.h
* harbour/include/hbthread.h
* harbour/source/vm/estack.c
* harbour/source/vm/thread.c
* harbour/source/vm/hvm.c
+ added support for I18N in HVM.
Each thread can have it's own i18n set.
When new thread is created then it inherits i18n set from parent
thread and both uses the same set (please remember about it if you
will want to make some direct modifications on active i18n set
internals).
When thread change active i18n set then it effects only this thread
and new threads which will be create later. It does not change i18n
in other existing threads.
+ added functions to set/get pointer to active i18n set in HVM
void * hb_vmI18N( void )
void hb_vmSetI18N( void * )
* harbour/include/hbapi.h
* harbour/source/rtl/hbi18n.c
+ added i18n module. Now only for internal Harbour usage without support
for optional switching to alternative implementations.
I'll add such functionality later when I will work on native gettext
support.
The following public .prg functions has been added:
HB_I18N_GETTEXT[_STRICT]( <cMsgID> [, <cContext> ] )
-> <cTranslatedMsgID> | <cMsgID>
HB_I18N_NGETTEXT[_STRICT]( <nValue>, <cMsgID> | <acMsgID> ;
[, <cContext> ] )
-> <cTranslatedMsgID> | <cMsgID> | <acMsgID>[ <nIndex> ]
This is minimal support necessary for .prg code which has to exists
in each i18n module working with Harbour.
The following functions had been added as public C API:
PHB_ITEM hb_i18n_gettext( PHB_ITEM pMsgID, PHB_ITEM pContext )
PHB_ITEM hb_i18n_ngettext( PHB_ITEM pNum,
PHB_ITEM pMsgID, PHB_ITEM pContext )
The following functions had been added as private HVM C API:
void hb_i18n_init( void )
void hb_i18n_exit( void )
void hb_i18n_release( void * cargo )
void * hb_i18n_alloc( void * cargo )
They have to be supported by alternative i18n modules
The following functions has been added to manage Harbour i18n
translations sets:
HB_I18N_CREATE()
-> <pI18N>
Creates new empty I18N translation set
HB_I18N_CODEPAGE( [<pI18N>,] [<cNewCP>], [<lBase>], [<lTranslate>] )
-> <cOldCP>
Gets or sets Harbour codepage used by translation set
<pI18N> - I18N translation set,
if it's not given then currently active I18N set is used
<cNewCP> - new CP ID. Must be linked with application
<lBase> - when it's .T. then get/set base massages CP instead of
translated massages CP
<lTranslate> - if it's .T. then translate base (<lBase>==.T.) or
final messages in I18N set from previous CP to
given one. Base messages translation in synced
with context ID translation.
HB_I18N_PLURALFORM( [<pI18N>,] [<cNewForm>|<bNewForm>], [<lBase>] )
-> <cOldForm>|<bOldForm>
Gets or sets plural form used for final or base messages
<pI18N> - I18N translation set,
if it's not given then currently active I18N set is used
<cNewForm> - language ID of plural form, f.e.: "EN", "PL", "LT".
Now only three above are supported. Please add rules
for other languages to source/rtl/hbi18n.c.
<bNewForm> - codeblock used to calculate plural form indexes.
can be used instead of character representation but
it's not storred in serialized I18N set
<lBase> - when it's .T. then get/set base massages plural form
instead of translated massages one.
HB_I18N_DESCRIPTION( [<pI18N>,] [<cNewDescription>] )
-> <cOldDescription>
Gets or sets translation set description. After serialization
up to 32 bytes is stored in header which can be easy used to
determinate type of translation file.
<pI18N> - I18N translation set,
if it's not given then currently active I18N set is used
<cNewDescription> - new description
HB_I18N_ADDTEXT( <pI18N>, <cMsgID>, <cTrans> | <acTrans> [, <cContext> ] )
-> NIL
Adds new message with translation to i18n translation set
<pI18N> - I18N translation set
<cMsgID> - original message
<cTrans> - translated message
<acTrans> - array with translated messages used for plural forms
<cContext> - message context
HB_I18N_SET( [ <pI18N> | NIL ] )
-> <lActive>
Sets given I18N translation set as default one used by
HB_I18N_[N]GETTEXT[_STRICT]() functions or remove translation
set for calling thread when passed parameter is NIL
<pI18N> - I18N translation set
Returns logical value which is .T. when i18n set is active
HB_I18N_SAVETABLE( [<pI18N>] )
-> <cTable>
Returns I18N translation as string item which can be stored
in file or database
<pI18N> - I18N translation set, if it's not given then currently
active I18N set is used
HB_I18N_RESTORETABLE( <cTable> )
-> <pI18N> | NIL
Restores I18N translation set from strin item.
<cTable> - I18N translation set in string representation
On success it returns new <pI18N> set otherwise NIL if <cTable>
is not valid item created by HB_I18N_SAVETABLE() or it's corrupted.
HB_I18N_HEADERSIZE()
-> <nHeaderSize>
Returns size of header used by i18n serialized version
HB_I18N_CHEK( <cTable> | <cHeader> [, @<cDescription> ] )
-> <lValid>
<cTable> - i18n translation set serialized by HB_I18N_SAVETABLE
<cHeader> - header of i18n translation set
( LEFT( <cTable>, HB_I18N_HEADERSIZE() )
<cDescription> - optional parameter passed by reference where
will be sored i18n translation set description
extracted from valid header
Returns logical value indicating if given table or header is
valid serialized by HB_I18N_SAVETABLE() data. It does not
decode the table though it validates size and control sums.
These functions are optional and some future alternative implementations
may not support all of them and/or may provide some other functions.
+ added unofficial .prg function __I18N_HASHTABLE() which allows to
access hash table used by i18n translation set or create new translation
set with given hash table. It's helper functions for developers which
will work on Harbour i18n tools and should not be used by Harbour users.
Unlike original gettext Harbour allows to use language with many
plural forms as base one. In such case programmer should activate
at application startup default i18n translation set with base plural
form valid for base application language, f.e. by:
pI18N := hb_i18n_create()
hb_i18n_pluralForm( pI18N, <cLangID> | <bForm>, .t. )
hb_i18n_set( pI18N )
.prg code example:
#xtranslate _( <x,...> ) => hb_i18n_gettext_strict( <x> )
#xtranslate _N( <x,...> ) => hb_i18n_ngettext_strict( <x> )
proc main()
local pI18N, i
pI18N := hb_i18n_create()
hb_i18n_pluralForm( pI18N, "PL", .t. )
hb_i18n_set( pI18N )
for i := 0 to 30
? i, _N( i, {"grosz", "grosze", "groszy"} )
if i > 0 .and. i % 10 == 0
wait
endif
next
return
In .pot files created during compilation by Harbour with -j option
for above code we have the following entries for message with plural
forms:
msgid "grosz"
msgid_plural "grosze"
msgid_plural2 "groszy"
msgstr[0] ""
The msgid_plural2 (and others if language has more plural forms)
is Harbour extension which is not gettext compatible.
The above implementation is base version but should be fully functional.
Now we will need functions to safe/read i18n files and tools to mange
.pot files: merge them, edit translations, create final binary i18n
translation sets. Because we are using gettext compatible .pot files
then for some of such jobs we can use original gettext tools but we
need at least function which will create translation set from one or
more .pot files.
We should also agree some default localization(s) for files containing
translated data, their name convention and environment variable(s)
to set default language. It's not strictly necessary and each user
can have his own implementation but it would help in adding new
translations by final users to any Harbour application which will
respect them. We can use LANG envvar to extract preferred language
and use the same path as executed application looking for files
<appname>-<lang>.hil files though it may create some problems for
OSes which support only 8.3 file names so we can also define that
HB_I18N envvar has higher priority and points to expected translation
file.
* harbour/include/hbextern.ch
- removed old __i18n_*() functions
+ added current i18n functions
|
||
|
|
16f9a67e9f |
2008-12-02 11:27 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/contrib/xhb/Makefile
* harbour/contrib/xhb/common.mak
+ harbour/contrib/xhb/xhbarr.c
+ added aSplice(), aRemove() and aMerge() functions - code borrowed
from xHarbour by Ron Pinkas.
! fixed GPF trap in these functions
* harbour/contrib/xhb/xhbfunc.c
+ added CSTR()
* harbour/contrib/xhb/hbcompat.ch
! changed name of xHarbour include files - they where changed few
months ago and now they are the same as in Harbour.
To xHarbour users: please update hbcompat.ch in xHarbour CVS
* harbour/contrib/xhb/filestat.c
! fixed UNICODE compilation
* harbour/contrib/xhb/hblognet.prg
* harbour/contrib/xhb/hblog.prg
* formatting
* harbour/contrib/hbnf/tempfile.prg
! do not use HB_ISBYREF() .prg function - this function does not
exist in Harbour and does not work correctly in xHarbour
* harbour/include/hbapiitm.h
* harbour/source/vm/macro.c
* harbour/source/vm/codebloc.c
* harbour/source/vm/hashes.c
* harbour/source/vm/garbage.c
* harbour/source/vm/itemapi.c
* harbour/source/vm/memvars.c
* cleanup
* harbour/contrib/gtwvg/Makefile
! fixed typo
* harbour/contrib/gtwvg/hbgtwvg.ch
* added new line at the end of file and changed non ANSI C // comments
to /* */ - this file is included by C code too.
* harbour/contrib/gtwvg/wvgwin.c
* harbour/contrib/gtwvg/wincallb.c
* pacified some warnings and fixed possible access to uninitialized data
* harbour/source/compiler/harbour.y
* harbour/source/compiler/harbour.yyc
! fixed possible double freeing of memory blocks in #line directives
TOMERGE[1.0]
* harbour/common.mak
* harbour/source/compiler/hbmain.c
+ harbour/source/compiler/compi18n.c
* moved hb_compI18n*() functions to separate file covered by GPL with
Harbour exception - Thank to Mindaugas
* harbour/include/hbcomp.h
* harbour/include/hbcompdf.h
* harbour/include/hbexpra.c
* harbour/include/hbexprop.h
* harbour/include/hbexprb.c
* harbour/source/common/expropt1.c
* harbour/source/compiler/Makefile
* harbour/source/compiler/ppcomp.c
* added support for plural forms:
hb_i18n_ngettext[_noop|_strict]( <nExp>, <cText> | <acText> ;
[, <cContext> )
<acText> is accepted only as array of literal strings even if
_strict suffix is missing - if it's a problem then we can change it.
hb_i18n_ngettext_noop() is reduced only when it has valid parameters
The default plural index expression used for reduction at compile
time is: iif( <nExp> == 1, 1, 2 )
If second parameter of hb_i18n_ngettext_noop() is <cText> or <acText>
length is 1 then it's reduced to <cText> or acText[1] else if second
parameter is <acText> with more then 1 item then it's reduced to
<acText>[ iif( <nExp> == 1, 1, 2 ) ]
and if <nExp> is literal numeric expression is farther reduced to
given array item. Otherwise is not reduced and warning is generated.
The plural forms in .pot files are generated as:
msgid ""
msgid_plural ""
msgid_plural2 ""
[...]
msgid_pluralN ""
msgstr[0] ""
Then real message ID is only msgid (with context if any) and
msgid_plural* is used only for information. When the same msgid
is used more then once in different hb_i18n_ngettext*() calls then
plural messages are merged.
Please remember that for strict gettext compatibility only two plural
forms are allowed.
* extended i18n warnings for simple types validation, f.e.:
hb_i18n_gettext( .t. )
* do not generate empty .pot file when source code does not contain any
hb_i18n_*() functions
* store in .pot files references to real source file names with paths
respecting #include directives
* use hb_compIdentifierNew() to hash i18n messages at compile time
! fixed possible bad escape encoding of i18n strings
+ added support to control -j[01] flag using #pragma directive
Before I'll begin to work on runtime support please test these
modifications and inform me about problems you can see with the
above version and missing functionality.
|
||
|
|
c4636942ec |
2008-10-27 21:43 UTC+0200 Viktor Szakats (harbour.01 syenar hu)
* contrib/Makefile
* contrib/make_vc_all.bat
* contrib/make_b32_all.bat
* contrib/make_gcc_all.sh
+ Added rddsql to default builds.
Please test.
* contrib/hbdbgfx/dbgfxc.c
* Added TODO. (multiplatform support in one the functions)
* include/hbsetup.h
* include/hbexprb.c
* contrib/hbct/ctnet.c
* contrib/hbct/color.c
* contrib/hbct/dattime2.c
* contrib/xhb/hboutdbg.c
* contrib/hbtpathy/tpwin32.c
* contrib/hbmzip/hbmzip.c
* contrib/hbsqlit3/hbsqlit3.c
* contrib/hbfbird/firebird.c
* contrib/hbziparc/hbzipcpp.old
* contrib/hbnf/getver.c
* contrib/hbpgsql/postgres.c
* contrib/hbclipsm/gauge.c
* contrib/rddads/adsfunc.c
* contrib/rddads/ads1.c
* contrib/hbgd/gdwrp.c
* contrib/hbmisc/spd.c
* contrib/hbtip/utils.c
* contrib/hbwin/win_prt.c
* contrib/examples/pp/hbppcore.c
* contrib/examples/pp/hbppcomp.c
* source/pp/pplib.c
* source/pp/ppcore.c
* source/pp/hbpp.c
* source/vm/estack.c
* source/vm/debug.c
* source/vm/itemapi.c
* source/vm/hvm.c
* source/vm/cmdarg.c
* source/vm/fm.c
* source/vm/extrap.c
* source/vm/classes.c
* source/main/harbour.c
* source/common/hbver.c
* source/common/hbverdsp.c
* source/common/hbstr.c
* source/common/hbdate.c
* source/rtl/gtxwc/gtxwc.c
* source/rtl/hbgtcore.c
* source/rtl/gtcrs/gtcrs.c
* source/rtl/errorint.c
* source/rtl/gtsln/gtsln.c
* source/rtl/gttrm/gttrm.c
* source/rtl/gtpca/gtpca.c
* source/rtl/fkmax.c
* source/rtl/langapi.c
* source/rtl/hbffind.c
* source/rdd/workarea.c
* source/rdd/sdf1.c
* source/rdd/delim1.c
* source/rdd/dbf1.c
* source/rdd/wafunc.c
* source/compiler/hbmain.c
* source/compiler/cmdcheck.c
* source/compiler/hbpcode.c
* source/compiler/genhrb.c
* source/compiler/gencobj.c
* source/compiler/genobj32.c
* source/compiler/genc.c
* source/compiler/hbusage.c
* source/compiler/hbfunchk.c
* source/compiler/hbgenerr.c
* utils/hbmake/hbmgauge.c
* Changed snprintf() calls to hb_snprintf().
; TODO: Finish the mappings in headers.
* tests/wvtext.prg
* include/inkey.ch
* source/rtl/gtwvt/gtwvt.c
* Changed K_HB_RESIZE to HB_K_RESIZE. The reason is
that we already got a HB_K_MULTICODE code (few lines
below, I didn't know about it before), and it's better
to keep consistency with that.
|
||
|
|
cb836d8481 |
2008-10-09 14:11 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* 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
|
||
|
|
953208bbe1 |
2008-10-09 03:26 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbcompdf.h
* harbour/source/compiler/hbmain.c
% do not add dummy entries to symbol table for functions declared
as dynamic - it allows to include hbdynamic.ch with list of all
supported functions by application and/or harbour.dll to any .prg
file which will be used to create shared library (.dll, .so, ...)
without any memory overhead.
* harbour/source/compiler/genc.c
% do not generate unnecessary HB_FUNC_EXTERN() declarations for
function declared as DYNAMIC
|
||
|
|
86333ba271 |
2008-09-18 07:21 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbthread.h
* use assembler version of atomic inc/dec operation in all x86 based
GCC builds - it should noticeable improve OS2 MT build speed,
please test.
* harbour/include/hbcomp.h
* harbour/include/hbapicdp.h
* harbour/include/hbcompdf.h
* harbour/include/hbgtcore.h
* harbour/include/hbapifs.h
* harbour/include/hbwince.h
* harbour/include/hbexpra.c
* harbour/include/hbexprop.h
* harbour/include/hbmacro.h
* harbour/include/hbapigt.h
* harbour/include/hbapi.h
* harbour/include/hbapiitm.h
* harbour/include/hbexprb.c
* harbour/source/pp/ppcore.c
* harbour/source/pp/hbpp.c
* harbour/source/vm/macro.c
* harbour/source/vm/cmdarg.c
* harbour/source/vm/arrays.c
* harbour/source/vm/extrap.c
* harbour/source/vm/memvars.c
* harbour/source/vm/eval.c
* harbour/source/vm/extend.c
* harbour/source/vm/set.c
* harbour/source/main/harbour.c
* harbour/source/common/hbfsapi.c
* harbour/source/common/reserved.c
* harbour/source/common/expropt1.c
* harbour/source/macro/macro.yyc
* harbour/source/macro/macro.y
* harbour/source/macro/macro.yyh
* harbour/source/macro/macrolex.c
* harbour/source/rtl/gtdos/gtdos.c
* harbour/source/rtl/gtwin/gtwin.c
* harbour/source/rtl/gtxwc/gtxwc.c
* harbour/source/rtl/gtos2/gtos2.c
* harbour/source/rtl/hbgtcore.c
* harbour/source/rtl/cdpapi.c
* harbour/source/rtl/gtcrs/gtcrs.c
* harbour/source/rtl/hbtoken.c
* harbour/source/rtl/gtchrmap.c
* harbour/source/rtl/gtstd/gtstd.c
* harbour/source/rtl/gtsln/mousesln.c
* harbour/source/rtl/gtsln/gtsln.c
* harbour/source/rtl/gtsln/kbsln.c
* harbour/source/rtl/gttrm/gttrm.c
* harbour/source/rtl/gtpca/gtpca.c
* harbour/source/rtl/hbhex.c
* harbour/source/rtl/gtgui/gtgui.c
* harbour/source/rtl/gt_tpl/gt_tpl.c
* harbour/source/rtl/gtcgi/gtcgi.c
* harbour/source/rtl/gtwvt/gtwvt.c
* harbour/source/rtl/strtran.c
* harbour/source/rtl/hbinet.c
* harbour/source/rtl/gtapi.c
* harbour/source/rtl/filesys.c
* harbour/source/rdd/dbfntx/dbfntx1.c
* harbour/source/rdd/dbsql.c
* harbour/source/rdd/dbfcdx/dbfcdx1.c
* harbour/source/rdd/dbffpt/dbffpt1.c
* harbour/source/rdd/hbsix/sxfname.c
* harbour/source/compiler/ppcomp.c
* harbour/source/compiler/hbmain.c
* harbour/source/compiler/cmdcheck.c
* harbour/source/compiler/hbdbginf.c
* harbour/source/compiler/genc.c
* harbour/source/compiler/hbident.c
* harbour/source/compiler/hbusage.c
* harbour/source/compiler/gencc.c
* harbour/source/compiler/harbour.yyc
* harbour/source/compiler/harbour.y
* harbour/contrib/gtalleg/gtalleg.c
* harbour/contrib/hbct/charlist.c
* harbour/contrib/hbct/charmix.c
* harbour/contrib/hbct/screen1.c
* harbour/contrib/hbct/atrepl.c
* harbour/contrib/xhb/hboutdbg.c
* harbour/contrib/xhb/hbxml.c
* harbour/contrib/xhb/hbxml.h
* harbour/contrib/hbgt/strexpan.c
* harbour/contrib/hbsqlit3/sqlite3/sqlite3.c
* harbour/contrib/gtwvg/gtwvg.c
* harbour/contrib/hbclipsm/status.c
* harbour/contrib/hbclipsm/gauge.c
* harbour/contrib/hbmisc/stringsx.c
* harbour/contrib/hbtip/utils.c
* harbour/contrib/hbgf/hbgfgtk/msginfo.c
* harbour/contrib/hbgf/hbgfgtk/harbgtk.h
* harbour/contrib/hbbmcdx/bmdbfcdx.c
* harbour/utils/hbmake/hbmgauge.c
* use const char * instead of char * in places which should be marked
as const
|
||
|
|
64f97582d9 |
2008-09-13 18:49 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbpp.h
* harbour/include/hbvm.h
* harbour/include/hbcomp.h
* harbour/include/hbcompdf.h
* harbour/include/hbtrace.h
* harbour/include/hbapilng.h
* harbour/include/hbinit.h
* harbour/source/rtl/langapi.c
* harbour/source/pp/ppcore.c
* harbour/source/pp/hbpp.c
* harbour/source/vm/itemapi.c
* harbour/source/vm/hvm.c
* harbour/source/common/hbver.c
* harbour/source/common/hbtrace.c
* harbour/source/common/expropt2.c
* harbour/source/compiler/complex.c
* harbour/source/compiler/hbident.c
* harbour/source/compiler/hbfunchk.c
* changed some declarations from 'char *' to 'const char *' and
fixed casting for some more pedantic compilers
* harbour/source/pp/ppcore.c
! fixed one typo which could cause memory leak and even GPF
* harbour/common.mak
* harbour/source/vm/Makefile
* harbour/source/rtl/Makefile
- harbour/source/rtl/set.c
+ harbour/source/vm/set.c
* harbour/include/hbstack.h
* harbour/source/vm/estack.c
* moved from RTL to HVM
* eliminated hb_set global structure
* moved set structure to HVM stack
+ added internal function hb_setClone() which is used to create
copy of SET structure for child threads
* hidden HB_SET_STRUCT declaration - 3-rd part code must not access it
directly. Dedicated hb_set*() functions should be used instead.
+ added new function:
BOOL hb_setSetItem( HB_set_enum set_specifier, PHB_ITEM pItem )
which allow to change some set by 3-rd party code.
TODO: not all SETs can be changed yet - if someone have a while
then please add code for missing ones.
* harbour/include/set.ch
* harbour/include/hbset.h
+ added _SET_CODEPAGE which works like _SET_LANGUAGE giving common
interface
* harbour/include/hbsetup.h
+ added HB_CODEPAGE_DEFAULT which works like HB_LANG_DEFAULT
* harbour/source/vm/hvm.c
! fixed builds which uses non EN lang or code page modules
by forcing linking the chosen ones
* harbour/include/hbstack.h
* harbour/source/vm/estack.c
* harbour/include/hbapicdp.h
* harbour/source/rtl/cdpapi.c
- removed global code page variable: hb_cdp_page and moved
code page settings to HVM stack
+ added new function hb_cdpID() which returns current code page
character ID
+ added new functions hb_vmCDP() and hb_vmSetCDP() to get/set
active for given thread code page structure
* harbour/include/hbstack.h
* harbour/source/vm/estack.c
* harbour/include/hbapilng.h
* harbour/source/rtl/langapi.c
+ moved lang setting to HVM stack
+ added new functions hb_vmLang() and hb_vmSetLang() to get/set
active for given thread language module
* harbour/include/hbvmpub.h
* harbour/include/hbstack.h
* harbour/include/hbapi.h
* harbour/source/vm/estack.c
* harbour/source/vm/dynsym.c
* harbour/source/vm/itemapi.c
* harbour/source/vm/memvars.c
* changed memvar handles for HB_HANDLE to void * which is directly
casted to PHB_ITEM - new memvar references
* changed HB_DYNS declarations for MT mode. In MT mode HB_DYNS does
not contain area and memvar handles which are moved to thread
local HVM stack
+ added array for thread local memvar and area handles to HVM stack
% eliminated global continues array with all memvars and detached locals
% changed HB_IT_MEMVAR to use pointers to HB_ITEM directly - it resolve
synchronization problems in MT mode and should also improve the speed
and reduce memory usage. It should be well visible in applications which
uses lot of detached locals.
- removed hb_memvarsInit() and hb_memvarsFree() - they are not necessary
now because we do not longer use array with all allocated memvars
and detached local and private stack initialization is made
automatically
+ added internal functions hb_dynsymGetMemvar()/hb_dynsymSetMemvar()
+ added hb_memvarGetValueBySym() for debugger
* moved PRIVATE variable stack to HVM stack
* eliminated all static variables in memvars module
* harbour/include/hbstack.h
* harbour/source/vm/estack.c
* harbour/source/rtl/fserror.c
* moved IO errors to HVM stack
+ added special IO error handling which works without HVM stack
It allows to use hb_fs*() functions without allocated stack
by 3-rd party threads.
* harbour/source/rtl/filesys.c
* moved hb_fsCurDir() to HVM stack with special handling to work
with HVM stack like IO errors
* harbour/source/rdd/workarea.c
* allocated RDD node array in bigger peaces to reduce later RT
reallocations in MT mode. If user want to add dynamically more
then 64 RDDs then it should synchronize this operation himself.
* harbour/source/rdd/wacore.c
* moved WA list, current WA, default RDD and neteer() flag to HVM stack
* harbour/include/hbdefs.h
- removed HB_HANDLE declaration
* harbour/include/hbapi.h
- removed HB_VALUE structure - it's not longer used due to different
memvar handling
* updated hb_struMemvar to new memvar handling
* replaced hb_vmIsLocalRef() and hb_memvarsIsMemvarRef() with
hb_vmIsStackRef() which respect multiple stack and new memvar
and static structures and location in GC mark pass.
* harbour/include/hbstack.h
* harbour/source/vm/estack.c
* harbour/source/vm/hvm.c
+ added support for thread specific data located on HVM stack
Now it's possible to allocate static variables which are
local to thread. Such variables are allocated on HVM stack
and automatically destroyed. To declare new TSD variable use:
HB_TSD_NEW( <name>, <size>, <init>, <destruct> )
<name> - name of variable which holds TSD handler
<size> - size of TSD are which has to be allocated
<init> - init function, executed when new TSD is allocated by thread
(thread access given TSD 1-st time). This function receives
void * pointer to allocated area.
<destruct> - destructor function executed when HVM stack is destroyed
f.e.:
static HB_TSD_NEW( s_scrData, sizeof( HB_SCRDATA ),
NULL, hb_xSaveRestRelease );
To initialize dynamically allocated TSD variable use:
HB_TSD_INIT( <name>, <size>, <init>, <destruct> )
Pointer to TSD can be accessed using hb_stackGetTSD( &<name> )
where <name> is name of variable which holds TSD handler, f.e.:
PHB_SCRDATA pScrData = ( PHB_SCRDATA ) hb_stackGetTSD( &s_scrData );
See source/rtl/xsavescr.c as an example
It's also possible to test if data has been already allocated for
current thread by:
hb_stackTestTSD( &<name> ) => pData
it works like hb_stackGetTSD() but return NULL if current thread data
has not been allocated yet.
* harbour/include/hbstack.h
* harbour/source/vm/estack.c
* changed hb_stack location to thread local storage in MT mode
+ added functions and macros to access/assign new HVM stack members
+ changed garbage collection mark functions to work with multiple
stacks, thread local static and memvar variables
* harbour/source/rtl/xsavescr.c
* use TSD data for screen buffer to make __XSAVESCREEN()/__XRESTSCREEN()
thread independent
* harbour/source/rtl/idle.c
* use TSD data for idle task settings and codeblocks
- removed hb_idleShutDown() - it's not longer necessary
* harbour/source/rtl/setkey.c
* use TSD data for allocated keys to make SETKEY() thread independent
* harbour/source/rtl/math.c
* moved math error handler, math error block, math error mode and
math error structure to TSD
* harbour/source/rtl/errorapi.c
* moved error handler, error block, error launch counter and DOS error
value to TSD
* harbour/source/rtl/inkey.c
* moved inkey "before" and "after" blocks to TSD
* harbour/source/rdd/hsx/hsx.c
* moved HSX handles array to TSD
* harbour/include/hbapigt.h
* harbour/source/rtl/console.c
- removed hb_setkeyInit() and hb_setkeyExit() - they are not longer
necessary, allocated resources will be freed by TSD destructor
function
* harbour/include/hbapi.h
* harbour/source/rtl/console.c
* removed hb_conXSaveRestRelease() - it's not longer necessary,
allocated resources will be freed by TSD destructor function
* harbour/source/vm/macro.c
* moved s_macroFlags to TSD
* harbour/source/rtl/accept.c
* moved accept buffer to TSD
* harbour/include/hbcomp.h
* harbour/include/hbcompdf.h
* harbour/include/hbxvm.h
* harbour/source/compiler/hbmain.c
* harbour/source/compiler/hbfix.c
* harbour/source/compiler/hbpcode.c
* harbour/source/compiler/hbdead.c
* harbour/source/compiler/complex.c
* harbour/source/compiler/genc.c
* harbour/source/compiler/gencc.c
* harbour/source/compiler/hbopt.c
* harbour/source/compiler/hblbl.c
* harbour/source/compiler/hbstripl.c
* harbour/source/compiler/harbour.y
* harbour/source/compiler/harbour.yyc
* harbour/source/compiler/harbour.yyh
* harbour/source/vm/hvm.c
+ added new PCODE HB_P_THREADSTATICS
+ added support for static variables which are local to thread:
THREAD STATIC <varname [:= <exp>], ...>
They work like normal static variables but each thread operates
on its own copy.
* added protection against possible double call to hb_xfree()
It can happen due to wrong marking expressions as used by bison
and executing destructors after our free code when syntax error
appear.
* harbour/source/rtl/perfuncs.prg
* harbour/source/rtl/menuto.prg
* harbour/source/rtl/getlist.prg
* harbour/source/rtl/readvar.prg
* harbour/source/rtl/text.prg
* use THREAD STATIC variables to make above code MT safe
* harbour/include/hbgtcore.h
* harbour/source/rtl/hbgtcore.c
+ added hb_gt_BaseFree() which will release current GT pointer
locked by hb_gt_Base() function. This function will be used
to optional automatic GT access synchronization when threads
share the same GT.
* harbour/source/rtl/gtapi.c
* harbour/source/rtl/inkeyapi.c
* harbour/source/rtl/mouseapi.c
* harbour/contrib/hbct/ctwin.c
* free GT pointer by hb_gt_BaseFree()
TODO: CTWIN is not MT safe yet - it will be updated together
with core GT when we add multi window interface for
thread with own console window.
* harbour/bin/hb-func.sh
* harbour/config/linux/gcc.cf
+ added rt lib to Linux builds
* harbour/bin/postinst.sh
* create MT safe version of FM stat library: fmmt
* harbour/bin/pack_src.sh
+ added support for ZIP packing
* harbour/include/hbapi.h
* harbour/include/hbvm.h
* harbour/source/vm/hvm.c
+ added hb_vmThreadInit()/hb_vmThreadQuit() functions - they initialize
HVM for calling thread so it can execute .prg code and call HVM
functions. They can be used by 3-rd party code threads.
+ added hb_vmUnlock()/hb_vmLock() functions which informs that
thread will not operate on HVM structures for some time allowing
to execute single thread only processes like GC.
+ added hb_vmThreadQuitRequest() which sends stop request to given
thread
+ added hb_vmWaitForThreads() which stops main thread execution waiting
for other threads
+ added hb_vmSuspendThreads() and hb_vmResumeThreads() used be GC
to stop all HVM threads before mark/swap scan
+ added linked list of HVM stacks
+ added hb_vmTerminateThreads() used by main HVM thread in QUIT state
* moved EXIT procedures execution from QUIT request to HVM QUIT state
in MT mode. It may effects some non structural code which tries to
access private variables in EXIT functions but it's much cleaner
and understandable for user. Please remember that we guaranties
that ALWAYS code in BEGIN SEQUENCE is _always_ executed even after
HVM QUIT request just like destructs. Personally I think that we
should move EXIT procedures execution also in ST mode.
* changed startup and cleanup code for new internal structures
* changes startup and cleanup code for MT mode
% removed some redundant HB_ITEM type settings
! eliminated non MT safe code which was using reference counters
without protection
* harbour/common.mak
* harbour/source/vm/Makefile
+ harbour/include/hbthread.h
+ harbour/source/vm/thread.c
+ added C level functions to manage threads and synchronization objects
See hbthread.h for detail description. They are based on PTHREAD API
and PTHREAD documentation can be used as reference. I intentionally
keep this list small for easier multiplatform porting.
Now they have been implemented for PTHREADS (POSIX threads supported by
many different OSes), MS-Win32/64 and OS2. The OS2 version is not tested
at all. I do not even know if it can be compiled so please make tests.
I used Internet resources and some part of xHarbour code as documentation
for OS2 MT API. It should be quite easy to add other platforms if necessary.
Harbour core code needs non recursive mutexes, conditional variables and
TLS for one pointer. If platforms does not support conditional variables
(f.e. MS-Win or OS2) then they can be emulated using multistate semaphores.
+ added .prg functions to manage threads and synchronization objects:
hb_threadStart( <@sStart()> | <bStart> [, <params,...> ] ) -> <pThID>
hb_threadJoin( <pThID> [, @<xRetCode> ] ) -> <lOK>
hb_threadDetach( <pThID> ) -> <lOK>
hb_threadQuitRequest( <pThID> ) -> <lOK>
hb_threadWaitForAll() -> NIL
hb_mutexCreate() -> <pMtx>
hb_mutexLock( <pMtx> [, <nTimeOut> ] ) -> <lLocked>
hb_mutexUnlock( <pMtx> ) -> <lOK>
hb_mutexNotify( <pMtx> [, <xVal>] ) -> NIL
hb_mutexNotifyAll( <pMtx> [, <xVal>] ) -> NIL
hb_mutexSubscribe( <pMtx>, [ <nTimeOut> ] [, @<xSubscribed> ] ) -> <lSubscribed>
hb_mutexSubscribeNow( <pMtx>, [ <nTimeOut> ] [, @<xSubscribed> ] ) -> <lSubscribed>
The function list should give similar to xHarbour API but they are not exactly
the same and except of hb_mutex*() functions which should replicate xHarbour behavior.
+ harbour/source/vm/vmmt
+ harbour/source/vm/vmmt/Makefile
+ added hbvmmt library to GNU make builds.
Non GNU make builds should be updated.
* harbour/contrib/hbct/pos1.c
* harbour/contrib/gtwvg/gtwvg.c
* harbour/contrib/rddads/ads1.c
* harbour/contrib/hbmisc/spd.c
* harbour/contrib/hbbmcdx/bmdbfcdx.c
* harbour/contrib/examples/rdddbt/dbfdbt1.c
* harbour/source/vm/runner.c
* harbour/source/vm/itemapi.c
* harbour/source/vm/hvm.c
* harbour/source/rtl/console.c
* harbour/source/rtl/strcase.c
* harbour/source/rtl/spfiles.c
* harbour/source/rtl/defpath.c
* harbour/source/rtl/hbgtcore.c
* harbour/source/rtl/dateshb.c
* harbour/source/rtl/mlcfunc.c
* harbour/source/rtl/fstemp.c
* harbour/source/rtl/is.c
* harbour/source/rtl/setcolor.c
* harbour/source/rtl/errorint.c
* harbour/source/rtl/transfrm.c
* harbour/source/rtl/dates.c
* harbour/source/rtl/filesys.c
* harbour/source/rtl/gtdos/gtdos.c
* harbour/source/rtl/gtwin/gtwin.c
* harbour/source/rtl/gtwvt/gtwvt.c
* harbour/source/rtl/gtxwc/gtxwc.c
* harbour/source/rtl/gttrm/gttrm.c
* harbour/source/rtl/gtpca/gtpca.c
* harbour/source/rtl/gtcgi/gtcgi.c
* harbour/source/rtl/gtcrs/gtcrs.c
* harbour/source/rtl/gtstd/gtstd.c
* harbour/source/rtl/gtsln/gtsln.c
* harbour/source/rtl/gtsln/gtsln.h
* harbour/source/rdd/dbf1.c
* harbour/source/rdd/sdf1.c
* harbour/source/rdd/delim1.c
* harbour/source/rdd/dbcmd.c
* harbour/source/rdd/hbdbsort.c
* harbour/source/rdd/workarea.c
* harbour/source/rdd/dbffpt/dbffpt1.c
* harbour/source/rdd/dbfcdx/dbfcdx1.c
* harbour/source/rdd/dbfntx/dbfntx1.c
* harbour/source/rdd/hsx/hsx.c
* harbour/source/rdd/hbsix/sxfname.c
* use API functions instead of direct accessing to hb_cdp_page or hb_set
* harbour/source/rtl/fstemp.c
* harbour/source/rtl/fssize.c
* harbour/source/rtl/hbffind.c
* harbour/source/rtl/filesys.c
* encapsulate potentially slow IO operation inside
hb_vmUnlock()/hb_vmLock() calls to allow other thread GC
activation
* harbour/contrib/hbnf/fttext.c
! fixed casting
* harbour/contrib/gtwvg/gtwvg.h
- removed #include <comctl32.h> - my MinGW and MinGW/CE instalations do
not have them. If it exists in some newer ones then it has to be
covered by #if version checking.
* harbour/source/vm/dynsym.c
- removed hb_dynsymLog() and hb_dynsymMemvarHandle()
* modified code to be MT safe and improved speed of some operations
* added MUEXT protection for global dynamic table access
* harbour/include/hbapi.h
* harbour/source/vm/garbage.c
* changed to work with MT HVM
* changed to work with new memvar structures and thread local static and
memvar variables
* added MUEXT protection for linked block lists
+ added parameter to hb_gcCollectAll() which will force GC activation
in MT mode by temporary suspending all executed threads.
+ added logical parameter to HB_GCALL() functions which is passed to
hb_gcCollectAll()
* harbour/source/vm/fm.c
* added MUEXT protection for FM statistic module
* added MT protection for reference counters. For platforms
which supports atomic incrmenetation/decrementation (f.e.
Interlocked*() functions in MS-Win) such operations are
used. For other it's MUTEX protection. It gives MT safe
readonly access for HVM complex variables without user
synchronization. The MUTEX protection can cause some speed
overhead so it's good to define MT safe version of
HB_ATOM_INC()/HB_ATOM_DEC() in hbthread.h if given platform
has them. Now they are defined only for Windows. For other
platforms We can define can define them in assembler for some
most popular CPUs in the future.
* harbour/source/vm/classes.c
* changed class definition array. Now it keeps pointers to class
structures.
* In MT mode allocated at HVM startup big enough array for class
definitions to avoid later RT reallocations. It effectively eliminates
MUTEX synchronization for class structure access.
* protect by MUTEX code for new class creation
* harbour/source/debug/dbgentry.c
* eliminated hbvmopt.h and direct accessing to HVM structures
* harbour/source/rtl/gtclip.c
* protect with MUTEX access to internal clipboard data
* harbour/source/rdd/nulsys/nulsys.c
+ added hb_rddCloseAll()
+ harbour/tests/mt
+ harbour/tests/mt/mttest01.prg
+ harbour/tests/mt/mttest02.prg
+ harbour/tests/mt/mttest03.prg
+ harbour/tests/mt/mttest04.prg
+ harbour/tests/mt/mttest05.prg
+ harbour/tests/mt/mttest06.prg
+ harbour/tests/mt/mttest07.prg
+ added some demonstration/test small MT programs written
using Harbour language. Some of them can be also compiled
by xHarbour but xHarbour does not pass any of my tests in
real multi-CPU machine so do not expect they will work
correctly.
Harbour threads needs OS threads support. Each Harbour thread is directly
mapped to OS thread. It's not very efficient on some older system where
cost of thread creation and/or task switching is very expensive but it
should not be bigger problem for modern OS-es which can support threads
in practice nearly in user space only.
I haven't touched Harbour function calling convention which comes from
Clipper. It means that we do not pass pointer to VM to each functions
like CLIP or xBase++. To resolve the problem I have to use thread local
storage (TLS) where such pointer is kept. If platform does not support
TLS then it can be emulated by us. Anyhow the speed of accessing TLS
data and extracting HB_STACK poitner is critical for performance.
Some compilers depending on used hardware and OS give native support
for TLS (f.e. __thread keyword in GCC/BCC or __declspec( thread ) in MSVC).
This should give optimal performance. On other Harbour uses TLS functions
like TlsGetValue() (MS-WIN) or pthread_getspecific() (PTHREAD) are used.
OS2 gives quite interesting TLS functionality which seems to be quite fast
though it will be interesting to know how it is iplemented internally for
real multi CPU machines (if it depends on CPU exception then the
performance will be bad). We need TLS only for one pointer to HB_STACK
structure.
I haven't added any tricks like HB_THREAD_STUB in xHarbour to reduce
the cost of TLS access. If it will be necessary for some platform the we
can add it.
Except TLS Harbour threads needs OS support for non recursive mutexes or
critical sections and conditional variables. If platforms does not support
conditional variables (f.e. MS-Win or OS2) then they can be emulated using
multistate semaphores. I intentionally didn't create code which may need
recursive mutexes. The non recursive ones are often faster and some
platforms may not support recursive mutexes so they will have to be
emulated by us.
Harbour uses reference counters for complex variables. It means that even
readonly access to complex item causes internal write operations necessary
to increment/decrement its reference counter. To make such readonly access
MT safe we have to make incrementation and decrementation with result
checking atomic. By default it's done by mutex inside vm/fm.c but some
platforms have native support for atomic inc/dec operations, f.e.
Interlocked*() functions in MS-Win. If they are available then such
functions should be used to not reduce the performance by mutex call
very often used functions. For many CPUs it should be quite easy to
implement such atomic inc/dec functionality in assembler. F.e. for
GCC and x86@32 it may looks like:
static __inline__ void hb_atomic_inc32( volatile int * p )
{
__asm__ __volatile__(
"lock incl %0"
:"=m" (*p) :"m" (*p)
);
}
static __inline__ int hb_atomic_dec32( volatile int * p )
{
unsigned char c;
__asm__ __volatile__(
"lock decl %0"
"sete %1"
:"=m" (*p), "=qm" (c) :"m" (*p) : "memory"
);
return c == 0;
}
and then it's enough to define in hbthreads.h:
#define HB_ATOM_INC( p ) hb_atomic_inc32( ( volatile int * ) p )
#define HB_ATOM_DEC( p ) hb_atomic_dec32( ( volatile int * ) p )
Probably I'll make it for some most popular CPUs in the future.
In Harbour each thread which wants to call HVM functions have to allocate
it's own HVM stack. It's done hb_vmThreadInit(). The HVM stack is freed
by calling hb_vmThreadQuit(). This functions can be called also by 3-rd
party threads if they want to call HVM functions or execute .prg code.
Calling HVM functions without allocated stack will cause GPF.
I moved most of static variables to HVM stack to make them thread
local. But some of them like FS errors have their own alternative
copy which is used when thread does not allocate HVM stack. It allows
to use hb_fs*() functions without HVM stack but programmer have to
know that error codes return by hb_fs*Error() functions can be
overwritten by other threads which also didn't allocated HVM stack.
To execute garbage collector scan and mark pass it's necessary to
stop other HVM threads. Otherwise the scan may give false results.
It's also possible to not stop threads but protect with mutex all
operations on GC items but it will probably cause performance reduction
and will force some other modifications. Maybe I'll implement it
in the future.
I didn't use any OS level thread KILL or CANCEL calls. All HVM threads
have to be cleanly removed without any resource leaks.
QUIT command terminate only calling thread. If main (startup) HVM
thread call QUIT then it sends QUIT request to all existing threads.
In QUIT state ALWAYS statements and destructors are executed.
New thread is created by:
hb_threadStart( <@sStart()> | <bStart> [, <params,...> ] ) -> <pThID>
The returned value is a pointer to internal thread structure which
can be used in JOIN or DETACH operations. Each thread should be Joined
or DETACHED to avoid resource leaks. If programmer does not store
<pThID> or all instances of <pThID> are destroyed then thread is
automatically detached. I do not know clear method of thread detaching
in OS2. If some OS2 users knows it then plase update vm/hbthread.c.
When thread terminates then all locked by this thread mutexes are
released.
Each thread uses its own memvars (PRIVATEs and PUBLICs) and work areas.
When new thread is created then it inherits from parent thread:
- code page
- language
- SETs
- default RDD
error block is initialized to default value by calling ERRORSYS()
and PUBLIC variable GetList := {} is created.
The following objects are initialized to default value:
- error block
- math error handler and math error block
- macro compiler features setting (hb_setMacro())
or move them to SETs.
We can think about inheriting them. It's also possible to add
inheriting of all visible memvars but I do not know it's good
idea.
Compilation and linking:
For MT mode HVM library should be compiled with HB_MT_VM macro.
GNU make automatically creates hbvmmt library which should be
linked with Harbour MT programs instead of hbvm.
Non GNU make files should be updated.
If given compiler support TLS then you can try to set HB_USE_TLS
to force using native compiler TLS support. Now it's enabled by
default only for BCC. For Linux and GCC builds it may depend also
on used GLIBC version. In older system there is no TLS support
at all or TLS works only for shared binaries so I haven't enabled
it. If you will test some other compiler then please add default
native TLS support for them in hbthread.h
Users using hb* scripts can simply use -mt switch when they want
to create MT program, f.e.:
hbmk -n -w3 -es2 -mt mttest01.prg
There are still some minor things which should be done but I'll
do them later. Current state seems to be fully functional.
The most important and still missing is our own file lock server
for RDD synchronization in POSIX systems. Kernel internally
recognize POSIX locks by PID and file i-node - not PID and file
handle. It means that the same file open more then once by one
process shares locks. Because POSIX locks can be overwritten
then we do not have any synchronization between aliased workareas
or threads using the same table in *nixes. We have to make
synchronization ourselves. I'll create such lock server ASAP.
Please test and enjoy using Harbour threads.
|
||
|
|
767e964c92 |
2008-09-04 19:08 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/source/rdd/dbfntx/dbfntx1.c
* harbour/source/rdd/dbfcdx/dbfcdx1.c
! fixed dirty index reading, thx Miguel for bug report
* harbour/source/compiler/hbmain.c
* removed old comment and hack
|
||
|
|
0b684e3379 |
2008-08-29 11:29 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbcompdf.h
* harbour/source/compiler/hbmain.c
* harbour/source/compiler/harbour.yyc
* harbour/source/compiler/harbour.y
! removed all classes and functions static declarations
! fixed cleanup code for classes and functions declarations
|
||
|
|
c7200cdcf7 |
2008-08-26 13:24 UTC+0200 Viktor Szakats (harbour.01 syenar hu)
* source/compiler/hbmain.c
! Text casing fixed in some warning messages.
! Attempted to update hardcoded declarations for TGET methods.
Some of the were removed, for some of them the parameter list
was updated to be in sync with current tget.prg.
* contrib/gtalleg/gtalleg.c
* contrib/gtwvg/gtwvg.c
* contrib/hbbmcdx/bmdbfcdx.c
* contrib/hbbmcdx/hbbmcdx.h
* contrib/hbbtree/hb_btree.c
* contrib/hbct/ctnet.c
* contrib/hbct/ctstrfil.c
* contrib/hbct/ctwin.c
* contrib/hbcurl/hbcurl.c
* contrib/hbgd/gdwrp.c
* contrib/hbmzip/hbmzip.c
* contrib/hbnf/fttext.c
* contrib/hbtip/utils.c
* contrib/xhb/freadlin.c
* contrib/xhb/hbxml.c
* contrib/xhb/hbxml.h
* doc/codestyl.txt
* doc/en/garbage.txt
* doc/en/hb_apifs.txt
* include/hbapigt.h
* include/hbchksum.h
* include/hbdbsort.h
* include/hbgtcore.h
* include/hbrddcdx.h
* include/hbrdddbf.h
* include/hbrdddel.h
* include/hbrddntx.h
* include/hbrddsdf.h
* include/hbset.h
* include/hbsxfunc.h
* source/rdd/dbf1.c
* source/rdd/dbfcdx/dbfcdx1.c
* source/rdd/dbffpt/dbffpt1.c
* source/rdd/dbfntx/dbfntx1.c
* source/rdd/dbsql.c
* source/rdd/hbsix/sxcompr.c
* source/rdd/hbsix/sxsem.c
* source/rdd/hsx/hsx.c
* source/rtl/console.c
* source/rtl/copyfile.c
* source/rtl/fssize.c
* source/rtl/fstemp.c
* source/rtl/gt_tpl/gt_tpl.c
* source/rtl/gtapi.c
* source/rtl/gtcgi/gtcgi.c
* source/rtl/gtcrs/gtcrs.c
* source/rtl/gtdos/gtdos.c
* source/rtl/gtos2/gtos2.c
* source/rtl/gtpca/gtpca.c
* source/rtl/gtsln/gtsln.c
* source/rtl/gtstd/gtstd.c
* source/rtl/gttrm/gttrm.c
* source/rtl/gtwin/gtwin.c
* source/rtl/gtwvt/gtwvt.c
* source/rtl/gtxwc/gtxwc.c
* source/rtl/hbgtcore.c
* source/rtl/hbmd5.c
* source/rtl/isprint.c
* source/rtl/memofile.c
* source/rtl/philes.c
* source/rtl/set.c
* source/vm/memvars.c
* source/vm/runner.c
* utils/hbdoc/hbdfrdln.c
* utils/hbmake/hbmfrdln.c
* FHANDLE -> HB_FHANDLE
* hbct: HB_ITEM_PTR -> PHB_ITEM
|
||
|
|
9768614ed1 |
2008-08-26 12:50 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/source/compiler/hbmain.c
! reset class and functions static declarations to avoid GPF
when more then one file is compiled with -w3 switch
NOTE: Whole this code will have to be removed and written
from scratch
|
||
|
|
15e1a4cf73 |
2008-08-26 11:57 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/source/compiler/hbmain.c
! fixed GPF when more then one file was compiled with -w3 switch
|
||
|
|
55ae11bfcd |
2008-08-24 13:15 UTC+0200 Viktor Szakats (harbour.01 syenar hu)
* source/vm/runner.c
* source/vm/fm.c
* source/common/hbver.c
* source/rtl/hbgtcore.c
* source/rtl/gtwvt/gtwvt.c
* source/rdd/dbfntx/dbfntx1.c
* source/rdd/workarea.c
* source/rdd/wacore.c
* source/rdd/sdf1.c
* source/rdd/dbfcdx/dbfcdx1.c
* source/rdd/delim1.c
* source/rdd/dbf1.c
* source/rdd/wafunc.c
* source/rdd/dbffpt/dbffpt1.c
* source/compiler/hbmain.c
* source/compiler/fixflex.c
* source/compiler/gencobj.c
* source/compiler/genc.c
* source/compiler/harbour.yyc
* source/compiler/harbour.y
* contrib/hbct/disk.c
* contrib/hbwhat32/whtcdlg.c
* contrib/gtwvg/gtwvg.c
* contrib/rddads/adsfunc.c
* contrib/rddads/ads1.c
* contrib/hbbmcdx/bmdbfcdx.c
* contrib/examples/pp/hbppcomp.c
* hb_strncpy()/hb_strncat() size parameter changed from
CONSTANT to 'sizeof( dest ) - 1', where applicable.
! hbct/VOLUME() buffer overrun fixed.
; NOTE: dbfntx1.c has a couple of places where I wasn't
sure of the intention, so I left them unchanged.
|
||
|
|
193fa902f8 |
2008-08-04 16:02 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/common.mak
* harbour/source/compiler/Makefile
* harbour/source/compiler/cmdcheck.c
* harbour/source/compiler/hbmain.c
* harbour/source/compiler/hbusage.c
* disabled support for unfinished -gw compiler switch in
default builds. It can be enabled by developers who will
want to work on this code by recompiling Harbour with
HB_GEN_W32_OBJ macro (f.e. by setting it in C_USR envvar)
|
||
|
|
29b52145d1 |
2008-08-01 03:06 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbpp.h
* harbour/include/hbexprb.c
* harbour/source/pp/ppcore.c
* harbour/source/vm/evalhb.c
* harbour/source/vm/runner.c
* harbour/source/vm/hvm.c
* harbour/source/vm/fm.c
* harbour/source/vm/eval.c
* harbour/source/vm/dynlibhb.c
* harbour/source/vm/classes.c
* harbour/source/rdd/hbsix/sxord.c
* harbour/source/compiler/hbmain.c
* harbour/source/compiler/harbour.y
* pacified warnings
|
||
|
|
a95ca6ab8b |
2008-05-16 19:26 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbcomp.h
* harbour/include/hbcompdf.h
* harbour/source/compiler/hbmain.c
* harbour/source/compiler/complex.c
* harbour/source/compiler/harbour.y
* harbour/source/compiler/harbour.yyc
! moved function related variables and structures from HB_COMP to
PFUNCTION - it fixes many different problems which can appear in
some code, also the recent Mindaugas' example
! initialize statement value in error action to avoid valgrind/CodeGuard
warning reports when syntax error appear in some complex statements
* harbour/source/rtl/scrollbr.prg
* repalced TAB with SPACEs
|
||
|
|
e5c0ea79ba |
2008-05-08 21:14 UTC+0100 Viktor Szakats (harbour.01 syenar hu)
* contrib/rddads/ads.ch
* contrib/rddads/rddads.h
* contrib/rddads/adsfunc.c
* contrib/rddads/ads1.c
* contrib/rddads/adsmgmnt.c
* Lots of minor code cleanups, formatting fixes, optimizations,
and several minor fixes.
! Lib version related fixes. (some features were not updated
for newer ACE versions).
+ Automatic version detection extended with 6.20 and 5.00.
6.00 is still missing, if someone has it, pls send it to
me. Even 6.11-8.00 versions disappeared from the vendor's
site lately.
+ Added support for all possible properties in
ADSDDGETDATABASEPROPERTY()
ADSDDSETDATABASEPROPERTY()
* ADSMGGETUSERNAMES() will now always return an array of
users with 6 elements in each item, all data which
is not available for the compiled version of the lib,
will be filled with empty strings. Previously the
number of elements depended on the compiled version.
; Besides the above, no functionality change should be
experienced.
; Please test.
* contrib/rddads/make_b32.bat
* contrib/rddads/make_vc.bat
! Changed to never look for ace32.dll in system32 dir
to generate the ace32.lib.
! Some other fixes to prev change where ADS_VER
was obsoleted.
* contrib/hbct/ctwfunc.c
* contrib/hbct/ctextern.ch
+ Added hbct_MaxRow()/hbct_MaxCol() emulating
the original overloaded MaxRow()/MaxCol()
functions of CT3 lib.
* source/rtl/maxrow.c
* Reverted previous change on request, thus introducing
a 3rd party lib specific function parameter extension.
Users of CT3 lib's overloaded MaxRow(.T.)/MaxCol(.T.)
functions are encouraged to change the app code
to rather use hbct_MaxRow()/hbct_MaxCol()
or hb_ScrMaxRow()/hbScrMaxCol(). These functions are
easy to implement in CA-Cl*pper too (simple wrappers
to Max*()).
* source/compiler/hbmain.c
* Reverted previous change on request. Some outputs
are not exactly CA-Cl*pper compatible this way, but
functionally it probably doesn't matter for most ppl.
* contrib/xhb/hbcompat.ch
! Corrected MaxRow()/MaxCol()/hb_ScrMaxRow()/hb_ScrMaxCol()
translations. (hopefully, someone using xhb please test)
- tests/ctwtest.prg
+ contrib/hbct/tests/ctwtest.prg
* Moved CT lib specific test to contrib local test
directory (containing lots of other CT tests
already). Building these is yet to be solved.
* contrib/hbct/tests/math.prg
* contrib/hbct/tests/trig.prg
* contrib/hbct/tests/num1.prg
! Added SVN header.
* include/hbgtinfo.ch
* Minor comment.
* contrib/rddads/make_gcc.sh
* Help text sync with *.bat.
|
||
|
|
53030631bf |
2008-05-07 11:21 UTC+0100 Viktor Szakats (harbour.01 syenar hu)
* contrib/rddads/make_b32.bat
* contrib/rddads/make_vc.bat
* contrib/rddads/ads.ch
* contrib/rddads/rddads.h
* contrib/rddads/ads1.c
* contrib/rddads/adsfunc.c
* contrib/rddads/adsmgmnt.c
+ Added ACE version autodetection.
You can override with: -DADS_LIB_VERSION=700 (and similar)
(ADS_REQUIRE_VERSION still accepted for compatibility)
! Fixed a few lib version related problems.
! hMgmtHandle global renamed to ads_g_hMgmtHandle.
* Formatting.
* contrib/rddads/rddads.h
+ QUESTION: added about ADS_MAX_KEY_LENGTH redefinition.
Is it needed?
* source/compiler/hbmain.c
* Changed output device (hb_compOutStd() -> hb_compOutErr())
for following texts:
"Compiling..."
"No code generated"
"Lines x, Functions/Procedures x"
This is to replicate CA-Cl*pper behaviour a bit more.
* include/hbextern.ch
* common.mak
* source/rtl/Makefile
* source/rtl/maxrow.c
+ source/rtl/scrrow.c
* contrib/xhb/hbcompat.ch
+ Added hb_ScrMaxRow(), hb_ScrMaxCol()
These will return the screen dimensions regardless
of the size of an active window (when using CT
windows for example). Functionality is the same
as MaxRow(.T.) and MaxCol(.T.) previously.
! MaxRow()/MaxCol() extended parameters removed.
+ Added MaxRow(.T.)/MaxCol(.T.) conversions for
xhb lib (hbcompat.ch) in both directions.
; XBase++ doesn't have any extended parameters
for Max*() function. Flagship has two of them,
both of them doing something different. CAVO doesn't
have these functions at all.
* contrib/xhb/hbcompat.ch
! GTI_* macros updated to HB_GTI_*.
* source/vm/memvclip.c
% Minor opt in __QQPUB().
* source/vm/extend.c
* 0 -> NULL
* source/vm/estack.c
- QUESTION removed.
* source/lang/msgbgmik.c
* source/rtl/console.c
* source/rtl/philes.c
* source/rtl/adir.prg
* source/rtl/getsys53.prg
* source/rtl/getsys.prg
* source/rtl/tget.prg
* source/rtl/ttopbar.prg
* source/rtl/pushbtn.prg
* source/rtl/mod.c
* source/rtl/memofile.c
* source/rtl/radiobtn.prg
* source/rtl/filesys.c
* source/rtl/tbrowse.prg
* source/vm/estack.c
* source/vm/itemapi.c
* source/vm/hvm.c
* source/vm/cmdarg.c
* source/vm/fm.c
* source/vm/eval.c
* source/common/hbver.c
* source/common/expropt2.c
* utils/hbtest/hbtest.prg
* utils/hbtest/rt_misc.prg
* utils/hbtest/rt_str.prg
! Comment fixes and minor formatting.
|
||
|
|
8a6e4ecdff |
2008-04-22 20:41 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbclass.ch
* harbour/include/hbcomp.h
* harbour/source/compiler/hbmain.c
* harbour/source/compiler/harbour.yyc
* harbour/source/compiler/harbour.y
! fixed -w3 warnings when class name is different then function name
* allow to overwrite predefined classes definitions
it's a dirty hack but current implementation of predefined
function and class declarations has to be rewritten from scratch
in the future so I make it intentionally - at least it resolves
some memory leaks like: harbour -n -w3 tbcolumn.prg
* harbour/config/rules.cf
* harbour/make_b32.mak
* harbour/make_gcc.mak
* harbour/make_vc.mak
* harbour/make_vcce.mak
* harbour/contrib/mtpl_b32.mak
* harbour/contrib/mtpl_gcc.mak
* harbour/contrib/mtpl_vc.mak
* changed default Harbour compiler switch -w2 to -w3
* harbour/contrib/xhb/xhbcomp.prg
* replaced repeated declarations by small hack
* harbour/utils/hbmake/tmake.prg
! fixed reported by -w3 repeated aDir declaration
* harbour/source/rtl/tbrowse.prg
* calculate frozen area size for 5-th element of array returned
by xbase++ compatible method :viewArea(). Viktor please check me.
If you can also describe what exactly TOFIX in :firstScrCol()
and :viewArea() means then maybe I can help - I do not have
xbase++ so I do not know what should be fixed.
|
||
|
|
25231721f9 |
2008-02-08 15:58 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbcomp.h
* harbour/include/hbmacro.h
* harbour/include/hbexprb.c
* harbour/source/vm/macro.c
* harbour/source/compiler/hbmain.c
! fixed name conflict in privates/publics declaration.
Harbour allows to declare memvars with the same name as file
wide statics or fields but this extensions was not working well
in some cases and can cause unexpected results in variable
declaration, f.e. try this code:
static v:="static"
proc main()
public v:="public"
? v, M->v
return
compiled with -n -w switches and also with -n -w -a before
this fix.
! fixed some compile time warnings in memvars declaration to be
more Clipper compatible
! fixed compiling external modules (DO <procname> [WITH <params,...>])
when function <procname> is already declared but with different
letter case. Harbour does not convert <procname> in DO statement
to upper case to play well with case sensitive file systems and
it could cause confusing warning message:
Cannot open <procname>.prg, assumed external
* harbour/source/compiler/harbour.y
* harbour/source/compiler/harbour.yyc
! added protection against bug in bison destructors which might cause
multiple free the same memory block on syntax error due to
* harbour/source/rdd/dbf1.c
! added missing binary flag for daytime fields
* harbour/source/rdd/dbfntx/dbfntx1.c
! fixed possible memory leak during accessing corrupted NTX files
! fixed possible GPF during accessing corrupted NTX files
* harbour/source/compiler/genc.c
* minor cleanup
* harbour/config/os2/global.cf
! use FOR command to delete group of files
|
||
|
|
05b520ce9e |
2008-01-25 15:20 UTC+0200 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt)
* harbour/source/compiler/hbmain.c
! fixed a few /w3 memory leaks
|
||
|
|
3611daa5a2 |
2008-01-11 18:01 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbapiitm.h
* harbour/source/vm/itemapi.c
+ added new functions:
BOOL hb_itemParamStore( USHORT uiParam, PHB_ITEM pItem )
BOOL hb_itemParamStoreForward( USHORT uiParam, PHB_ITEM pItem )
They copy/move pItem body to parameter passed by reference and
return TRUE when operation was done successfully (uiParam was passed
by reference)
+ added new functions for string manipulation:
char * hb_itemLockReadCPtr( PHB_ITEM pItem, ULONG * pulLen );
char * hb_itemLockWriteCPtr( PHB_ITEM pItem, ULONG * pulLen );
void hb_itemUnLockCPtr( char * pszString );
It's recommended to use them instead of hb_itemGetCPtr().
Pointer to string buffer returned by hb_itemLockReadCPtr() will
be always valid even if source item will be cleared, destroyed or
overwritten until hb_itemUnLockCPtr() is called. Each locked string
has to be unlocked to avoid memory leaks. After unlocking the string
pointer cannot be longer used.
hb_itemLockWriteCPtr() works like hb_itemLockReadCPtr() but string
pointer returned by this function is writable so user can change
the body of string item. It's the _ONLY_ one way when it's possible.
Modifying string items using pointers returned by hb_parc() or
hb_itemGetCPtr() or extracted directly from HB_ITEM body is _FORBIDDEN_
and can cause unpredictable results (GPF when constant/readonly memory
pages are changed, changing many different items which share the same
memory buffer, etc.).
This is code illustrates how to use hb_itemLockReadCPtr()/
hb_itemUnLockCPtr() and it's also good example why hb_itemGetCPtr()
is very danger function and cannot be used in such case - if you
replace hb_itemLockReadCPtr() with hb_itemGetCPtr() and remove
hb_itemUnLockCPtr() then you will have buggy code.
HB_FUNC( MYFUNC )
{
PHB_ITEM pObject = hb_param( 1, HB_IT_OBJECT )
if( pObject )
{
char * pszName1, * pszName2;
PHB_ITEM pResult;
pResult = hb_objSendMsg( pObject, "POP", 0 );
pszName1 = hb_itemLockReadCPtr( pResult, NULL );
pResult = hb_objSendMsg( pObject, "POP", 0 );
pszName2 = hb_itemLockReadCPtr( pResult, NULL );
if( pszName1 && pszName2 )
hb_retc_buffer( hb_xstrcpy( NULL,
"[", pszName1, "]-[", pszName2, "]", NULL ) );
hb_itemUnLockCPtr( pszName1 );
hb_itemUnLockCPtr( pszName2 );
}
}
This code shows how to use hb_itemLockWriteCPtr():
proc main()
local cVal, cVal2
cVal := cVal2 := "ABC"
STRPUT( @cVal2, 2, 42 )
? cVal, cVal2
return
#pragma begindump
#include "hbapiitm.h"
HB_FUNC( STRPUT )
{
PHB_ITEM pString = hb_param( 1, HB_IT_STRING );
ULONG ulAt = hb_parnl( 2 );
if( pString && ulAt && ISNUM( 3 ) )
{
ULONG ulLen;
char * pszValue;
pszValue = hb_itemLockWriteCPtr( pString, &ulLen );
if( pszValue )
{
if( ulAt <= ulLen )
pszValue[ ulAt - 1 ] = ( char ) hb_parni( 3 );
hb_itemUnLockCPtr( pszValue );
}
}
}
#pragma enddump
* harbour/include/hbcompdf.h
* harbour/include/hbexprop.h
* harbour/include/hbexprb.c
* harbour/source/compiler/hbmain.c
* harbour/source/compiler/cmdcheck.c
* harbour/source/compiler/hbusage.c
* removed HB_I18N_SUPPORT macro and enabled I18N code in default build
|
||
|
|
40d7f55063 |
2008-01-11 17:32 UTC+0200 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt)
* harbour/include/hbexprb.c
* harbour/source/compiler/hbmain.c
! added string escaping before to i18n .pot files
+ added hb_i18n_gettext_strict() support for compiler. This function
generates warning if argument is not literal string. See discussion
on mailing list from 2007-11-23 to 2007-11-29, for details.
|
||
|
|
a6284ec5c1 |
2007-11-27 11:31 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/source/compiler/hbmain.c
* make all hb_compI18n*() functions which do not need external access
static - now only hb_compI18nAdd() is public function. If it will
be necessary to make other functions public then we will make it
but please always try to declare new functions as static if it's
not necessary to access them externally - it helps in future
modifications because we do not have to worry about external
code which may access some functions.
* harbour/config/hpux/gcc.cf
* added commented -mlp64 GCC switch to CFLAGS and LDFLAGS - this
switch forces 64-bit mode in HP-UX on IA64
* harbour/source/common/hbwince.c
+ added wrapper for LocalHandle() and direct translation for LocalLock()
* harbour/config/w32/cemgw.cf
+ added commdlg, commctrl, luuid and ole32 to linked library list
for some contrib code
|
||
|
|
521f956aa8 |
2007-11-23 12:37 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/source/compiler/hbmain.c
! fixed bad typo in hb_compI18nAdd() and memmove() range which can
cause GPF
* changed pFileName to FileName in hb_compI18nSave() to respect used
by us naming convention
* eliminated strcpy() - do not use strcpy()/strcat() - these functions
are reported as dangerous by security restrict compilers.
I suggest to use hb_strncpy()/hb_strncat() instead (remember about
different size meaning in these functions) or some others depending
on context (f.e. hb_strdup() in this case)
|
||
|
|
ce44121edc |
2007-11-23 03:55 UTC+0200 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt)
* harbour/source/include/hbcompdf.h
* harbour/source/include/hbexprop.h
* harbour/source/include/hbexprb.c
* harbour/source/compiler/cmdcheck.c
* harbour/source/compiler/hbmain.c
+ added i18n support
Implemented -j[filename] switch to indicate output filename. Default
filename is <sourcefilename>.pot. If switch -o is used, this file
is created in speficied output path.
Output file format is compatible with 'gettext' utils, but not all
available features are implemented.
Harbour level function HB_i18nGettext( cText [, cContext ] ) sould be
used to indicate translatable strings.
All this commit is commented using #ifdef HB_I18N_SUPPORT and is in
development stage. Please, do not use it yet.
|
||
|
|
7aa8292529 |
2007-11-04 19:20 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbcomp.h
* harbour/include/hbmacro.h
* harbour/source/compiler/hbmain.c
* harbour/source/compiler/harbour.y
* harbour/source/vm/macro.c
* harbour/source/vm/garbage.c
* harbour/source/vm/hvm.c
* harbour/source/vm/classes.c
* harbour/source/rdd/dbf1.c
* harbour/source/rdd/dbffpt/dbffpt1.c
* harbour/source/rtl/binnum.c
* harbour/source/rtl/gtwvt/gtwvt.c
* added explicit casting or changed some declarations to avoid
warning about possible data lost in conversions
* harbour/source/rtl/direct.c
% optimized directory array creation and fixed one TOFIX note
I left few warnings intentionally to mark places which should be
updated in the future (f.e. HB_SYMBOLSCOPE translations).
Victor, if you can please make build test with MSVC builds and
send the list of warnings which still exist to harbour-devel.
|
||
|
|
13427dd60a |
2007-11-03 02:35 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/contrib/bmdbfcdx/bmdbfcdx1.c
* replaced all direct access to hb_set structure with functions
Now it's possible to link bmdbfcdx with harbour.dll but because
it still access hb_cdp_page then only if linker supports auto
import conversions
* harbour/source/common/hbfsapi.c
* harbour/source/main/harbour.c
* harbour/source/pp/hbppgen.c
* harbour/utils/hbpp/hbpp.c
* added filename conversion (hb_fsNameConv()) to hb_fsFileExists()
function
* harbour/include/hbapifs.h
+ harbour/source/common/hbfopen.c
* harbour/source/common/Makefile
* harbour/common.mak
+ added hb_fopen() function - it's a wrapper to fopen() function but
calls internally hb_fsNameConv()
* harbour/source/pp/hbppgen.c
* harbour/source/pp/ppcore.c
* harbour/source/common/hbtrace.c
* harbour/source/compiler/hbmain.c
* harbour/source/compiler/genhrb.c
* harbour/source/compiler/gencobj.c
* harbour/source/compiler/genobj32.c
* harbour/source/compiler/genc.c
* harbour/source/rtl/gtchrmap.c
* harbour/source/vm/fm.c
* use hb_fopen() instead of fopen()
|
||
|
|
1320481f88 |
2007-10-15 18:36 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* source/rtl/tbcolumn.prg
! Strict C5.2e compatible behaviour made the default.
* source/rtl/inkey.c
+ Added handling of arrays of numbers in HB_KEYPUT().
(this was copied from __KEYBOARD()'s extended section)
+ Added handling of string parameter in HB_KEYPUT().
(this way we don't really need the hidden extensions
in __KEYBOARD() anymore. Also notice that __KEYBOARD()
doesn't clear the keyboard buffer when numeric or
array is passed, which is not consistent with the
Clipper compatible behaviour when strings are passed.)
* common.mak
* include/hbcompdf.h
* source/compiler/hbmain.c
* source/compiler/cmdcheck.c
* source/compiler/hbcomp.c
* source/compiler/harbour.l
* source/compiler/Makefile
* source/compiler/ppcomp.c
* source/compiler/hbusage.c
- source/compiler/genjava.c
- source/compiler/gencli.c
- Removed two non-working (experimental) output types:
Java, CLI
! Prefixed LANG_* enums with HB_
|
||
|
|
ce51877db3 |
2007-10-10 00:05 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbcompdf.h
* harbour/source/compiler/hbmain.c
* harbour/source/compiler/harbour.y
* harbour/source/compiler/harbour.yyc
* harbour/source/compiler/complex.c
* cleanup: removed unused variable, some extension to datetime
decoding, etc.
|
||
|
|
2c601eb91c |
2007-10-04 02:54 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/source/compiler/hbmain.c
! fixed setting HB_FS_FIRST flag
|
||
|
|
7ce01c556f |
2007-09-15 22:35 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbapi.h
+ HB_ISFIRSTIDCHAR() and HB_ISNEXTIDCHAR() macros
* harbour/source/rdd/wafunc.c
* changed FIELD->, _FIELD->, <alias>-> stripping from expressions
to respect shortcuts
* harbour/source/compiler/hbmain.c
* harbour/source/compiler/hbdead.c
* harbour/source/compiler/hbopt.c
* jump joining optimization changed to work also for code with line
numbers
|
||
|
|
ea97d11a41 |
2007-08-22 19:10 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbpp.h
* harbour/include/hbcomp.h
* harbour/include/hbcompdf.h
* harbour/source/pp/ppcore.c
* harbour/source/rtl/gttrm/gttrm.c
* harbour/source/main/harbour.c
* harbour/source/compiler/hbmain.c
* harbour/source/compiler/cmdcheck.c
* harbour/source/compiler/hbcomp.c
* harbour/source/compiler/hbcmplib.c
* harbour/source/compiler/ppcomp.c
* added 'const' to some 'char *' declarations
+ added hb_pp_inBuffer()
+ extended hb_compMain() to accept source code passed as ASCIIZ
string
+ .prg function HB_COMPILEFROMBUF()
+ added support for -q2 compiler switch - it disables _ALL_ stdout/stderr
messages
* harbour/utils/Makefile
+ harbour/utils/hbdot
+ harbour/utils/hbdot/hbdot.prg
+ harbour/utils/hbdot/Makefile
+ added hbdot utility program.
It's a "DOt Prompt" Console for the Harbour Language
Syntax: hbdot [<hrbfile[.prg]> [<parameters,...>]]
It should look and work in similar way to pp/xBaseScript
by Ron Pinkas but unlike xBaseScript is does not have preprocessor
or simulated runtime environment but simply uses Harbour pp and
compiler libraries to preprocess and compile commands. It means
that it supports all language constructions also statements, f.e.:
"for i:=1 to 10; ? i; next"
Additionally it can also compile and execute .prg files given as
first parameter just like hbrun.
Please test it. If it will work as expected then we can remove
'pp' (contrib/dot) from standard packages
|
||
|
|
c35370c2b9 |
2007-08-21 16:00 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/source/vm/memvars.c
+ added __MVSETBASE() function
* harbour/source/pp/ppcore.c
* redirect error messages when error trap is not defined into
user dispout function
* harbour/include/hbcomp.h
* harbour/source/compiler/hbmain.c
* harbour/source/compiler/cmdcheck.c
* harbour/source/compiler/hbcomp.c
* harbour/source/compiler/genjava.c
* harbour/source/compiler/genc.c
* harbour/source/compiler/hbcmplib.c
* harbour/source/compiler/ppcomp.c
* harbour/source/compiler/gencli.c
* harbour/source/compiler/genhrb.c
* harbour/source/compiler/gencobj.c
* harbour/source/compiler/genobj32.c
* harbour/source/compiler/hbusage.c
* harbour/source/compiler/hbgenerr.c
+ added hb_compOutStd() and hb_compOutErr()
* redirected all compiler output to above functions
|
||
|
|
94cf099be5 |
2007-07-06 23:15 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/contrib/libct/bitnum.c
* harbour/contrib/libct/charlist.c
* harbour/contrib/libct/ctnet.c
* harbour/contrib/libct/charonly.c
* harbour/contrib/libct/atadjust.c
* harbour/contrib/libct/ctmath.c
* harbour/contrib/libct/ctset.c
* harbour/contrib/libct/charsort.c
* harbour/contrib/libct/ctmath.h
* harbour/contrib/libct/ctset.h
* harbour/contrib/libct/cterror.ch
* harbour/contrib/libct/charmix.c
* harbour/contrib/libct/charevod.c
* harbour/contrib/libct/charrepl.c
* harbour/contrib/libct/charswap.c
* harbour/contrib/libct/charop.c
* harbour/contrib/libct/color.prg
+ harbour/contrib/libct/blank.prg
* harbour/contrib/libct/ct.prg
* harbour/contrib/libct/ct.ch
* harbour/contrib/libct/charone.c
* harbour/contrib/libct/ctchksum.c
* harbour/contrib/libct/ascpos.c
* harbour/contrib/libct/charmirr.c
* harbour/contrib/libct/ctc.c
* harbour/contrib/libct/ct.h
* harbour/contrib/libct/atnum.c
* harbour/contrib/libct/ctmisc.prg
* harbour/contrib/libct/count.c
* harbour/contrib/libct/ctcrypt.c
* harbour/contrib/libct/addascii.c
* harbour/contrib/libct/ctmath2.c
* harbour/contrib/libct/ctextern.ch
* harbour/contrib/libct/asciisum.c
* harbour/contrib/libct/atrepl.c
* harbour/contrib/libct/ctstr.c
* harbour/contrib/libct/ctstr.h
* synced with xHarbour modifications and fixes
! some fixes
* indenting
* harbour/source/rtl/errorapi.c
* indenting
* harbour/source/vm/hashfunc.c
+ added HB_HSETCASEMATCH(), HB_HSETAUTOADD()
% some minor optimizations
* harbour/include/hbcompat.ch
+ added hb_checksum() <=> hb_adler()
* use new HB_HSET*() function to avoid warnings
* harbour/include/hbcomp.h
* harbour/include/hbcompdf.h
* harbour/include/hberrors.h
* harbour/source/compiler/hbmain.c
* harbour/source/compiler/harbour.yyc
* harbour/source/compiler/harbour.y
* harbour/source/compiler/harbour.yyh
* harbour/source/compiler/hbgenerr.c
! fixed using EXIT/LOOP inside WITH OBJECT / END statement
! fixed optimization of empty BEGIN/END sequence when recover has
EXIT or LOOP statement
! forbidden using EXIT and LOOP inside ALWAYS code in BEGIN/END sequence
! forbidden using ALWAYS statement if RECOVER code has EXIT or LOOP
statement
|
||
|
|
581507c90d |
2007-06-01 15:10 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/harbour.spec
* set attributes explicitly to clean some wrong attributes committed
to CVS and minor cleanup
* harbour/include/hbapierr.h
* harbour/source/rtl/errorapi.c
+ added hb_errorBlock()
* harbour/source/macro/macro.yyc
* harbour/source/compiler/harbour.yyc
* manual hack to pacify BCC warning messages
* harbour/include/hbpcode.h
* harbour/include/hbxvm.h
* harbour/source/compiler/genc.c
* harbour/source/compiler/gencc.c
* harbour/source/compiler/harbour.y
* harbour/source/compiler/harbour.yyc
* harbour/source/compiler/hbdead.c
* harbour/source/compiler/hbfix.c
* harbour/source/compiler/hblbl.c
* harbour/source/compiler/hbmain.c
* harbour/source/compiler/hbopt.c
* harbour/source/compiler/hbpcode.c
* harbour/source/compiler/hbstripl.c
* harbour/source/vm/hvm.c
+ added support for:
BEGIN SEQUENCE WITH <errorBlockExp>
[<statements;...>]
[ RECOVER [ USING oErr ] ]
...
[ ALWAYS ]
...
END
It works like normal BEGIN SEQUENCE but sets <errorBlockExp> as
ErrorBlock() before executing <statements;...> and restore
previous ErrorBlock() at the end or when exception will appear.
I hope it will make some xHarbour user happy ;-)
* harbour/include/hbcompat.ch
+ added preprocessor directive for TRY / CATCH / FINALLY / END
working like in xHarbour - translated to:
BEGIN SEQUENCE WITH { |oErr| Break( oErr ) }
...
[ RECOVER [ USING oErr ] ]
...
[ ALWAYS ]
...
END
|
||
|
|
c3e6e824e4 |
2007-05-28 18:50 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/config/bsd/gcc.cf
* harbour/config/darwin/gcc.cf
* harbour/config/hpux/gcc.cf
* harbour/config/linux/gcc.cf
* harbour/config/sunos/gcc.cf
+ added -lpcreposix -lpcre to linked system libraries when
C_USR contains -DHB_PCRE_REGEX
* harbour/source/compiler/hbmain.c
* clear HB_COMP_PARAM->functions.pLast in hb_compCompileEnd()
to avoid accessing freed memory
|
||
|
|
bedaef925f |
2007-05-28 09:50 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/make_xmingw.sh
* harbour/source/pp/Makefile
* recent xHarbour fixes for MinGW Linux->W32 cross build by Phil Krylow
with small modifications
* harbour/config/rules.cf
+ added rules for C++ files
* harbour/include/hbapi.h
* harbour/source/vm/arrays.c
+ added hb_arraySetForward()
* harbour/include/hbapi.h
* harbour/source/rtl/strmatch.c
+ added hb_strMatchFile() - compare two strings using platform dependent
rules for file matching, respects platform dependent wildcards
+ added hb_strMatchCaseWildExact() - compare two strings using pattern
with wildcard (?*) ignoring the case of the characters - patern have
to cover whole string
* changed hb_strMatchRegExp() to use real reguar expresions, if build
does not support regex then redirected to hb_strMatchWildExact()
- removed not longer used hb_strMatchDOS() - in fact it was neither DOS
nor classic wildcards (?*) compatible
* harbour/source/common/hbstr.c
! casting to avoid possible problem on platforms where toupper does not
accept negative char value
* harbour/include/hbcomp.h
* harbour/source/compiler/hbcomp.c
* harbour/source/compiler/hbmain.c
* minor modifications in cleanup functions
* harbour/source/rtl/hbffind.c
* use hb_strMatchFile()
* harbour/source/vm/memvars.c
* use hb_strMatchCaseWildExact() instead of hb_strMatchRegExp()
I still keep the hack which translates any mask starting with '*'
to "*" but if you think that we should fully respect wildcards
patterns then we should remove it from function hb_memvarGetMask()
Opinions?
|
||
|
|
ecf11388eb |
2007-05-14 15:40 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/source/compiler/harbour.y
* harbour/source/compiler/harbour.yyc
* harbour/source/compiler/hbmain.c
! fixed memory leak when error appears during generating codeblock
|
||
|
|
cbbcb1217f |
2007-05-11 18:34 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* harbour/source/compiler/hbmain.c
* harbour/source/compiler/harbour.yyc
! Fixed error message text when unclosed multiline codeblock
was detected (said: <||...> instead of {||...}).
(two more places)
|
||
|
|
2f0189d34f |
2007-05-12 10:45 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbcomp.h
* harbour/include/hbexpra.c
* harbour/include/hbexprb.c
* harbour/include/hbexprop.h
* harbour/include/hbpp.h
* harbour/source/compiler/complex.c
* harbour/source/compiler/harbour.y
* harbour/source/compiler/harbour.yyc
* harbour/source/compiler/harbour.yyh
* harbour/source/compiler/hbmain.c
* harbour/source/pp/ppcore.c
+ added support for extended multiline codeblocks:
{ |<params,...>| <EOL>
<statement1>
...
<statementN>
return <val>
}
Such codeblocks allow nested definitions. They can also have their
own variable declarations (local, static, field, memvar, parameters,
private, public) and visibility of declared variables is similar to
nested function in Pascal but please note that there is one limitation
which exists also for normal codeblocks (Clipper compatible behavior):
internal codeblock local parameters and local variables cannot be
used in nested codeblocks, f.e. such code:
eval( { |p| eval( {|| qout( p + 1 ) } ) } )
is illegal in Clipper and Harbour. This limitation also can be
eliminated but but it will be necessary to make deeper modifications
in code for local detaching changing the method of generating
codeblocks local variables in nested blocks so unlike the above
also some modifications in HVM will be necessary.
Please test.
|
||
|
|
91ec7b23a5 |
2007-05-11 22:50 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbcomp.h
* harbour/include/hbcompdf.h
* harbour/include/hbexpra.c
* harbour/include/hbexprb.c
* harbour/source/compiler/complex.c
* harbour/source/compiler/genc.c
* harbour/source/compiler/gencli.c
* harbour/source/compiler/genobj32.c
* harbour/source/compiler/harbour.y
* harbour/source/compiler/harbour.yyc
* harbour/source/compiler/harbour.yyh
* harbour/source/compiler/hbmain.c
* changed code used for variable scoping - now it's much more
simple (only one function) and allows to use declarations in
nested functions/codeblocks with visibility similar to Pascal
! fixed parsing FILED <fields,...> IN <alias>
we were accepting code like:
FIELD f1, f2 IN db1, f3 IN db2 IN db3
and for all fields the last alias (db2 in this example) was used
! fixed calculating number of static variables with -b (debugger)
compilation (number of file wide statics were doubled)
! fixed generation of static variable names for debugger when declared
with array dimensions, f.e.:
static sVar[3]
* harbour/source/rtl/hbffind.c
* minor cleanup *nix version
* harbour/contrib/bmdbfcdx/bmdbfcdx1.c
! fixed casting for C++ compilation
* harbour/source/rdd/dbfdbt/dbfdbt1.c
* updated for some old API modifications (this library is not used now
but if we keep it in CVS then I think it should be updated)
|