1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_testtools.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <stdio.h>
28*b1cdbd2cSJim Jagielski #include <math.h>
29*b1cdbd2cSJim Jagielski #include <string>
30*b1cdbd2cSJim Jagielski #include <hash_map>
31*b1cdbd2cSJim Jagielski #include <map>
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski #include <osl/diagnose.h>
34*b1cdbd2cSJim Jagielski #include <osl/mutex.hxx>
35*b1cdbd2cSJim Jagielski #include <osl/module.h>
36*b1cdbd2cSJim Jagielski #include <osl/process.h>
37*b1cdbd2cSJim Jagielski #include <osl/thread.h>
38*b1cdbd2cSJim Jagielski #include <osl/conditn.hxx>
39*b1cdbd2cSJim Jagielski #include <osl/time.h>
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski #ifdef SAL_W32
42*b1cdbd2cSJim Jagielski #include <windows.h>
43*b1cdbd2cSJim Jagielski #else
44*b1cdbd2cSJim Jagielski #include <sys/times.h>
45*b1cdbd2cSJim Jagielski #include <unistd.h>
46*b1cdbd2cSJim Jagielski #endif
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski #include <rtl/string.hxx>
49*b1cdbd2cSJim Jagielski #include <rtl/strbuf.hxx>
50*b1cdbd2cSJim Jagielski #include <rtl/ustrbuf.hxx>
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski #include <uno/environment.hxx>
53*b1cdbd2cSJim Jagielski #include <uno/mapping.hxx>
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski #include <cppuhelper/factory.hxx>
56*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase2.hxx>
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XServiceInfo.hpp>
59*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XComponent.hpp>
60*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMain.hpp>
61*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XInitialization.hpp>
62*b1cdbd2cSJim Jagielski #include <com/sun/star/loader/XImplementationLoader.hpp>
63*b1cdbd2cSJim Jagielski #include <com/sun/star/registry/XRegistryKey.hpp>
64*b1cdbd2cSJim Jagielski #include <com/sun/star/bridge/XUnoUrlResolver.hpp>
65*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XSet.hpp>
66*b1cdbd2cSJim Jagielski #include <com/sun/star/test/performance/XPerformanceTest.hpp>
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski #define NLOOP 200000000
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski using namespace rtl;
71*b1cdbd2cSJim Jagielski using namespace osl;
72*b1cdbd2cSJim Jagielski using namespace cppu;
73*b1cdbd2cSJim Jagielski using namespace com::sun::star::uno;
74*b1cdbd2cSJim Jagielski using namespace com::sun::star::lang;
75*b1cdbd2cSJim Jagielski using namespace com::sun::star::loader;
76*b1cdbd2cSJim Jagielski using namespace com::sun::star::registry;
77*b1cdbd2cSJim Jagielski using namespace com::sun::star::bridge;
78*b1cdbd2cSJim Jagielski using namespace com::sun::star::container;
79*b1cdbd2cSJim Jagielski using namespace com::sun::star::test::performance;
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski #define SERVICENAME		"com.sun.star.test.performance.PerformanceTest"
82*b1cdbd2cSJim Jagielski #define IMPLNAME		"com.sun.star.comp.performance.PerformanceTest"
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski namespace benchmark_test
85*b1cdbd2cSJim Jagielski {
86*b1cdbd2cSJim Jagielski 
getSystemTicks()87*b1cdbd2cSJim Jagielski static inline sal_uInt32 getSystemTicks()
88*b1cdbd2cSJim Jagielski {
89*b1cdbd2cSJim Jagielski #ifdef SAL_W32
90*b1cdbd2cSJim Jagielski 	return (sal_uInt32)GetTickCount();
91*b1cdbd2cSJim Jagielski #else // only UNX supported for now
92*b1cdbd2cSJim Jagielski 	static sal_uInt32	nImplTicksPerSecond = 0;
93*b1cdbd2cSJim Jagielski 	static double		dImplTicksPerSecond;
94*b1cdbd2cSJim Jagielski 	static double		dImplTicksULONGMAX;
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski 	struct tms			aTms;
97*b1cdbd2cSJim Jagielski 	sal_uInt32 nTicks = (sal_uInt32)times( &aTms );
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski 	if ( !nImplTicksPerSecond )
100*b1cdbd2cSJim Jagielski 	{
101*b1cdbd2cSJim Jagielski 		nImplTicksPerSecond = sysconf(_SC_CLK_TCK);
102*b1cdbd2cSJim Jagielski 		dImplTicksPerSecond = nImplTicksPerSecond;
103*b1cdbd2cSJim Jagielski 		dImplTicksULONGMAX	= (double)(sal_uInt32)ULONG_MAX;
104*b1cdbd2cSJim Jagielski 	}
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski 	double fTicks = nTicks;
107*b1cdbd2cSJim Jagielski 	fTicks *= 1000;
108*b1cdbd2cSJim Jagielski 	fTicks /= dImplTicksPerSecond;
109*b1cdbd2cSJim Jagielski 	fTicks = fmod (fTicks, dImplTicksULONGMAX);
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski 	return (sal_uInt32)fTicks;
112*b1cdbd2cSJim Jagielski #endif
113*b1cdbd2cSJim Jagielski }
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------------------------------
out(const sal_Char * pText,FILE * stream=stderr,sal_Int32 nStart=-1,sal_Char cFillchar=' ')116*b1cdbd2cSJim Jagielski static void out( const sal_Char * pText, FILE * stream = stderr,
117*b1cdbd2cSJim Jagielski 				 sal_Int32 nStart = -1, sal_Char cFillchar = ' ' )
118*b1cdbd2cSJim Jagielski {
119*b1cdbd2cSJim Jagielski 	static sal_Int32 s_nPos = 0;
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski 	sal_Char ar[2] = { cFillchar, 0 };
122*b1cdbd2cSJim Jagielski 	while (s_nPos < nStart)
123*b1cdbd2cSJim Jagielski 	{
124*b1cdbd2cSJim Jagielski 		::fprintf( stream, ar );
125*b1cdbd2cSJim Jagielski 		++s_nPos;
126*b1cdbd2cSJim Jagielski 	}
127*b1cdbd2cSJim Jagielski 
128*b1cdbd2cSJim Jagielski 	::fprintf( stream, pText );
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski 	for ( const sal_Char * p = pText; *p; ++p )
131*b1cdbd2cSJim Jagielski 	{
132*b1cdbd2cSJim Jagielski 		if (*p == '\n')
133*b1cdbd2cSJim Jagielski 			s_nPos = 0;
134*b1cdbd2cSJim Jagielski 		else
135*b1cdbd2cSJim Jagielski 			++s_nPos;
136*b1cdbd2cSJim Jagielski 	}
137*b1cdbd2cSJim Jagielski }
138*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------------------------------
out(const OUString & rText,FILE * stream=stderr,sal_Int32 nStart=-1,sal_Char cFillchar=' ')139*b1cdbd2cSJim Jagielski static inline void out( const OUString & rText, FILE * stream = stderr,
140*b1cdbd2cSJim Jagielski 						sal_Int32 nStart = -1, sal_Char cFillchar = ' ' )
141*b1cdbd2cSJim Jagielski {
142*b1cdbd2cSJim Jagielski 	OString aText( OUStringToOString( rText, RTL_TEXTENCODING_ASCII_US ) );
143*b1cdbd2cSJim Jagielski 	out( aText.getStr(), stream, nStart, cFillchar );
144*b1cdbd2cSJim Jagielski }
145*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------------------------------
out(double fVal,FILE * stream=stderr,sal_Int32 nStart=-1,sal_Char cFillchar=' ')146*b1cdbd2cSJim Jagielski static inline void out( double fVal, FILE * stream = stderr,
147*b1cdbd2cSJim Jagielski 						sal_Int32 nStart = -1, sal_Char cFillchar = ' ' )
148*b1cdbd2cSJim Jagielski {
149*b1cdbd2cSJim Jagielski 	sal_Char ar[128];
150*b1cdbd2cSJim Jagielski     ::snprintf( ar, sizeof(ar), (fVal < 0.000001 ? "%g" : "%f"), fVal );
151*b1cdbd2cSJim Jagielski 	out( ar, stream, nStart, cFillchar );
152*b1cdbd2cSJim Jagielski }
153*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------------------------------
out(sal_Int64 nVal,FILE * stream=stderr,sal_Int32 nStart=-1,sal_Char cFillchar=' ')154*b1cdbd2cSJim Jagielski static inline void out( sal_Int64 nVal, FILE * stream = stderr,
155*b1cdbd2cSJim Jagielski 						sal_Int32 nStart = -1, sal_Char cFillchar = ' ' )
156*b1cdbd2cSJim Jagielski {
157*b1cdbd2cSJim Jagielski 	sal_Char ar[128];
158*b1cdbd2cSJim Jagielski     ::snprintf( ar, sizeof(ar), "%ld", nVal );
159*b1cdbd2cSJim Jagielski 	out( ar, stream, nStart, cFillchar );
160*b1cdbd2cSJim Jagielski }
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski //==================================================================================================
loadLibComponentFactory(const OUString & rLibName,const OUString & rImplName,const Reference<XMultiServiceFactory> & xSF,const Reference<XRegistryKey> & xKey)163*b1cdbd2cSJim Jagielski Reference< XSingleServiceFactory > loadLibComponentFactory(
164*b1cdbd2cSJim Jagielski 	const OUString & rLibName, const OUString & rImplName,
165*b1cdbd2cSJim Jagielski 	const Reference< XMultiServiceFactory > & xSF, const Reference< XRegistryKey > & xKey )
166*b1cdbd2cSJim Jagielski {
167*b1cdbd2cSJim Jagielski 	Reference< XSingleServiceFactory > xRet;
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski 	OUStringBuffer aLibNameBuf( 32 );
170*b1cdbd2cSJim Jagielski #ifdef SAL_UNX
171*b1cdbd2cSJim Jagielski 	aLibNameBuf.appendAscii( RTL_CONSTASCII_STRINGPARAM("lib") );
172*b1cdbd2cSJim Jagielski 	aLibNameBuf.append( rLibName );
173*b1cdbd2cSJim Jagielski 	aLibNameBuf.appendAscii( RTL_CONSTASCII_STRINGPARAM(".so") );
174*b1cdbd2cSJim Jagielski #else
175*b1cdbd2cSJim Jagielski 	aLibNameBuf.append( rLibName );
176*b1cdbd2cSJim Jagielski 	aLibNameBuf.appendAscii( RTL_CONSTASCII_STRINGPARAM(".dll") );
177*b1cdbd2cSJim Jagielski #endif
178*b1cdbd2cSJim Jagielski 	OUString aLibName( aLibNameBuf.makeStringAndClear() );
179*b1cdbd2cSJim Jagielski 	oslModule lib = osl_loadModule( aLibName.pData, SAL_LOADMODULE_LAZY | SAL_LOADMODULE_GLOBAL );
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski 	if (lib)
182*b1cdbd2cSJim Jagielski 	{
183*b1cdbd2cSJim Jagielski 		void * pSym;
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski 		// ========================= LATEST VERSION =========================
186*b1cdbd2cSJim Jagielski 		OUString aGetEnvName( RTL_CONSTASCII_USTRINGPARAM(COMPONENT_GETENV) );
187*b1cdbd2cSJim Jagielski 		if (pSym = osl_getSymbol( lib, aGetEnvName.pData ))
188*b1cdbd2cSJim Jagielski 		{
189*b1cdbd2cSJim Jagielski 			uno_Environment * pCurrentEnv = 0;
190*b1cdbd2cSJim Jagielski 			uno_Environment * pEnv = 0;
191*b1cdbd2cSJim Jagielski 			const sal_Char * pEnvTypeName = 0;
192*b1cdbd2cSJim Jagielski 			(*((component_getImplementationEnvironmentFunc)pSym))( &pEnvTypeName, &pEnv );
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski 			sal_Bool bNeedsMapping =
195*b1cdbd2cSJim Jagielski 				(pEnv || 0 != rtl_str_compare( pEnvTypeName, CPPU_CURRENT_LANGUAGE_BINDING_NAME ));
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski 			OUString aEnvTypeName( OUString::createFromAscii( pEnvTypeName ) );
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski 			if (bNeedsMapping)
200*b1cdbd2cSJim Jagielski 			{
201*b1cdbd2cSJim Jagielski 				if (! pEnv)
202*b1cdbd2cSJim Jagielski 					uno_getEnvironment( &pEnv, aEnvTypeName.pData, 0 );
203*b1cdbd2cSJim Jagielski 				if (pEnv)
204*b1cdbd2cSJim Jagielski 				{
205*b1cdbd2cSJim Jagielski 					OUString aCppEnvTypeName( RTL_CONSTASCII_USTRINGPARAM(CPPU_CURRENT_LANGUAGE_BINDING_NAME) );
206*b1cdbd2cSJim Jagielski 					uno_getEnvironment( &pCurrentEnv, aCppEnvTypeName.pData, 0 );
207*b1cdbd2cSJim Jagielski 					if (pCurrentEnv)
208*b1cdbd2cSJim Jagielski 						bNeedsMapping = (pEnv != pCurrentEnv);
209*b1cdbd2cSJim Jagielski 				}
210*b1cdbd2cSJim Jagielski 			}
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski 			OUString aGetFactoryName( RTL_CONSTASCII_USTRINGPARAM(COMPONENT_GETFACTORY) );
213*b1cdbd2cSJim Jagielski 			if (pSym = osl_getSymbol( lib, aGetFactoryName.pData ))
214*b1cdbd2cSJim Jagielski 			{
215*b1cdbd2cSJim Jagielski 				OString aImplName( OUStringToOString( rImplName, RTL_TEXTENCODING_ASCII_US ) );
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski 				if (bNeedsMapping)
218*b1cdbd2cSJim Jagielski 				{
219*b1cdbd2cSJim Jagielski 					if (pEnv && pCurrentEnv)
220*b1cdbd2cSJim Jagielski 					{
221*b1cdbd2cSJim Jagielski 						Mapping aCurrent2Env( pCurrentEnv, pEnv );
222*b1cdbd2cSJim Jagielski 						Mapping aEnv2Current( pEnv, pCurrentEnv );
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski 						if (aCurrent2Env.is() && aEnv2Current.is())
225*b1cdbd2cSJim Jagielski 						{
226*b1cdbd2cSJim Jagielski 							void * pSMgr = aCurrent2Env.mapInterface(
227*b1cdbd2cSJim Jagielski 								xSF.get(), ::getCppuType( (const Reference< XMultiServiceFactory > *)0 ) );
228*b1cdbd2cSJim Jagielski 							void * pKey = aCurrent2Env.mapInterface(
229*b1cdbd2cSJim Jagielski 								xKey.get(), ::getCppuType( (const Reference< XRegistryKey > *)0 ) );
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski 							void * pSSF = (*((component_getFactoryFunc)pSym))(
232*b1cdbd2cSJim Jagielski 								aImplName.getStr(), pSMgr, pKey );
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski 							if (pKey)
235*b1cdbd2cSJim Jagielski 								(*pEnv->pExtEnv->releaseInterface)( pEnv->pExtEnv, pKey );
236*b1cdbd2cSJim Jagielski 							if (pSMgr)
237*b1cdbd2cSJim Jagielski 								(*pEnv->pExtEnv->releaseInterface)( pEnv->pExtEnv, pSMgr );
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski 							if (pSSF)
240*b1cdbd2cSJim Jagielski 							{
241*b1cdbd2cSJim Jagielski 								aEnv2Current.mapInterface(
242*b1cdbd2cSJim Jagielski 									reinterpret_cast< void ** >( &xRet ),
243*b1cdbd2cSJim Jagielski 									pSSF, ::getCppuType( (const Reference< XSingleServiceFactory > *)0 ) );
244*b1cdbd2cSJim Jagielski 								(*pEnv->pExtEnv->releaseInterface)( pEnv->pExtEnv, pSSF );
245*b1cdbd2cSJim Jagielski 							}
246*b1cdbd2cSJim Jagielski 						}
247*b1cdbd2cSJim Jagielski 					}
248*b1cdbd2cSJim Jagielski 				}
249*b1cdbd2cSJim Jagielski 				else
250*b1cdbd2cSJim Jagielski 				{
251*b1cdbd2cSJim Jagielski 					XSingleServiceFactory * pRet = (XSingleServiceFactory *)
252*b1cdbd2cSJim Jagielski 						(*((component_getFactoryFunc)pSym))(
253*b1cdbd2cSJim Jagielski 							aImplName.getStr(), xSF.get(), xKey.get() );
254*b1cdbd2cSJim Jagielski 					if (pRet)
255*b1cdbd2cSJim Jagielski 					{
256*b1cdbd2cSJim Jagielski 						xRet = pRet;
257*b1cdbd2cSJim Jagielski 						pRet->release();
258*b1cdbd2cSJim Jagielski 					}
259*b1cdbd2cSJim Jagielski 				}
260*b1cdbd2cSJim Jagielski 			}
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski 			if (pEnv)
263*b1cdbd2cSJim Jagielski 				(*pEnv->release)( pEnv );
264*b1cdbd2cSJim Jagielski 			if (pCurrentEnv)
265*b1cdbd2cSJim Jagielski 				(*pCurrentEnv->release)( pCurrentEnv );
266*b1cdbd2cSJim Jagielski 		}
267*b1cdbd2cSJim Jagielski 
268*b1cdbd2cSJim Jagielski 		// ========================= PREVIOUS VERSION =========================
269*b1cdbd2cSJim Jagielski 		else
270*b1cdbd2cSJim Jagielski 		{
271*b1cdbd2cSJim Jagielski 			OUString aGetFactoryName( RTL_CONSTASCII_USTRINGPARAM(CREATE_COMPONENT_FACTORY_FUNCTION) );
272*b1cdbd2cSJim Jagielski 			if (pSym = osl_getSymbol( lib, aGetFactoryName.pData ))
273*b1cdbd2cSJim Jagielski 			{
274*b1cdbd2cSJim Jagielski 				OUString aCppEnvTypeName( RTL_CONSTASCII_USTRINGPARAM(CPPU_CURRENT_LANGUAGE_BINDING_NAME) );
275*b1cdbd2cSJim Jagielski 				OUString aUnoEnvTypeName( RTL_CONSTASCII_USTRINGPARAM(UNO_LB_UNO) );
276*b1cdbd2cSJim Jagielski 				Mapping aUno2Cpp( aUnoEnvTypeName, aCppEnvTypeName );
277*b1cdbd2cSJim Jagielski 				Mapping aCpp2Uno( aCppEnvTypeName, aUnoEnvTypeName );
278*b1cdbd2cSJim Jagielski 				OSL_ENSURE( aUno2Cpp.is() && aCpp2Uno.is(), "### cannot get uno mappings!" );
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski 				if (aUno2Cpp.is() && aCpp2Uno.is())
281*b1cdbd2cSJim Jagielski 				{
282*b1cdbd2cSJim Jagielski 					uno_Interface * pUComponentFactory = 0;
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski 					uno_Interface * pUSFactory = (uno_Interface *)aCpp2Uno.mapInterface(
285*b1cdbd2cSJim Jagielski 						xSF.get(), ::getCppuType( (const Reference< XMultiServiceFactory > *)0 ) );
286*b1cdbd2cSJim Jagielski 					uno_Interface * pUKey = (uno_Interface *)aCpp2Uno.mapInterface(
287*b1cdbd2cSJim Jagielski 						xKey.get(), ::getCppuType( (const Reference< XRegistryKey > *)0 ) );
288*b1cdbd2cSJim Jagielski 
289*b1cdbd2cSJim Jagielski 					pUComponentFactory = (*((CreateComponentFactoryFunc)pSym))(
290*b1cdbd2cSJim Jagielski 						rImplName.getStr(), pUSFactory, pUKey );
291*b1cdbd2cSJim Jagielski 
292*b1cdbd2cSJim Jagielski 					if (pUKey)
293*b1cdbd2cSJim Jagielski 						(*pUKey->release)( pUKey );
294*b1cdbd2cSJim Jagielski 					if (pUSFactory)
295*b1cdbd2cSJim Jagielski 						(*pUSFactory->release)( pUSFactory );
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski 					if (pUComponentFactory)
298*b1cdbd2cSJim Jagielski 					{
299*b1cdbd2cSJim Jagielski 						XSingleServiceFactory * pXFactory =
300*b1cdbd2cSJim Jagielski 							(XSingleServiceFactory *)aUno2Cpp.mapInterface(
301*b1cdbd2cSJim Jagielski 								pUComponentFactory, ::getCppuType( (const Reference< XSingleServiceFactory > *)0 ) );
302*b1cdbd2cSJim Jagielski 						(*pUComponentFactory->release)( pUComponentFactory );
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski 						if (pXFactory)
305*b1cdbd2cSJim Jagielski 						{
306*b1cdbd2cSJim Jagielski 							xRet = pXFactory;
307*b1cdbd2cSJim Jagielski 							pXFactory->release();
308*b1cdbd2cSJim Jagielski 						}
309*b1cdbd2cSJim Jagielski 					}
310*b1cdbd2cSJim Jagielski 				}
311*b1cdbd2cSJim Jagielski 			}
312*b1cdbd2cSJim Jagielski 		}
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski 		if (! xRet.is())
315*b1cdbd2cSJim Jagielski 			osl_unloadModule( lib );
316*b1cdbd2cSJim Jagielski 	}
317*b1cdbd2cSJim Jagielski 
318*b1cdbd2cSJim Jagielski 	return xRet;
319*b1cdbd2cSJim Jagielski }
320*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------------------------------
321*b1cdbd2cSJim Jagielski template< class T >
createInstance(Reference<T> & rxOut,const Reference<XMultiServiceFactory> & xMgr,const OUString & rServiceName)322*b1cdbd2cSJim Jagielski static void createInstance( Reference< T > & rxOut,
323*b1cdbd2cSJim Jagielski 							const Reference< XMultiServiceFactory > & xMgr,
324*b1cdbd2cSJim Jagielski 							const OUString & rServiceName )
325*b1cdbd2cSJim Jagielski 	throw (RuntimeException)
326*b1cdbd2cSJim Jagielski {
327*b1cdbd2cSJim Jagielski 	Reference< XInterface > x( xMgr->createInstance( rServiceName ), UNO_QUERY );
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski 	if (! x.is())
330*b1cdbd2cSJim Jagielski 	{
331*b1cdbd2cSJim Jagielski 		static sal_Bool s_bSet = sal_False;
332*b1cdbd2cSJim Jagielski 		if (! s_bSet)
333*b1cdbd2cSJim Jagielski 		{
334*b1cdbd2cSJim Jagielski 			MutexGuard aGuard( Mutex::getGlobalMutex() );
335*b1cdbd2cSJim Jagielski 			if (! s_bSet)
336*b1cdbd2cSJim Jagielski 			{
337*b1cdbd2cSJim Jagielski 				Reference< XSet > xSet( xMgr, UNO_QUERY );
338*b1cdbd2cSJim Jagielski 				if (xSet.is())
339*b1cdbd2cSJim Jagielski 				{
340*b1cdbd2cSJim Jagielski 					// acceptor
341*b1cdbd2cSJim Jagielski 					xSet->insert( makeAny( loadLibComponentFactory(
342*b1cdbd2cSJim Jagielski 						OUString( RTL_CONSTASCII_USTRINGPARAM("acceptor") ),
343*b1cdbd2cSJim Jagielski 						OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.stoc.Acceptor") ),
344*b1cdbd2cSJim Jagielski 						xMgr, Reference< XRegistryKey >() ) ) );
345*b1cdbd2cSJim Jagielski 					// connector
346*b1cdbd2cSJim Jagielski 					xSet->insert( makeAny( loadLibComponentFactory(
347*b1cdbd2cSJim Jagielski 						OUString( RTL_CONSTASCII_USTRINGPARAM("connectr") ),
348*b1cdbd2cSJim Jagielski 						OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.stoc.Connector") ),
349*b1cdbd2cSJim Jagielski 						xMgr, Reference< XRegistryKey >() ) ) );
350*b1cdbd2cSJim Jagielski 					// iiop bridge
351*b1cdbd2cSJim Jagielski 					xSet->insert( makeAny( loadLibComponentFactory(
352*b1cdbd2cSJim Jagielski 						OUString( RTL_CONSTASCII_USTRINGPARAM("remotebridge") ),
353*b1cdbd2cSJim Jagielski 						OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.bridge.Bridge.various") ),
354*b1cdbd2cSJim Jagielski 						xMgr, Reference< XRegistryKey >() ) ) );
355*b1cdbd2cSJim Jagielski 					// bridge factory
356*b1cdbd2cSJim Jagielski 					xSet->insert( makeAny( loadLibComponentFactory(
357*b1cdbd2cSJim Jagielski 						OUString( RTL_CONSTASCII_USTRINGPARAM("brdgfctr") ),
358*b1cdbd2cSJim Jagielski 						OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.stoc.BridgeFactory") ),
359*b1cdbd2cSJim Jagielski 						xMgr, Reference< XRegistryKey >() ) ) );
360*b1cdbd2cSJim Jagielski 					// uno url resolver
361*b1cdbd2cSJim Jagielski 					xSet->insert( makeAny( loadLibComponentFactory(
362*b1cdbd2cSJim Jagielski 						OUString( RTL_CONSTASCII_USTRINGPARAM("uuresolver") ),
363*b1cdbd2cSJim Jagielski 						OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.bridge.UnoUrlResolver") ),
364*b1cdbd2cSJim Jagielski 						xMgr, Reference< XRegistryKey >() ) ) );
365*b1cdbd2cSJim Jagielski 					// java loader
366*b1cdbd2cSJim Jagielski //  					xSet->insert( makeAny( loadLibComponentFactory(
367*b1cdbd2cSJim Jagielski //  						OUString( RTL_CONSTASCII_USTRINGPARAM("javaloader") ),
368*b1cdbd2cSJim Jagielski //  						OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.stoc.JavaComponentLoader") ),
369*b1cdbd2cSJim Jagielski //  						xMgr, Reference< XRegistryKey >() ) ) );
370*b1cdbd2cSJim Jagielski 				}
371*b1cdbd2cSJim Jagielski 				s_bSet = sal_True;
372*b1cdbd2cSJim Jagielski 			}
373*b1cdbd2cSJim Jagielski 		}
374*b1cdbd2cSJim Jagielski 		x = xMgr->createInstance( rServiceName );
375*b1cdbd2cSJim Jagielski 	}
376*b1cdbd2cSJim Jagielski 
377*b1cdbd2cSJim Jagielski 	if (! x.is())
378*b1cdbd2cSJim Jagielski 	{
379*b1cdbd2cSJim Jagielski 		OUStringBuffer buf( 64 );
380*b1cdbd2cSJim Jagielski 		buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("cannot get service instance \"") );
381*b1cdbd2cSJim Jagielski 		buf.append( rServiceName );
382*b1cdbd2cSJim Jagielski 		buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\"!") );
383*b1cdbd2cSJim Jagielski 		throw RuntimeException( buf.makeStringAndClear(), Reference< XInterface >() );
384*b1cdbd2cSJim Jagielski 	}
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski 	rxOut = Reference< T >::query( x );
387*b1cdbd2cSJim Jagielski 	if (! rxOut.is())
388*b1cdbd2cSJim Jagielski 	{
389*b1cdbd2cSJim Jagielski 		OUStringBuffer buf( 64 );
390*b1cdbd2cSJim Jagielski 		buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("service instance \"") );
391*b1cdbd2cSJim Jagielski 		buf.append( rServiceName );
392*b1cdbd2cSJim Jagielski 		buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\" does not support demanded interface \"") );
393*b1cdbd2cSJim Jagielski 		const Type & rType = ::getCppuType( (const Reference< T > *)0 );
394*b1cdbd2cSJim Jagielski 		buf.append( rType.getTypeName() );
395*b1cdbd2cSJim Jagielski 		buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\"!") );
396*b1cdbd2cSJim Jagielski 		throw RuntimeException( buf.makeStringAndClear(), Reference< XInterface >() );
397*b1cdbd2cSJim Jagielski 	}
398*b1cdbd2cSJim Jagielski }
399*b1cdbd2cSJim Jagielski 
400*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------------------------------
getSupportedServiceNames()401*b1cdbd2cSJim Jagielski inline static Sequence< OUString > getSupportedServiceNames()
402*b1cdbd2cSJim Jagielski {
403*b1cdbd2cSJim Jagielski 	OUString aName( RTL_CONSTASCII_USTRINGPARAM(SERVICENAME) );
404*b1cdbd2cSJim Jagielski 	return Sequence< OUString >( &aName, 1 );
405*b1cdbd2cSJim Jagielski }
406*b1cdbd2cSJim Jagielski 
407*b1cdbd2cSJim Jagielski //==================================================================================================
408*b1cdbd2cSJim Jagielski class TestImpl : public WeakImplHelper2< XServiceInfo, XMain >
409*b1cdbd2cSJim Jagielski {
410*b1cdbd2cSJim Jagielski 	Reference< XMultiServiceFactory > _xSMgr;
411*b1cdbd2cSJim Jagielski 
412*b1cdbd2cSJim Jagielski 	Reference< XInterface > _xDirect;
413*b1cdbd2cSJim Jagielski 	Reference< XInterface > getDirect() throw (Exception);
414*b1cdbd2cSJim Jagielski 	Reference< XInterface > resolveObject( const OUString & rUnoUrl ) throw (Exception);
415*b1cdbd2cSJim Jagielski 
416*b1cdbd2cSJim Jagielski public:
417*b1cdbd2cSJim Jagielski 	TestImpl( const Reference< XMultiServiceFactory > & xSMgr );
418*b1cdbd2cSJim Jagielski 	virtual ~TestImpl();
419*b1cdbd2cSJim Jagielski 
420*b1cdbd2cSJim Jagielski 	// XServiceInfo
421*b1cdbd2cSJim Jagielski 	virtual OUString SAL_CALL getImplementationName() throw (RuntimeException);
422*b1cdbd2cSJim Jagielski 	virtual sal_Bool SAL_CALL supportsService( const OUString & rServiceName ) throw (RuntimeException);
423*b1cdbd2cSJim Jagielski 	virtual Sequence< OUString > SAL_CALL getSupportedServiceNames() throw (RuntimeException);
424*b1cdbd2cSJim Jagielski 
425*b1cdbd2cSJim Jagielski 	// XMain
426*b1cdbd2cSJim Jagielski     virtual sal_Int32 SAL_CALL run( const Sequence< OUString > & rArgs ) throw (RuntimeException);
427*b1cdbd2cSJim Jagielski };
428*b1cdbd2cSJim Jagielski 
429*b1cdbd2cSJim Jagielski //##################################################################################################
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
TestImpl(const Reference<XMultiServiceFactory> & xSMgr)432*b1cdbd2cSJim Jagielski TestImpl::TestImpl( const Reference< XMultiServiceFactory > & xSMgr )
433*b1cdbd2cSJim Jagielski 	: _xSMgr( xSMgr )
434*b1cdbd2cSJim Jagielski {
435*b1cdbd2cSJim Jagielski }
436*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
~TestImpl()437*b1cdbd2cSJim Jagielski TestImpl::~TestImpl()
438*b1cdbd2cSJim Jagielski {
439*b1cdbd2cSJim Jagielski }
440*b1cdbd2cSJim Jagielski 
441*b1cdbd2cSJim Jagielski //==================================================================================================
TestImpl_create(const Reference<XMultiServiceFactory> & xSMgr)442*b1cdbd2cSJim Jagielski static Reference< XInterface > SAL_CALL TestImpl_create( const Reference< XMultiServiceFactory > & xSMgr )
443*b1cdbd2cSJim Jagielski {
444*b1cdbd2cSJim Jagielski 	return Reference< XInterface >( *new TestImpl( xSMgr ) );
445*b1cdbd2cSJim Jagielski }
446*b1cdbd2cSJim Jagielski 
447*b1cdbd2cSJim Jagielski // XServiceInfo
448*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
getImplementationName()449*b1cdbd2cSJim Jagielski OUString TestImpl::getImplementationName()
450*b1cdbd2cSJim Jagielski 	throw (RuntimeException)
451*b1cdbd2cSJim Jagielski {
452*b1cdbd2cSJim Jagielski 	return OUString( RTL_CONSTASCII_USTRINGPARAM(IMPLNAME) );
453*b1cdbd2cSJim Jagielski }
454*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
supportsService(const OUString & rServiceName)455*b1cdbd2cSJim Jagielski sal_Bool TestImpl::supportsService( const OUString & rServiceName )
456*b1cdbd2cSJim Jagielski 	throw (RuntimeException)
457*b1cdbd2cSJim Jagielski {
458*b1cdbd2cSJim Jagielski 	const Sequence< OUString > & rSNL = getSupportedServiceNames();
459*b1cdbd2cSJim Jagielski 	const OUString * pArray = rSNL.getConstArray();
460*b1cdbd2cSJim Jagielski 	for ( sal_Int32 nPos = rSNL.getLength(); nPos--; )
461*b1cdbd2cSJim Jagielski 	{
462*b1cdbd2cSJim Jagielski 		if (pArray[nPos] == rServiceName)
463*b1cdbd2cSJim Jagielski 			return sal_True;
464*b1cdbd2cSJim Jagielski 	}
465*b1cdbd2cSJim Jagielski 	return sal_False;
466*b1cdbd2cSJim Jagielski }
467*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
getSupportedServiceNames()468*b1cdbd2cSJim Jagielski Sequence< OUString > TestImpl::getSupportedServiceNames()
469*b1cdbd2cSJim Jagielski 	throw (RuntimeException)
470*b1cdbd2cSJim Jagielski {
471*b1cdbd2cSJim Jagielski 	return benchmark_test::getSupportedServiceNames();
472*b1cdbd2cSJim Jagielski }
473*b1cdbd2cSJim Jagielski 
474*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
getDirect()475*b1cdbd2cSJim Jagielski Reference< XInterface > TestImpl::getDirect()
476*b1cdbd2cSJim Jagielski 	throw (Exception)
477*b1cdbd2cSJim Jagielski {
478*b1cdbd2cSJim Jagielski 	if (! _xDirect.is())
479*b1cdbd2cSJim Jagielski 	{
480*b1cdbd2cSJim Jagielski 		MutexGuard aGuard( Mutex::getGlobalMutex() );
481*b1cdbd2cSJim Jagielski 		if (! _xDirect.is())
482*b1cdbd2cSJim Jagielski 		{
483*b1cdbd2cSJim Jagielski 			Reference< XSingleServiceFactory > xFac( loadLibComponentFactory(
484*b1cdbd2cSJim Jagielski 				OUString( RTL_CONSTASCII_USTRINGPARAM("perfobj") ),
485*b1cdbd2cSJim Jagielski 				OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.performance.PerformanceTestObject") ),
486*b1cdbd2cSJim Jagielski 				_xSMgr, Reference< XRegistryKey >() ) );
487*b1cdbd2cSJim Jagielski 			if (! xFac.is())
488*b1cdbd2cSJim Jagielski 				throw RuntimeException( OUString( RTL_CONSTASCII_USTRINGPARAM("no test object available!") ), Reference< XInterface >() );
489*b1cdbd2cSJim Jagielski 			_xDirect = xFac->createInstance();
490*b1cdbd2cSJim Jagielski 		}
491*b1cdbd2cSJim Jagielski 	}
492*b1cdbd2cSJim Jagielski 	return _xDirect;
493*b1cdbd2cSJim Jagielski }
494*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------------------------------
resolveObject(const OUString & rUnoUrl)495*b1cdbd2cSJim Jagielski Reference< XInterface > TestImpl::resolveObject( const OUString & rUnoUrl )
496*b1cdbd2cSJim Jagielski 	throw (Exception)
497*b1cdbd2cSJim Jagielski {
498*b1cdbd2cSJim Jagielski 	Reference< XUnoUrlResolver > xResolver;
499*b1cdbd2cSJim Jagielski 	createInstance(
500*b1cdbd2cSJim Jagielski 		xResolver, _xSMgr,
501*b1cdbd2cSJim Jagielski 		OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.bridge.UnoUrlResolver") ) );
502*b1cdbd2cSJim Jagielski 
503*b1cdbd2cSJim Jagielski 	Reference< XInterface > xResolvedObject( xResolver->resolve( rUnoUrl ) );
504*b1cdbd2cSJim Jagielski 
505*b1cdbd2cSJim Jagielski 	if (! xResolvedObject.is())
506*b1cdbd2cSJim Jagielski 	{
507*b1cdbd2cSJim Jagielski 		OUStringBuffer buf( 32 );
508*b1cdbd2cSJim Jagielski 		buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("cannot resolve object \"") );
509*b1cdbd2cSJim Jagielski 		buf.append( rUnoUrl );
510*b1cdbd2cSJim Jagielski 		buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\"!") );
511*b1cdbd2cSJim Jagielski 		throw RuntimeException( buf.makeStringAndClear(), Reference< XInterface >() );
512*b1cdbd2cSJim Jagielski 	}
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski 	return xResolvedObject;
515*b1cdbd2cSJim Jagielski }
516*b1cdbd2cSJim Jagielski 
517*b1cdbd2cSJim Jagielski //==================================================================================================
518*b1cdbd2cSJim Jagielski class TimeEntry
519*b1cdbd2cSJim Jagielski {
520*b1cdbd2cSJim Jagielski 	sal_Int64			nLoop;
521*b1cdbd2cSJim Jagielski 	sal_uInt32			nTicks;
522*b1cdbd2cSJim Jagielski 
523*b1cdbd2cSJim Jagielski public:
TimeEntry()524*b1cdbd2cSJim Jagielski 	TimeEntry()
525*b1cdbd2cSJim Jagielski 		{}
TimeEntry(sal_Int64 nLoop_,sal_uInt32 nTicks_)526*b1cdbd2cSJim Jagielski 	TimeEntry( sal_Int64 nLoop_, sal_uInt32 nTicks_ )
527*b1cdbd2cSJim Jagielski 		: nLoop( nLoop_ )
528*b1cdbd2cSJim Jagielski 		, nTicks( nTicks_ )
529*b1cdbd2cSJim Jagielski 		{}
530*b1cdbd2cSJim Jagielski 
secPerCall() const531*b1cdbd2cSJim Jagielski 	inline double secPerCall() const
532*b1cdbd2cSJim Jagielski 		{ return (((double)nTicks) / (nLoop * 1000)); }
533*b1cdbd2cSJim Jagielski 
534*b1cdbd2cSJim Jagielski 	double ratio( const TimeEntry & rEntry ) const;
535*b1cdbd2cSJim Jagielski };
536*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
ratio(const TimeEntry & rEntry) const537*b1cdbd2cSJim Jagielski double TimeEntry::ratio( const TimeEntry & rEntry ) const
538*b1cdbd2cSJim Jagielski {
539*b1cdbd2cSJim Jagielski 	double f = rEntry.nTicks * nLoop;
540*b1cdbd2cSJim Jagielski 	if (f == 0.0)
541*b1cdbd2cSJim Jagielski 	{
542*b1cdbd2cSJim Jagielski 		return 0.0;
543*b1cdbd2cSJim Jagielski 	}
544*b1cdbd2cSJim Jagielski 	else
545*b1cdbd2cSJim Jagielski 	{
546*b1cdbd2cSJim Jagielski 		return (((double)(nTicks * rEntry.nLoop)) / f);
547*b1cdbd2cSJim Jagielski 	}
548*b1cdbd2cSJim Jagielski }
549*b1cdbd2cSJim Jagielski 
550*b1cdbd2cSJim Jagielski //==================================================================================================
551*b1cdbd2cSJim Jagielski typedef std::map< std::string, TimeEntry > t_TimeEntryMap;
552*b1cdbd2cSJim Jagielski 
553*b1cdbd2cSJim Jagielski //==================================================================================================
554*b1cdbd2cSJim Jagielski struct TimingSheet
555*b1cdbd2cSJim Jagielski {
556*b1cdbd2cSJim Jagielski 	t_TimeEntryMap		_entries;
557*b1cdbd2cSJim Jagielski 	void insert( const sal_Char * pText, sal_Int64 nLoop, sal_uInt32 nTicks );
558*b1cdbd2cSJim Jagielski };
559*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
insert(const sal_Char * pText,sal_Int64 nLoop,sal_uInt32 nTicks)560*b1cdbd2cSJim Jagielski void TimingSheet::insert( const sal_Char * pText, sal_Int64 nLoop, sal_uInt32 nTicks )
561*b1cdbd2cSJim Jagielski {
562*b1cdbd2cSJim Jagielski 	_entries[ pText ] = TimeEntry( nLoop, nTicks );
563*b1cdbd2cSJim Jagielski }
564*b1cdbd2cSJim Jagielski 
565*b1cdbd2cSJim Jagielski //==================================================================================================
566*b1cdbd2cSJim Jagielski typedef std::hash_map< std::string, TimingSheet > t_TimingSheetMap;
567*b1cdbd2cSJim Jagielski 
568*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------------------------------
benchmark(TimingSheet & rSheet,const Reference<XInterface> & xInstance,sal_Int64 nLoop)569*b1cdbd2cSJim Jagielski static void benchmark(
570*b1cdbd2cSJim Jagielski 	TimingSheet & rSheet, const Reference< XInterface > & xInstance, sal_Int64 nLoop )
571*b1cdbd2cSJim Jagielski 	throw (Exception)
572*b1cdbd2cSJim Jagielski {
573*b1cdbd2cSJim Jagielski 	Reference< XPerformanceTest > xBench( xInstance, UNO_QUERY );
574*b1cdbd2cSJim Jagielski 	if (! xBench.is())
575*b1cdbd2cSJim Jagielski 		throw RuntimeException( OUString( RTL_CONSTASCII_USTRINGPARAM("illegal test object!") ), Reference< XInterface >() );
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski 	sal_Int64 i;
578*b1cdbd2cSJim Jagielski 	sal_uInt32 tStart, tEnd;
579*b1cdbd2cSJim Jagielski 
580*b1cdbd2cSJim Jagielski 	const Type & rKnownType = ::getCppuType( (const Reference< XPerformanceTest > *)0 );
581*b1cdbd2cSJim Jagielski 	const Type & rUnKnownType = ::getCppuType( (const Reference< XSet > *)0 );
582*b1cdbd2cSJim Jagielski 
583*b1cdbd2cSJim Jagielski 	ComplexTypes aDummyStruct;
584*b1cdbd2cSJim Jagielski 
585*b1cdbd2cSJim Jagielski 	//------------------------------------
586*b1cdbd2cSJim Jagielski 	// oneway calls
587*b1cdbd2cSJim Jagielski 	i = nLoop;
588*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
589*b1cdbd2cSJim Jagielski 	while (i--)
590*b1cdbd2cSJim Jagielski 		xBench->async();
591*b1cdbd2cSJim Jagielski 	sal_uInt32 tEndSend = getSystemTicks();
592*b1cdbd2cSJim Jagielski 	xBench->sync();
593*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
594*b1cdbd2cSJim Jagielski 	rSheet.insert( "1a: sending simple oneway calls (no params, no return)", nLoop, tEndSend - tStart );
595*b1cdbd2cSJim Jagielski 	rSheet.insert( "1b: simple oneway calls (no params, no return)", nLoop, tEnd - tStart );
596*b1cdbd2cSJim Jagielski 	// synchron calls
597*b1cdbd2cSJim Jagielski 	i = nLoop;
598*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
599*b1cdbd2cSJim Jagielski 	while (i--)
600*b1cdbd2cSJim Jagielski 		xBench->sync();
601*b1cdbd2cSJim Jagielski 	xBench->sync();
602*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
603*b1cdbd2cSJim Jagielski 	rSheet.insert( "1c: simple synchron calls (no params no return)", nLoop+1, tEnd - tStart );
604*b1cdbd2cSJim Jagielski 
605*b1cdbd2cSJim Jagielski 	// acquire
606*b1cdbd2cSJim Jagielski 	i = nLoop;
607*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
608*b1cdbd2cSJim Jagielski 	while (i--)
609*b1cdbd2cSJim Jagielski 		xBench->acquire();
610*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
611*b1cdbd2cSJim Jagielski 	rSheet.insert( "2a: interface acquire() calls", nLoop, tEnd - tStart );
612*b1cdbd2cSJim Jagielski 	// release
613*b1cdbd2cSJim Jagielski 	i = nLoop;
614*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
615*b1cdbd2cSJim Jagielski 	while (i--)
616*b1cdbd2cSJim Jagielski 		xBench->release();
617*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
618*b1cdbd2cSJim Jagielski 	rSheet.insert( "2b: interface release() calls", nLoop, tEnd - tStart );
619*b1cdbd2cSJim Jagielski 
620*b1cdbd2cSJim Jagielski 	// queryInterface() for known type
621*b1cdbd2cSJim Jagielski 	i = nLoop;
622*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
623*b1cdbd2cSJim Jagielski 	while (i--)
624*b1cdbd2cSJim Jagielski 		xBench->queryInterface( rKnownType );
625*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
626*b1cdbd2cSJim Jagielski 	rSheet.insert( "2c: interface query for implemented type", nLoop, tEnd - tStart );
627*b1cdbd2cSJim Jagielski 	// queryInterface() for unknown type
628*b1cdbd2cSJim Jagielski 	i = nLoop;
629*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
630*b1cdbd2cSJim Jagielski 	while (i--)
631*b1cdbd2cSJim Jagielski 		xBench->queryInterface( rUnKnownType );
632*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
633*b1cdbd2cSJim Jagielski 	rSheet.insert( "2d: interface query for unknown type", nLoop, tEnd - tStart );
634*b1cdbd2cSJim Jagielski 
635*b1cdbd2cSJim Jagielski 	// create and forget objects
636*b1cdbd2cSJim Jagielski 	Reference< XPerformanceTest > xBench2( xBench );
637*b1cdbd2cSJim Jagielski 	i = nLoop;
638*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
639*b1cdbd2cSJim Jagielski 	while (i--)
640*b1cdbd2cSJim Jagielski 		xBench2 = xBench2->createObject();
641*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
642*b1cdbd2cSJim Jagielski 	rSheet.insert( "3a: create and release test objects", nLoop, tEnd - tStart );
643*b1cdbd2cSJim Jagielski 
644*b1cdbd2cSJim Jagielski 	// hold new objects
645*b1cdbd2cSJim Jagielski 	Sequence< Reference< XInterface > > aSeq( nLoop / 100 );
646*b1cdbd2cSJim Jagielski 	Reference< XInterface > * pSeq = aSeq.getArray();
647*b1cdbd2cSJim Jagielski 	xBench2 = xBench;
648*b1cdbd2cSJim Jagielski 	i = aSeq.getLength();
649*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
650*b1cdbd2cSJim Jagielski 	while (i--)
651*b1cdbd2cSJim Jagielski 		pSeq[i] = xBench2 = xBench2->createObject();
652*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
653*b1cdbd2cSJim Jagielski 	rSheet.insert( "3b: create and hold test objects", nLoop, tEnd - tStart );
654*b1cdbd2cSJim Jagielski 
655*b1cdbd2cSJim Jagielski 	// structs
656*b1cdbd2cSJim Jagielski 	i = nLoop;
657*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
658*b1cdbd2cSJim Jagielski 	while (i--)
659*b1cdbd2cSJim Jagielski 		xBench->complex_in( aDummyStruct );
660*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
661*b1cdbd2cSJim Jagielski 	rSheet.insert( "4a: complex_in() calls (in struct; return struct)", nLoop, tEnd - tStart );
662*b1cdbd2cSJim Jagielski 	i = nLoop;
663*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
664*b1cdbd2cSJim Jagielski 	while (i--)
665*b1cdbd2cSJim Jagielski 		xBench->complex_inout( aDummyStruct );
666*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
667*b1cdbd2cSJim Jagielski 	rSheet.insert( "4b: complex_inout() calls (inout struct; return struct)", nLoop, tEnd - tStart );
668*b1cdbd2cSJim Jagielski 
669*b1cdbd2cSJim Jagielski 	i = nLoop;
670*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
671*b1cdbd2cSJim Jagielski 	while (i--)
672*b1cdbd2cSJim Jagielski 		xBench->complex_oneway( aDummyStruct );
673*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
674*b1cdbd2cSJim Jagielski 	rSheet.insert( "4c: complex_oneway() oneway calls (in struct)", nLoop, tEnd - tStart );
675*b1cdbd2cSJim Jagielski 	i = nLoop;
676*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
677*b1cdbd2cSJim Jagielski 	while (i--)
678*b1cdbd2cSJim Jagielski 		xBench->complex_noreturn( aDummyStruct );
679*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
680*b1cdbd2cSJim Jagielski 	rSheet.insert( "4d: complex_noreturn() calls (in struct)", nLoop, tEnd - tStart );
681*b1cdbd2cSJim Jagielski 
682*b1cdbd2cSJim Jagielski 	// attributes, get() methods
683*b1cdbd2cSJim Jagielski 	i = nLoop;
684*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
685*b1cdbd2cSJim Jagielski 	while (i--)
686*b1cdbd2cSJim Jagielski 		xBench->getLong();
687*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
688*b1cdbd2cSJim Jagielski 	rSheet.insert( "5a: getLong() call", nLoop, tEnd - tStart );
689*b1cdbd2cSJim Jagielski 	i = nLoop;
690*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
691*b1cdbd2cSJim Jagielski 	while (i--)
692*b1cdbd2cSJim Jagielski 		xBench->getLong_attr();
693*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
694*b1cdbd2cSJim Jagielski 	rSheet.insert( "5b: get long attribute", nLoop, tEnd - tStart );
695*b1cdbd2cSJim Jagielski 
696*b1cdbd2cSJim Jagielski 	i = nLoop;
697*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
698*b1cdbd2cSJim Jagielski 	while (i--)
699*b1cdbd2cSJim Jagielski 		xBench->setLong( 0 );
700*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
701*b1cdbd2cSJim Jagielski 	rSheet.insert( "5c: setLong() call", nLoop, tEnd - tStart );
702*b1cdbd2cSJim Jagielski 	i = nLoop;
703*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
704*b1cdbd2cSJim Jagielski 	while (i--)
705*b1cdbd2cSJim Jagielski 		xBench->setLong_attr( 0 );
706*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
707*b1cdbd2cSJim Jagielski 	rSheet.insert( "5d: set long attribute", nLoop, tEnd - tStart );
708*b1cdbd2cSJim Jagielski 
709*b1cdbd2cSJim Jagielski 	i = nLoop;
710*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
711*b1cdbd2cSJim Jagielski 	while (i--)
712*b1cdbd2cSJim Jagielski 		xBench->getHyper();
713*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
714*b1cdbd2cSJim Jagielski 	rSheet.insert( "5e: getHyper() call", nLoop, tEnd - tStart );
715*b1cdbd2cSJim Jagielski 	i = nLoop;
716*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
717*b1cdbd2cSJim Jagielski 	while (i--)
718*b1cdbd2cSJim Jagielski 		xBench->getHyper_attr();
719*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
720*b1cdbd2cSJim Jagielski 	rSheet.insert( "5f: get hyper attribute", nLoop, tEnd - tStart );
721*b1cdbd2cSJim Jagielski 
722*b1cdbd2cSJim Jagielski 	i = nLoop;
723*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
724*b1cdbd2cSJim Jagielski 	while (i--)
725*b1cdbd2cSJim Jagielski 		xBench->setHyper( 0 );
726*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
727*b1cdbd2cSJim Jagielski 	rSheet.insert( "5g: setHyper() call", nLoop, tEnd - tStart );
728*b1cdbd2cSJim Jagielski 	i = nLoop;
729*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
730*b1cdbd2cSJim Jagielski 	while (i--)
731*b1cdbd2cSJim Jagielski 		xBench->setHyper_attr( 0 );
732*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
733*b1cdbd2cSJim Jagielski 	rSheet.insert( "5h: set hyper attribute", nLoop, tEnd - tStart );
734*b1cdbd2cSJim Jagielski 
735*b1cdbd2cSJim Jagielski 	i = nLoop;
736*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
737*b1cdbd2cSJim Jagielski 	while (i--)
738*b1cdbd2cSJim Jagielski 		xBench->getFloat();
739*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
740*b1cdbd2cSJim Jagielski 	rSheet.insert( "5i: getFloat() call", nLoop, tEnd - tStart );
741*b1cdbd2cSJim Jagielski 	i = nLoop;
742*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
743*b1cdbd2cSJim Jagielski 	while (i--)
744*b1cdbd2cSJim Jagielski 		xBench->getFloat_attr();
745*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
746*b1cdbd2cSJim Jagielski 	rSheet.insert( "5j: get float attribute",nLoop,  tEnd - tStart );
747*b1cdbd2cSJim Jagielski 
748*b1cdbd2cSJim Jagielski 	i = nLoop;
749*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
750*b1cdbd2cSJim Jagielski 	while (i--)
751*b1cdbd2cSJim Jagielski 		xBench->setFloat( 0.0 );
752*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
753*b1cdbd2cSJim Jagielski 	rSheet.insert( "5k: setFloat() call", nLoop, tEnd - tStart );
754*b1cdbd2cSJim Jagielski 	i = nLoop;
755*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
756*b1cdbd2cSJim Jagielski 	while (i--)
757*b1cdbd2cSJim Jagielski 		xBench->setFloat_attr( 0.0 );
758*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
759*b1cdbd2cSJim Jagielski 	rSheet.insert( "5l: set float attribute", nLoop, tEnd - tStart );
760*b1cdbd2cSJim Jagielski 
761*b1cdbd2cSJim Jagielski 	i = nLoop;
762*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
763*b1cdbd2cSJim Jagielski 	while (i--)
764*b1cdbd2cSJim Jagielski 		xBench->getDouble();
765*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
766*b1cdbd2cSJim Jagielski 	rSheet.insert( "5m: getDouble() call", nLoop, tEnd - tStart );
767*b1cdbd2cSJim Jagielski 	i = nLoop;
768*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
769*b1cdbd2cSJim Jagielski 	while (i--)
770*b1cdbd2cSJim Jagielski 		xBench->getDouble_attr();
771*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
772*b1cdbd2cSJim Jagielski 	rSheet.insert( "5n: get double attribute", nLoop, tEnd - tStart );
773*b1cdbd2cSJim Jagielski 	i = nLoop;
774*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
775*b1cdbd2cSJim Jagielski 	while (i--)
776*b1cdbd2cSJim Jagielski 		xBench->setDouble( 0.0 );
777*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
778*b1cdbd2cSJim Jagielski 	rSheet.insert( "5o: setDouble() call", nLoop, tEnd - tStart );
779*b1cdbd2cSJim Jagielski 	i = nLoop;
780*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
781*b1cdbd2cSJim Jagielski 	while (i--)
782*b1cdbd2cSJim Jagielski 		xBench->setDouble_attr( 0.0 );
783*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
784*b1cdbd2cSJim Jagielski 	rSheet.insert( "5p: set double attribute", nLoop, tEnd - tStart );
785*b1cdbd2cSJim Jagielski 
786*b1cdbd2cSJim Jagielski 	i = nLoop;
787*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
788*b1cdbd2cSJim Jagielski 	while (i--)
789*b1cdbd2cSJim Jagielski 		xBench->getString();
790*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
791*b1cdbd2cSJim Jagielski 	rSheet.insert( "6a: getString() call (empty)", nLoop, tEnd - tStart );
792*b1cdbd2cSJim Jagielski 	i = nLoop;
793*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
794*b1cdbd2cSJim Jagielski 	while (i--)
795*b1cdbd2cSJim Jagielski 		xBench->getString_attr();
796*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
797*b1cdbd2cSJim Jagielski 	rSheet.insert( "6b: get empty string attribute", nLoop, tEnd - tStart );
798*b1cdbd2cSJim Jagielski 
799*b1cdbd2cSJim Jagielski 	i = nLoop;
800*b1cdbd2cSJim Jagielski 	OUString aDummyString;
801*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
802*b1cdbd2cSJim Jagielski 	while (i--)
803*b1cdbd2cSJim Jagielski 		xBench->setString( aDummyString );
804*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
805*b1cdbd2cSJim Jagielski 	rSheet.insert( "6c: setString() call (emtpy)", nLoop, tEnd - tStart );
806*b1cdbd2cSJim Jagielski 	i = nLoop;
807*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
808*b1cdbd2cSJim Jagielski 	while (i--)
809*b1cdbd2cSJim Jagielski 		xBench->setString_attr( aDummyString );
810*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
811*b1cdbd2cSJim Jagielski 	rSheet.insert( "6d: set empty string attribute", nLoop, tEnd - tStart );
812*b1cdbd2cSJim Jagielski 
813*b1cdbd2cSJim Jagielski 	i = nLoop;
814*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
815*b1cdbd2cSJim Jagielski 	while (i--)
816*b1cdbd2cSJim Jagielski 		xBench->getInterface();
817*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
818*b1cdbd2cSJim Jagielski 	rSheet.insert( "7a: getInterface() call (null)", nLoop, tEnd - tStart );
819*b1cdbd2cSJim Jagielski 	i = nLoop;
820*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
821*b1cdbd2cSJim Jagielski 	while (i--)
822*b1cdbd2cSJim Jagielski 		xBench->getInterface_attr();
823*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
824*b1cdbd2cSJim Jagielski 	rSheet.insert( "7b: get interface attribute", nLoop, tEnd - tStart );
825*b1cdbd2cSJim Jagielski 
826*b1cdbd2cSJim Jagielski 	i = nLoop;
827*b1cdbd2cSJim Jagielski 	Reference< XInterface > aDummyInterface;
828*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
829*b1cdbd2cSJim Jagielski 	while (i--)
830*b1cdbd2cSJim Jagielski 		xBench->setInterface( aDummyInterface );
831*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
832*b1cdbd2cSJim Jagielski 	rSheet.insert( "7c: setInterface() call (null)", nLoop, tEnd - tStart );
833*b1cdbd2cSJim Jagielski 	i = nLoop;
834*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
835*b1cdbd2cSJim Jagielski 	while (i--)
836*b1cdbd2cSJim Jagielski 		xBench->setInterface_attr( Reference< XInterface >() );
837*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
838*b1cdbd2cSJim Jagielski 	rSheet.insert( "7d: set interface attribute", nLoop, tEnd - tStart );
839*b1cdbd2cSJim Jagielski 
840*b1cdbd2cSJim Jagielski 	i = nLoop;
841*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
842*b1cdbd2cSJim Jagielski 	while (i--)
843*b1cdbd2cSJim Jagielski 		xBench->getAny();
844*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
845*b1cdbd2cSJim Jagielski 	rSheet.insert( "8a: getAny() call (empty)", nLoop, tEnd - tStart );
846*b1cdbd2cSJim Jagielski 	i = nLoop;
847*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
848*b1cdbd2cSJim Jagielski 	while (i--)
849*b1cdbd2cSJim Jagielski 		xBench->getAny_attr();
850*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
851*b1cdbd2cSJim Jagielski 	rSheet.insert( "8b: get empty any attribute", nLoop, tEnd - tStart );
852*b1cdbd2cSJim Jagielski 
853*b1cdbd2cSJim Jagielski 	i = nLoop;
854*b1cdbd2cSJim Jagielski 	Any aDummyAny;
855*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
856*b1cdbd2cSJim Jagielski 	while (i--)
857*b1cdbd2cSJim Jagielski 		xBench->setAny( aDummyAny );
858*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
859*b1cdbd2cSJim Jagielski 	rSheet.insert( "8c: setAny() call (empty)", nLoop, tEnd - tStart );
860*b1cdbd2cSJim Jagielski 	i = nLoop;
861*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
862*b1cdbd2cSJim Jagielski 	while (i--)
863*b1cdbd2cSJim Jagielski 		xBench->setAny_attr( aDummyAny );
864*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
865*b1cdbd2cSJim Jagielski 	rSheet.insert( "8d: set empty any attribute", nLoop, tEnd - tStart );
866*b1cdbd2cSJim Jagielski 
867*b1cdbd2cSJim Jagielski 	i = nLoop;
868*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
869*b1cdbd2cSJim Jagielski 	while (i--)
870*b1cdbd2cSJim Jagielski 		xBench->getSequence();
871*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
872*b1cdbd2cSJim Jagielski 	rSheet.insert( "9a: getSequence() call (empty)", nLoop, tEnd - tStart );
873*b1cdbd2cSJim Jagielski 	i = nLoop;
874*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
875*b1cdbd2cSJim Jagielski 	while (i--)
876*b1cdbd2cSJim Jagielski 		xBench->getSequence_attr();
877*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
878*b1cdbd2cSJim Jagielski 	rSheet.insert( "9b: get empty sequence attribute", nLoop, tEnd - tStart );
879*b1cdbd2cSJim Jagielski 	i = nLoop;
880*b1cdbd2cSJim Jagielski 	Sequence< Reference< XInterface > > aDummySeq;
881*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
882*b1cdbd2cSJim Jagielski 	while (i--)
883*b1cdbd2cSJim Jagielski 		xBench->setSequence( aDummySeq );
884*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
885*b1cdbd2cSJim Jagielski 	rSheet.insert( "9c: setSequence() call (empty)", nLoop, tEnd - tStart );
886*b1cdbd2cSJim Jagielski 	i = nLoop;
887*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
888*b1cdbd2cSJim Jagielski 	while (i--)
889*b1cdbd2cSJim Jagielski 		xBench->setSequence_attr( aDummySeq );
890*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
891*b1cdbd2cSJim Jagielski 	rSheet.insert( "9d: set empty sequence attribute", nLoop, tEnd - tStart );
892*b1cdbd2cSJim Jagielski 
893*b1cdbd2cSJim Jagielski 	i = nLoop;
894*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
895*b1cdbd2cSJim Jagielski 	while (i--)
896*b1cdbd2cSJim Jagielski 		xBench->getStruct();
897*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
898*b1cdbd2cSJim Jagielski 	rSheet.insert( "Aa: getStruct() call", nLoop, tEnd - tStart );
899*b1cdbd2cSJim Jagielski 	i = nLoop;
900*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
901*b1cdbd2cSJim Jagielski 	while (i--)
902*b1cdbd2cSJim Jagielski 		xBench->getStruct_attr();
903*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
904*b1cdbd2cSJim Jagielski 	rSheet.insert( "Ab: get struct attribute", nLoop, tEnd - tStart );
905*b1cdbd2cSJim Jagielski 
906*b1cdbd2cSJim Jagielski 	i = nLoop;
907*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
908*b1cdbd2cSJim Jagielski 	while (i--)
909*b1cdbd2cSJim Jagielski 		xBench->setStruct( aDummyStruct );
910*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
911*b1cdbd2cSJim Jagielski 	rSheet.insert( "Ac: setStruct() call", nLoop, tEnd - tStart );
912*b1cdbd2cSJim Jagielski 	i = nLoop;
913*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
914*b1cdbd2cSJim Jagielski 	while (i--)
915*b1cdbd2cSJim Jagielski 		xBench->setStruct_attr( aDummyStruct );
916*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
917*b1cdbd2cSJim Jagielski 	rSheet.insert( "Ad: set struct attribute", nLoop, tEnd - tStart );
918*b1cdbd2cSJim Jagielski 
919*b1cdbd2cSJim Jagielski 	// load
920*b1cdbd2cSJim Jagielski //  	i = nLoop;
921*b1cdbd2cSJim Jagielski //  	tStart = getSystemTicks();
922*b1cdbd2cSJim Jagielski //  	while (i--)
923*b1cdbd2cSJim Jagielski //  		xBench->setSequence( aSeq );
924*b1cdbd2cSJim Jagielski //  	tEnd = getSystemTicks();
925*b1cdbd2cSJim Jagielski //  	rSheet.insert( "transfer of exisiting objects", nLoop, tEnd - tStart );
926*b1cdbd2cSJim Jagielski 
927*b1cdbd2cSJim Jagielski 	// exceptions
928*b1cdbd2cSJim Jagielski 	i = nLoop;
929*b1cdbd2cSJim Jagielski 	tStart = getSystemTicks();
930*b1cdbd2cSJim Jagielski 	while (i--)
931*b1cdbd2cSJim Jagielski 	{
932*b1cdbd2cSJim Jagielski 		try
933*b1cdbd2cSJim Jagielski 		{
934*b1cdbd2cSJim Jagielski 			xBench->raiseRuntimeException();
935*b1cdbd2cSJim Jagielski 		}
936*b1cdbd2cSJim Jagielski 		catch (RuntimeException &)
937*b1cdbd2cSJim Jagielski 		{
938*b1cdbd2cSJim Jagielski 		}
939*b1cdbd2cSJim Jagielski 	}
940*b1cdbd2cSJim Jagielski 	tEnd = getSystemTicks();
941*b1cdbd2cSJim Jagielski 	rSheet.insert( "Ba: raising RuntimeException", nLoop, tEnd - tStart );
942*b1cdbd2cSJim Jagielski 
943*b1cdbd2cSJim Jagielski 	//------------------------------------
944*b1cdbd2cSJim Jagielski }
945*b1cdbd2cSJim Jagielski 
946*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------------------------------
extractParam(const Sequence<OUString> & rArgs,const OUString & rParam)947*b1cdbd2cSJim Jagielski static OUString extractParam( const Sequence< OUString > & rArgs, const OUString & rParam )
948*b1cdbd2cSJim Jagielski {
949*b1cdbd2cSJim Jagielski 	const OUString * pArgs = rArgs.getConstArray();
950*b1cdbd2cSJim Jagielski 	for ( sal_Int32 nPos = rArgs.getLength(); nPos--; )
951*b1cdbd2cSJim Jagielski 	{
952*b1cdbd2cSJim Jagielski 		if (pArgs[nPos].indexOf( rParam ) == 0 &&
953*b1cdbd2cSJim Jagielski 			pArgs[nPos].getLength() > (rParam.getLength()+1))
954*b1cdbd2cSJim Jagielski 		{
955*b1cdbd2cSJim Jagielski 			return pArgs[nPos].copy( rParam.getLength() +1 ); // XXX=bla
956*b1cdbd2cSJim Jagielski 		}
957*b1cdbd2cSJim Jagielski 	}
958*b1cdbd2cSJim Jagielski 	return OUString();
959*b1cdbd2cSJim Jagielski }
960*b1cdbd2cSJim Jagielski 
961*b1cdbd2cSJim Jagielski const sal_Int32 nMagicNumberDirect = 34000;
962*b1cdbd2cSJim Jagielski 
963*b1cdbd2cSJim Jagielski //XMain
964*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
run(const Sequence<OUString> & rArgs)965*b1cdbd2cSJim Jagielski sal_Int32 TestImpl::run( const Sequence< OUString > & rArgs )
966*b1cdbd2cSJim Jagielski 	throw (RuntimeException)
967*b1cdbd2cSJim Jagielski {
968*b1cdbd2cSJim Jagielski 	// defaults
969*b1cdbd2cSJim Jagielski 	FILE * stream = stderr;
970*b1cdbd2cSJim Jagielski 	sal_Int64 nLoop = NLOOP;
971*b1cdbd2cSJim Jagielski 	OUString aArg( RTL_CONSTASCII_USTRINGPARAM("dms") );
972*b1cdbd2cSJim Jagielski 
973*b1cdbd2cSJim Jagielski 	try
974*b1cdbd2cSJim Jagielski 	{
975*b1cdbd2cSJim Jagielski 		OUString aLoopStr( extractParam( rArgs, OUString( RTL_CONSTASCII_USTRINGPARAM("loop") ) ) );
976*b1cdbd2cSJim Jagielski 		if (aLoopStr.getLength())
977*b1cdbd2cSJim Jagielski 		{
978*b1cdbd2cSJim Jagielski 			sal_Int64 n = aLoopStr.toInt64();
979*b1cdbd2cSJim Jagielski 			if (n > 0)
980*b1cdbd2cSJim Jagielski 				nLoop = n;
981*b1cdbd2cSJim Jagielski 		}
982*b1cdbd2cSJim Jagielski 
983*b1cdbd2cSJim Jagielski 		OUString aDurationStr( extractParam( rArgs , OUString( RTL_CONSTASCII_USTRINGPARAM("duration" ) ) ) );
984*b1cdbd2cSJim Jagielski 		if( aDurationStr.getLength() )
985*b1cdbd2cSJim Jagielski 		{
986*b1cdbd2cSJim Jagielski 			sal_Int64 n = aDurationStr.toInt64();
987*b1cdbd2cSJim Jagielski 			if( n >0 )
988*b1cdbd2cSJim Jagielski 				nLoop = nMagicNumberDirect * n;
989*b1cdbd2cSJim Jagielski 		}
990*b1cdbd2cSJim Jagielski 
991*b1cdbd2cSJim Jagielski 		OUString aLogStr( extractParam( rArgs, OUString( RTL_CONSTASCII_USTRINGPARAM("log") ) ) );
992*b1cdbd2cSJim Jagielski 		if (aLogStr.getLength())
993*b1cdbd2cSJim Jagielski 		{
994*b1cdbd2cSJim Jagielski 			if (aLogStr.compareToAscii( "stderr" ) == 0)
995*b1cdbd2cSJim Jagielski 			{
996*b1cdbd2cSJim Jagielski 				stream = stderr;
997*b1cdbd2cSJim Jagielski 			}
998*b1cdbd2cSJim Jagielski 			else if (aLogStr.compareToAscii( "stdout" ) == 0)
999*b1cdbd2cSJim Jagielski 			{
1000*b1cdbd2cSJim Jagielski 				stream = stdout;
1001*b1cdbd2cSJim Jagielski 			}
1002*b1cdbd2cSJim Jagielski 			else
1003*b1cdbd2cSJim Jagielski 			{
1004*b1cdbd2cSJim Jagielski 				OString aFileName( OUStringToOString( aLogStr, RTL_TEXTENCODING_ASCII_US ) );
1005*b1cdbd2cSJim Jagielski 				stream = ::fopen( aFileName.getStr(), "w" );
1006*b1cdbd2cSJim Jagielski 				if (! stream)
1007*b1cdbd2cSJim Jagielski 				{
1008*b1cdbd2cSJim Jagielski 					OUStringBuffer buf( 32 );
1009*b1cdbd2cSJim Jagielski 					buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("cannot open file for writing: \"") );
1010*b1cdbd2cSJim Jagielski 					buf.append( aLogStr );
1011*b1cdbd2cSJim Jagielski 					buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\"!") );
1012*b1cdbd2cSJim Jagielski 					throw RuntimeException( buf.makeStringAndClear(), Reference< XInterface >() );
1013*b1cdbd2cSJim Jagielski 				}
1014*b1cdbd2cSJim Jagielski 			}
1015*b1cdbd2cSJim Jagielski 		}
1016*b1cdbd2cSJim Jagielski 
1017*b1cdbd2cSJim Jagielski 		OUString aArgStr( extractParam( rArgs, OUString( RTL_CONSTASCII_USTRINGPARAM("opt") ) ) );
1018*b1cdbd2cSJim Jagielski 		if (aArgStr.getLength())
1019*b1cdbd2cSJim Jagielski 		{
1020*b1cdbd2cSJim Jagielski 			aArg = aArgStr;
1021*b1cdbd2cSJim Jagielski 		}
1022*b1cdbd2cSJim Jagielski 
1023*b1cdbd2cSJim Jagielski 		if (! rArgs.getLength())
1024*b1cdbd2cSJim Jagielski 			out( "\n> no options given, using defaults" );
1025*b1cdbd2cSJim Jagielski 
1026*b1cdbd2cSJim Jagielski 		// params
1027*b1cdbd2cSJim Jagielski 		out( "\n> opt=" );
1028*b1cdbd2cSJim Jagielski 		out( aArg );
1029*b1cdbd2cSJim Jagielski 		out( " log=" );
1030*b1cdbd2cSJim Jagielski 		if (stream == stderr)
1031*b1cdbd2cSJim Jagielski 			out( "stderr" );
1032*b1cdbd2cSJim Jagielski 		else if (stream == stderr)
1033*b1cdbd2cSJim Jagielski 			out( "stdout loop=" );
1034*b1cdbd2cSJim Jagielski 		else
1035*b1cdbd2cSJim Jagielski 			out( aLogStr );
1036*b1cdbd2cSJim Jagielski 		out( " loop=" );
1037*b1cdbd2cSJim Jagielski 		out( nLoop );
1038*b1cdbd2cSJim Jagielski 		out( "\n" );
1039*b1cdbd2cSJim Jagielski 		t_TimingSheetMap aSheets;
1040*b1cdbd2cSJim Jagielski 		TimingSheet aDirect;
1041*b1cdbd2cSJim Jagielski 
1042*b1cdbd2cSJim Jagielski 		//------------------------------------------------------------------------------------------
1043*b1cdbd2cSJim Jagielski 
1044*b1cdbd2cSJim Jagielski 		if (aArg.indexOf( 'd' ) >= 0)
1045*b1cdbd2cSJim Jagielski 		{
1046*b1cdbd2cSJim Jagielski 			// in process direct test
1047*b1cdbd2cSJim Jagielski 			sal_uInt32 nStart = getSystemTicks();
1048*b1cdbd2cSJim Jagielski 			benchmark( aDirect, getDirect(), nLoop );
1049*b1cdbd2cSJim Jagielski 			sal_uInt32 nEnd = getSystemTicks();
1050*b1cdbd2cSJim Jagielski 			fprintf( stderr, "Duration (direct in process): %g s\n", (nEnd - nStart)/1000.  );
1051*b1cdbd2cSJim Jagielski 		}
1052*b1cdbd2cSJim Jagielski 
1053*b1cdbd2cSJim Jagielski 		//------------------------------------------------------------------------------------------
1054*b1cdbd2cSJim Jagielski 
1055*b1cdbd2cSJim Jagielski 		if (aArg.indexOf( 'm' ) >= 0)
1056*b1cdbd2cSJim Jagielski 		{
1057*b1cdbd2cSJim Jagielski 			// in process uno dispatch
1058*b1cdbd2cSJim Jagielski 			Environment aCppEnv, aAnoCppEnv;
1059*b1cdbd2cSJim Jagielski 			OUString aCurrentLanguageBindingName( RTL_CONSTASCII_USTRINGPARAM(CPPU_CURRENT_LANGUAGE_BINDING_NAME) );
1060*b1cdbd2cSJim Jagielski 			uno_getEnvironment( reinterpret_cast< uno_Environment ** >( &aCppEnv ),
1061*b1cdbd2cSJim Jagielski 								aCurrentLanguageBindingName.pData, 0 );
1062*b1cdbd2cSJim Jagielski 			// anonymous
1063*b1cdbd2cSJim Jagielski 			uno_createEnvironment( reinterpret_cast< uno_Environment ** >( &aAnoCppEnv ),
1064*b1cdbd2cSJim Jagielski 								   aCurrentLanguageBindingName.pData, 0 );
1065*b1cdbd2cSJim Jagielski 
1066*b1cdbd2cSJim Jagielski 			// pseudo mapping uno<->uno: does nothing!
1067*b1cdbd2cSJim Jagielski 			Mapping aMapping( aCppEnv.get(), aAnoCppEnv.get(), OUString( RTL_CONSTASCII_USTRINGPARAM("pseudo") ) );
1068*b1cdbd2cSJim Jagielski 			if (! aMapping.is())
1069*b1cdbd2cSJim Jagielski 				throw RuntimeException( OUString( RTL_CONSTASCII_USTRINGPARAM("no pseudo mapping available!") ), Reference< XInterface >() );
1070*b1cdbd2cSJim Jagielski 
1071*b1cdbd2cSJim Jagielski 			Reference< XInterface > xMapped;
1072*b1cdbd2cSJim Jagielski 			Reference< XInterface > xDirect( getDirect() );
1073*b1cdbd2cSJim Jagielski 			aMapping.mapInterface( reinterpret_cast< void ** >( &xMapped ), xDirect.get(),
1074*b1cdbd2cSJim Jagielski 								   ::getCppuType( &xDirect ) );
1075*b1cdbd2cSJim Jagielski 			if (! xMapped.is())
1076*b1cdbd2cSJim Jagielski 				throw RuntimeException( OUString( RTL_CONSTASCII_USTRINGPARAM("mapping object failed!") ), Reference< XInterface >() );
1077*b1cdbd2cSJim Jagielski 
1078*b1cdbd2cSJim Jagielski 			sal_uInt32 nStart = getSystemTicks();
1079*b1cdbd2cSJim Jagielski 			benchmark( aSheets[ "mapped in process" ], xMapped, nLoop / 100 );
1080*b1cdbd2cSJim Jagielski 			sal_uInt32 nEnd = getSystemTicks();
1081*b1cdbd2cSJim Jagielski 			fprintf( stderr, "Duration (mapped in process): %g s\n", (nStart - nEnd)/1000. );
1082*b1cdbd2cSJim Jagielski 		}
1083*b1cdbd2cSJim Jagielski 
1084*b1cdbd2cSJim Jagielski 		//------------------------------------------------------------------------------------------
1085*b1cdbd2cSJim Jagielski 
1086*b1cdbd2cSJim Jagielski 		if (aArg.indexOf( 's' ) >= 0)
1087*b1cdbd2cSJim Jagielski 		{
1088*b1cdbd2cSJim Jagielski 			// start server process
1089*b1cdbd2cSJim Jagielski 			oslSecurity hSecurity = osl_getCurrentSecurity();
1090*b1cdbd2cSJim Jagielski 			if (! hSecurity)
1091*b1cdbd2cSJim Jagielski 				throw RuntimeException( OUString( RTL_CONSTASCII_USTRINGPARAM("cannot get current security handle!") ), Reference< XInterface >() );
1092*b1cdbd2cSJim Jagielski 
1093*b1cdbd2cSJim Jagielski 			OUString aArgs[] = {
1094*b1cdbd2cSJim Jagielski 				OUString( RTL_CONSTASCII_USTRINGPARAM("-c") ),
1095*b1cdbd2cSJim Jagielski 				OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.performance.PerformanceTestObject") ),
1096*b1cdbd2cSJim Jagielski 				OUString( RTL_CONSTASCII_USTRINGPARAM("-l") ),
1097*b1cdbd2cSJim Jagielski #ifdef SAL_UNX
1098*b1cdbd2cSJim Jagielski 				OUString( RTL_CONSTASCII_USTRINGPARAM("libperfobj.so") ),
1099*b1cdbd2cSJim Jagielski #else
1100*b1cdbd2cSJim Jagielski 				OUString( RTL_CONSTASCII_USTRINGPARAM("perfobj.dll") ),
1101*b1cdbd2cSJim Jagielski #endif
1102*b1cdbd2cSJim Jagielski 				OUString( RTL_CONSTASCII_USTRINGPARAM("-r") ),
1103*b1cdbd2cSJim Jagielski 				OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb") ),
1104*b1cdbd2cSJim Jagielski 				OUString( RTL_CONSTASCII_USTRINGPARAM("-u") ),
1105*b1cdbd2cSJim Jagielski 				OUString( RTL_CONSTASCII_USTRINGPARAM("uno:socket,host=localhost,port=6000;iiop;TestRemoteObject") ),
1106*b1cdbd2cSJim Jagielski 				OUString( RTL_CONSTASCII_USTRINGPARAM("--singleaccept") )
1107*b1cdbd2cSJim Jagielski 			};
1108*b1cdbd2cSJim Jagielski 			rtl_uString * pArgs[] = {
1109*b1cdbd2cSJim Jagielski 				aArgs[0].pData,
1110*b1cdbd2cSJim Jagielski 				aArgs[1].pData,
1111*b1cdbd2cSJim Jagielski 				aArgs[2].pData,
1112*b1cdbd2cSJim Jagielski 				aArgs[3].pData,
1113*b1cdbd2cSJim Jagielski 				aArgs[4].pData,
1114*b1cdbd2cSJim Jagielski 				aArgs[5].pData,
1115*b1cdbd2cSJim Jagielski 				aArgs[6].pData,
1116*b1cdbd2cSJim Jagielski 				aArgs[7].pData,
1117*b1cdbd2cSJim Jagielski 				aArgs[8].pData,
1118*b1cdbd2cSJim Jagielski 				aArgs[9].pData,
1119*b1cdbd2cSJim Jagielski 			};
1120*b1cdbd2cSJim Jagielski 
1121*b1cdbd2cSJim Jagielski 			out( "\n> executing: \"uno" );
1122*b1cdbd2cSJim Jagielski 			for ( sal_Int32 nPos = 0; nPos < (sizeof(aArgs) / sizeof(OUString)); ++nPos )
1123*b1cdbd2cSJim Jagielski 			{
1124*b1cdbd2cSJim Jagielski 				out( " " );
1125*b1cdbd2cSJim Jagielski 				out( aArgs[nPos] );
1126*b1cdbd2cSJim Jagielski 			}
1127*b1cdbd2cSJim Jagielski 			out( "\" ..." );
1128*b1cdbd2cSJim Jagielski 
1129*b1cdbd2cSJim Jagielski 			oslProcess hProcess = 0;
1130*b1cdbd2cSJim Jagielski 			OUString aUnoExe( RTL_CONSTASCII_USTRINGPARAM("uno") );
1131*b1cdbd2cSJim Jagielski 			OUString aWorkingDir( RTL_CONSTASCII_USTRINGPARAM(".") );
1132*b1cdbd2cSJim Jagielski 			osl_executeProcess(
1133*b1cdbd2cSJim Jagielski 				aUnoExe.pData, pArgs, sizeof(aArgs) / sizeof(OUString),
1134*b1cdbd2cSJim Jagielski 				osl_Process_SEARCHPATH | osl_Process_DETACHED | osl_Process_NORMAL,
1135*b1cdbd2cSJim Jagielski 				hSecurity, aWorkingDir.pData, 0, 0, &hProcess );
1136*b1cdbd2cSJim Jagielski 
1137*b1cdbd2cSJim Jagielski 			osl_freeSecurityHandle( hSecurity );
1138*b1cdbd2cSJim Jagielski 			if (! hProcess)
1139*b1cdbd2cSJim Jagielski 				throw RuntimeException( OUString( RTL_CONSTASCII_USTRINGPARAM("cannot start server process!") ), Reference< XInterface >() );
1140*b1cdbd2cSJim Jagielski 			osl_freeProcessHandle( hProcess );
1141*b1cdbd2cSJim Jagielski 
1142*b1cdbd2cSJim Jagielski 			// wait three seconds
1143*b1cdbd2cSJim Jagielski 			TimeValue threeSeconds;
1144*b1cdbd2cSJim Jagielski 			threeSeconds.Seconds = 3;
1145*b1cdbd2cSJim Jagielski 			osl_waitThread( &threeSeconds );
1146*b1cdbd2cSJim Jagielski 
1147*b1cdbd2cSJim Jagielski 			// connect and resolve outer process object
1148*b1cdbd2cSJim Jagielski 			Reference< XInterface > xResolvedObject( resolveObject( OUString(
1149*b1cdbd2cSJim Jagielski 				RTL_CONSTASCII_USTRINGPARAM("uno:socket,host=localhost,port=6000;iiop;TestRemoteObject") ) ) );
1150*b1cdbd2cSJim Jagielski 
1151*b1cdbd2cSJim Jagielski 			benchmark( aSheets[ "remote same host" ], xResolvedObject, nLoop / 300 );
1152*b1cdbd2cSJim Jagielski 		}
1153*b1cdbd2cSJim Jagielski 
1154*b1cdbd2cSJim Jagielski 		//------------------------------------------------------------------------------------------
1155*b1cdbd2cSJim Jagielski 
1156*b1cdbd2cSJim Jagielski 		if (aArg.indexOf( 'r' ) >= 0)
1157*b1cdbd2cSJim Jagielski 		{
1158*b1cdbd2cSJim Jagielski 			// remote
1159*b1cdbd2cSJim Jagielski 			OUString aUnoUrl( extractParam( rArgs, OUString( RTL_CONSTASCII_USTRINGPARAM("url") ) ) );
1160*b1cdbd2cSJim Jagielski 			if (! aUnoUrl.getLength())
1161*b1cdbd2cSJim Jagielski 				throw RuntimeException( OUString( RTL_CONSTASCII_USTRINGPARAM("performance test r(emote) needs additional uno url!") ), Reference< XInterface >() );
1162*b1cdbd2cSJim Jagielski 
1163*b1cdbd2cSJim Jagielski 			// connect and resolve outer process object
1164*b1cdbd2cSJim Jagielski 			Reference< XInterface > xResolvedObject( resolveObject( aUnoUrl ) );
1165*b1cdbd2cSJim Jagielski 
1166*b1cdbd2cSJim Jagielski 			sal_Int32 t1 = getSystemTicks();
1167*b1cdbd2cSJim Jagielski 			OString o = OUStringToOString( aUnoUrl, RTL_TEXTENCODING_ASCII_US );
1168*b1cdbd2cSJim Jagielski 			benchmark( aSheets[ o.getStr() ], xResolvedObject, nLoop / 900 );
1169*b1cdbd2cSJim Jagielski 			sal_Int32 t2 = getSystemTicks();
1170*b1cdbd2cSJim Jagielski 			fprintf( stderr, "Duration (%s): %g s\n", o.getStr(),(t2 - t1)/1000. );
1171*b1cdbd2cSJim Jagielski 		}
1172*b1cdbd2cSJim Jagielski 
1173*b1cdbd2cSJim Jagielski 		//------------------------------------------------------------------------------------------
1174*b1cdbd2cSJim Jagielski 
1175*b1cdbd2cSJim Jagielski 		if (aArg.indexOf( 'j' ) >= 0)
1176*b1cdbd2cSJim Jagielski 		{
1177*b1cdbd2cSJim Jagielski 			// java
1178*b1cdbd2cSJim Jagielski   			benchmark( aSheets[ "java in process" ],
1179*b1cdbd2cSJim Jagielski 					   _xSMgr->createInstance(OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.benchmark.JavaTestObject"))),
1180*b1cdbd2cSJim Jagielski 					   nLoop / 1000 );
1181*b1cdbd2cSJim Jagielski 		}
1182*b1cdbd2cSJim Jagielski 
1183*b1cdbd2cSJim Jagielski 		//------------------------------------------------------------------------------------------
1184*b1cdbd2cSJim Jagielski 		// dump out tables
1185*b1cdbd2cSJim Jagielski 
1186*b1cdbd2cSJim Jagielski 		out( "\nTimes( ratio to direct in process )", stream );
1187*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1
1188*b1cdbd2cSJim Jagielski         out ("; compiled with OSL_DEBUG_LEVEL > 1", stream );
1189*b1cdbd2cSJim Jagielski #endif
1190*b1cdbd2cSJim Jagielski 		out( ":", stream );
1191*b1cdbd2cSJim Jagielski 
1192*b1cdbd2cSJim Jagielski 		sal_Int32 nPos = 60;
1193*b1cdbd2cSJim Jagielski 		out( "[direct in process]", stream, nPos );
1194*b1cdbd2cSJim Jagielski 		t_TimingSheetMap::const_iterator iSheets( aSheets.begin() );
1195*b1cdbd2cSJim Jagielski 		for ( ; iSheets != aSheets.end(); ++iSheets )
1196*b1cdbd2cSJim Jagielski 		{
1197*b1cdbd2cSJim Jagielski 			nPos += 40;
1198*b1cdbd2cSJim Jagielski 			out( "[", stream, nPos );
1199*b1cdbd2cSJim Jagielski 			out( (*iSheets).first.c_str(), stream );
1200*b1cdbd2cSJim Jagielski 			out( "]", stream );
1201*b1cdbd2cSJim Jagielski 		}
1202*b1cdbd2cSJim Jagielski 		for ( t_TimeEntryMap::const_iterator iTopics( aDirect._entries.begin() );
1203*b1cdbd2cSJim Jagielski 			  iTopics != aDirect._entries.end(); ++iTopics )
1204*b1cdbd2cSJim Jagielski 		{
1205*b1cdbd2cSJim Jagielski 			const std::string & rTopic = (*iTopics).first;
1206*b1cdbd2cSJim Jagielski 
1207*b1cdbd2cSJim Jagielski 			out( "\n", stream );
1208*b1cdbd2cSJim Jagielski 			out( rTopic.c_str(), stream );
1209*b1cdbd2cSJim Jagielski 
1210*b1cdbd2cSJim Jagielski 			out( ":", stream, 58, '.' );
1211*b1cdbd2cSJim Jagielski 
1212*b1cdbd2cSJim Jagielski 			sal_Int32 nPos = 60;
1213*b1cdbd2cSJim Jagielski 
1214*b1cdbd2cSJim Jagielski 			double secs = (*iTopics).second.secPerCall();
1215*b1cdbd2cSJim Jagielski 			if (secs > 0.0)
1216*b1cdbd2cSJim Jagielski 			{
1217*b1cdbd2cSJim Jagielski 				out( secs * 1000, stream, nPos );
1218*b1cdbd2cSJim Jagielski 				out( "ms", stream );
1219*b1cdbd2cSJim Jagielski 			}
1220*b1cdbd2cSJim Jagielski 			else
1221*b1cdbd2cSJim Jagielski 			{
1222*b1cdbd2cSJim Jagielski 				out( "NA", stream, nPos );
1223*b1cdbd2cSJim Jagielski 			}
1224*b1cdbd2cSJim Jagielski 
1225*b1cdbd2cSJim Jagielski 			iSheets = aSheets.begin();
1226*b1cdbd2cSJim Jagielski 			for ( ; iSheets != aSheets.end(); ++iSheets )
1227*b1cdbd2cSJim Jagielski 			{
1228*b1cdbd2cSJim Jagielski 				const t_TimeEntryMap::const_iterator iFind( (*iSheets).second._entries.find( rTopic ) );
1229*b1cdbd2cSJim Jagielski 				OSL_ENSURE( iFind != (*iSheets).second._entries.end(), "####" );
1230*b1cdbd2cSJim Jagielski 
1231*b1cdbd2cSJim Jagielski 				nPos += 40;
1232*b1cdbd2cSJim Jagielski 
1233*b1cdbd2cSJim Jagielski 				double secs = (*iFind).second.secPerCall();
1234*b1cdbd2cSJim Jagielski 				if (secs != 0.0)
1235*b1cdbd2cSJim Jagielski 				{
1236*b1cdbd2cSJim Jagielski 					out( secs * 1000, stream, nPos );
1237*b1cdbd2cSJim Jagielski 					out( "ms", stream );
1238*b1cdbd2cSJim Jagielski 
1239*b1cdbd2cSJim Jagielski 					out( " (", stream );
1240*b1cdbd2cSJim Jagielski 					double ratio = (*iFind).second.ratio( (*iTopics).second );
1241*b1cdbd2cSJim Jagielski 					if (ratio != 0.0)
1242*b1cdbd2cSJim Jagielski 					{
1243*b1cdbd2cSJim Jagielski 						out( ratio, stream );
1244*b1cdbd2cSJim Jagielski 						out( " x)", stream );
1245*b1cdbd2cSJim Jagielski 					}
1246*b1cdbd2cSJim Jagielski 					else
1247*b1cdbd2cSJim Jagielski 					{
1248*b1cdbd2cSJim Jagielski 						out( "NA)", stream );
1249*b1cdbd2cSJim Jagielski 					}
1250*b1cdbd2cSJim Jagielski 				}
1251*b1cdbd2cSJim Jagielski 				else
1252*b1cdbd2cSJim Jagielski 				{
1253*b1cdbd2cSJim Jagielski 					out( "NA", stream, nPos );
1254*b1cdbd2cSJim Jagielski 				}
1255*b1cdbd2cSJim Jagielski 			}
1256*b1cdbd2cSJim Jagielski 		}
1257*b1cdbd2cSJim Jagielski 	}
1258*b1cdbd2cSJim Jagielski 	catch (Exception & rExc)
1259*b1cdbd2cSJim Jagielski 	{
1260*b1cdbd2cSJim Jagielski 		if (stream != stderr && stream != stdout)
1261*b1cdbd2cSJim Jagielski 			::fclose( stream );
1262*b1cdbd2cSJim Jagielski 		throw RuntimeException( rExc.Message, rExc.Context );
1263*b1cdbd2cSJim Jagielski 	}
1264*b1cdbd2cSJim Jagielski 
1265*b1cdbd2cSJim Jagielski 	if (stream != stderr && stream != stdout)
1266*b1cdbd2cSJim Jagielski 		::fclose( stream );
1267*b1cdbd2cSJim Jagielski 
1268*b1cdbd2cSJim Jagielski 	out( "\n> done.\n" );
1269*b1cdbd2cSJim Jagielski 	return 0;
1270*b1cdbd2cSJim Jagielski }
1271*b1cdbd2cSJim Jagielski 
1272*b1cdbd2cSJim Jagielski }
1273*b1cdbd2cSJim Jagielski 
1274*b1cdbd2cSJim Jagielski 
1275*b1cdbd2cSJim Jagielski //##################################################################################################
1276*b1cdbd2cSJim Jagielski //##################################################################################################
1277*b1cdbd2cSJim Jagielski //##################################################################################################
1278*b1cdbd2cSJim Jagielski 
1279*b1cdbd2cSJim Jagielski 
1280*b1cdbd2cSJim Jagielski extern "C"
1281*b1cdbd2cSJim Jagielski {
1282*b1cdbd2cSJim Jagielski //==================================================================================================
component_getImplementationEnvironment(const sal_Char ** ppEnvTypeName,uno_Environment ** ppEnv)1283*b1cdbd2cSJim Jagielski void SAL_CALL component_getImplementationEnvironment(
1284*b1cdbd2cSJim Jagielski 	const sal_Char ** ppEnvTypeName, uno_Environment ** ppEnv )
1285*b1cdbd2cSJim Jagielski {
1286*b1cdbd2cSJim Jagielski 	*ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
1287*b1cdbd2cSJim Jagielski }
1288*b1cdbd2cSJim Jagielski //==================================================================================================
component_writeInfo(void * pServiceManager,void * pRegistryKey)1289*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL component_writeInfo(
1290*b1cdbd2cSJim Jagielski 	void * pServiceManager, void * pRegistryKey )
1291*b1cdbd2cSJim Jagielski {
1292*b1cdbd2cSJim Jagielski 	if (pRegistryKey)
1293*b1cdbd2cSJim Jagielski 	{
1294*b1cdbd2cSJim Jagielski 		try
1295*b1cdbd2cSJim Jagielski 		{
1296*b1cdbd2cSJim Jagielski 			Reference< XRegistryKey > xNewKey(
1297*b1cdbd2cSJim Jagielski 				reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey(
1298*b1cdbd2cSJim Jagielski 					OUString( RTL_CONSTASCII_USTRINGPARAM("/" IMPLNAME "/UNO/SERVICES") ) ) );
1299*b1cdbd2cSJim Jagielski 			xNewKey->createKey( OUString( RTL_CONSTASCII_USTRINGPARAM(SERVICENAME) ) );
1300*b1cdbd2cSJim Jagielski 
1301*b1cdbd2cSJim Jagielski 			return sal_True;
1302*b1cdbd2cSJim Jagielski 		}
1303*b1cdbd2cSJim Jagielski 		catch (InvalidRegistryException &)
1304*b1cdbd2cSJim Jagielski 		{
1305*b1cdbd2cSJim Jagielski 			OSL_ENSURE( sal_False, "### InvalidRegistryException!" );
1306*b1cdbd2cSJim Jagielski 		}
1307*b1cdbd2cSJim Jagielski 	}
1308*b1cdbd2cSJim Jagielski 	return sal_False;
1309*b1cdbd2cSJim Jagielski }
1310*b1cdbd2cSJim Jagielski //==================================================================================================
component_getFactory(const sal_Char * pImplName,void * pServiceManager,void * pRegistryKey)1311*b1cdbd2cSJim Jagielski void * SAL_CALL component_getFactory(
1312*b1cdbd2cSJim Jagielski 	const sal_Char * pImplName, void * pServiceManager, void * pRegistryKey )
1313*b1cdbd2cSJim Jagielski {
1314*b1cdbd2cSJim Jagielski 	void * pRet = 0;
1315*b1cdbd2cSJim Jagielski 
1316*b1cdbd2cSJim Jagielski 	if (pServiceManager && rtl_str_compare( pImplName, IMPLNAME ) == 0)
1317*b1cdbd2cSJim Jagielski 	{
1318*b1cdbd2cSJim Jagielski 		Reference< XSingleServiceFactory > xFactory( createSingleFactory(
1319*b1cdbd2cSJim Jagielski 			reinterpret_cast< XMultiServiceFactory * >( pServiceManager ),
1320*b1cdbd2cSJim Jagielski 			OUString( RTL_CONSTASCII_USTRINGPARAM(IMPLNAME) ),
1321*b1cdbd2cSJim Jagielski 			benchmark_test::TestImpl_create,
1322*b1cdbd2cSJim Jagielski 			benchmark_test::getSupportedServiceNames() ) );
1323*b1cdbd2cSJim Jagielski 
1324*b1cdbd2cSJim Jagielski 		if (xFactory.is())
1325*b1cdbd2cSJim Jagielski 		{
1326*b1cdbd2cSJim Jagielski 			xFactory->acquire();
1327*b1cdbd2cSJim Jagielski 			pRet = xFactory.get();
1328*b1cdbd2cSJim Jagielski 		}
1329*b1cdbd2cSJim Jagielski 	}
1330*b1cdbd2cSJim Jagielski 
1331*b1cdbd2cSJim Jagielski 	return pRet;
1332*b1cdbd2cSJim Jagielski }
1333*b1cdbd2cSJim Jagielski }
1334