From 18aa26dfc09024afeea0fa19dded07c1aa4a6d14 Mon Sep 17 00:00:00 2001 From: Przemyslaw Czerpak Date: Tue, 16 Sep 2008 17:12:28 +0000 Subject: [PATCH] 2008-09-16 19:11 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/utils/hbtest/rt_class.prg ! fixed description message * harbour/common.mak * harbour/utils/hbtest/Makefile * harbour/utils/hbtest/hbtest.prg + harbour/utils/hbtest/rt_mt.prg + added simple MT test for fast checking MT builds NOTE: DMC builds crashes with and without direct TLS access If possible it has to be fixed. Now MT mode is not supported for this compiler. --- harbour/ChangeLog | 13 +++ harbour/common.mak | 3 +- harbour/utils/hbtest/Makefile | 1 + harbour/utils/hbtest/hbtest.prg | 1 + harbour/utils/hbtest/rt_class.prg | 2 +- harbour/utils/hbtest/rt_mt.prg | 126 ++++++++++++++++++++++++++++++ 6 files changed, 144 insertions(+), 2 deletions(-) create mode 100644 harbour/utils/hbtest/rt_mt.prg diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 8c4a326116..dc87c09a32 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,19 @@ 2008-12-31 13:59 UTC+0100 Foo Bar (foo.bar foobar.org) */ +2008-09-16 19:11 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/utils/hbtest/rt_class.prg + ! fixed description message + + * harbour/common.mak + * harbour/utils/hbtest/Makefile + * harbour/utils/hbtest/hbtest.prg + + harbour/utils/hbtest/rt_mt.prg + + added simple MT test for fast checking MT builds + NOTE: DMC builds crashes with and without direct TLS access + If possible it has to be fixed. Now MT mode is not supported + for this compiler. + 2008-09-16 15:57 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/include/hbthread.h * do not use native TLS support in BCC builds when CodeGuard diff --git a/harbour/common.mak b/harbour/common.mak index 5a96d7feb8..f7e406309b 100644 --- a/harbour/common.mak +++ b/harbour/common.mak @@ -1075,7 +1075,8 @@ HBTEST_EXE_OBJS = \ $(OBJ_DIR)\rt_array$(OBJEXT) \ $(OBJ_DIR)\rt_file$(OBJEXT) \ $(OBJ_DIR)\rt_misc$(OBJEXT) \ - $(OBJ_DIR)\rt_miscc$(OBJEXT) \ + $(OBJ_DIR)\rt_miscc$(OBJEXT) \ + $(OBJ_DIR)\rt_mt$(OBJEXT) \ $(OBJ_DIR)\rt_class$(OBJEXT) \ #********************************************************** diff --git a/harbour/utils/hbtest/Makefile b/harbour/utils/hbtest/Makefile index 5a683126af..f1b2d5d0c9 100644 --- a/harbour/utils/hbtest/Makefile +++ b/harbour/utils/hbtest/Makefile @@ -17,6 +17,7 @@ PRG_SOURCES=\ rt_hvma.prg \ rt_math.prg \ rt_misc.prg \ + rt_mt.prg \ rt_str.prg \ rt_stra.prg \ rt_trans.prg \ diff --git a/harbour/utils/hbtest/hbtest.prg b/harbour/utils/hbtest/hbtest.prg index c0a48d0f50..0f791a0a39 100644 --- a/harbour/utils/hbtest/hbtest.prg +++ b/harbour/utils/hbtest/hbtest.prg @@ -152,6 +152,7 @@ PROCEDURE Main( cPar1, cPar2 ) #ifdef __HARBOUR__ Main_OPOVERL() Main_CLASS() + Main_MT() #endif Main_LAST() diff --git a/harbour/utils/hbtest/rt_class.prg b/harbour/utils/hbtest/rt_class.prg index 74af53629f..338f3569e3 100644 --- a/harbour/utils/hbtest/rt_class.prg +++ b/harbour/utils/hbtest/rt_class.prg @@ -4,7 +4,7 @@ /* * Harbour Project source code: - * Regression tests for the runtime library (strings) + * Harbour class/OOP test * * Copyright 2006 Przemyslaw Czerpak * www - http://www.harbour-project.org diff --git a/harbour/utils/hbtest/rt_mt.prg b/harbour/utils/hbtest/rt_mt.prg new file mode 100644 index 0000000000..bcd3fd1e3f --- /dev/null +++ b/harbour/utils/hbtest/rt_mt.prg @@ -0,0 +1,126 @@ +/* + * $Id$ + */ + +/* + * Harbour Project source code: + * Harbour MT simple test + * + * Copyright 2008 Przemyslaw Czerpak + * www - http://www.harbour-project.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/). + * + * As a special exception, the Harbour Project gives permission for + * additional uses of the text contained in its release of Harbour. + * + * The exception is that, if you link the Harbour libraries with other + * files to produce an executable, this does not by itself cause the + * resulting executable to be covered by the GNU General Public License. + * Your use of that executable is in no way restricted on account of + * linking the Harbour library code into it. + * + * This exception does not however invalidate any other reasons why + * the executable file might be covered by the GNU General Public License. + * + * This exception applies only to the code released by the Harbour + * Project under the name Harbour. If you copy code from other + * Harbour Project or Free Software Foundation releases into a copy of + * Harbour, as the General Public License permits, the exception does + * not apply to the code that you add in this way. To avoid misleading + * anyone as to the status of such modified files, you must delete + * this exception notice from them. + * + * If you write modifications of your own for Harbour, it is your choice + * whether to permit this exception to apply to your modifications. + * If you do not wish that, delete this exception notice. + * + */ + +#include "rt_main.ch" + +/* Don't change the position of this #include. */ +#include "rt_vars.ch" + +#define N_THREADS 5 +#define N_JOBS 1000 + +PROCEDURE Main_MT() + +#ifdef __HARBOUR__ + IF HB_MTVM() + TEST_LINE( DO_MTTES1() , "OK" ) + ENDIF +#endif + + RETURN + +#ifdef __HARBOUR__ +FUNCTION DO_MTTES1() + LOCAL aThreads, aResults, i, nDigit, nSum, nExpected + LOCAL mtxJobs, mtxResults + + aThreads := {} + aResults := {} + mtxJobs := hb_mutexCreate() + mtxResults := hb_mutexCreate() + FOR i := 1 TO N_THREADS + AAdd( aThreads, hb_threadStart( @thFunc(), mtxJobs, mtxResults ) ) + NEXT + nDigit := 10 + FOR i := 1 TO N_JOBS + hb_mutexNotify( mtxJobs, nDigit ) + nDigit++ + NEXT + FOR i := 1 TO N_THREADS + hb_mutexNotify( mtxJobs, NIL ) + NEXT + FOR i := 1 TO N_JOBS + hb_mutexSubscribe( mtxResults,, @nDigit ) + AAdd( aResults, nDigit ) + NEXT + aEval( aThreads, { |x| hb_threadJoin( x ) } ) + nSum := 0 + FOR EACH nDigit IN aResults + nSum += nDigit + NEXT + nSum := round( nSum, 2 ) + nExpected := round( ( 10 + 10 + N_JOBS - 1 ) / 2 / 3 * N_JOBS, 2 ) + if ROUND( nSum - nExpected, 2 ) == 0 + RETURN "OK" + ENDIF + + RETURN "ERROR, final sum: " + ltrim( str( nSum ) ) + ; + " expected: " + ltrim( str( nExpected ) ) + +PROCEDURE thFunc( mtxJobs, mtxResults ) + LOCAL xJob, xResult + + WHILE .T. + hb_mutexSubscribe( mtxJobs,, @xJob ) + IF xJob == NIL + EXIT + ENDIF + xResult := xJob / 3 + hb_mutexNotify( mtxResults, xResult ) + ENDDO + + RETURN + +#endif /* __HARBOUR__ */ + +/* Don't change the position of this #include. */ +#include "rt_init.ch"