kerneltest/e32test/dll/t_nestdll.cpp
author hgs
Tue, 02 Nov 2010 15:42:21 +0000
changeset 301 172f33f13d7d
parent 300 1d28c8722707
permissions -rw-r--r--
201043_12
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
300
1d28c8722707 201043_09
hgs
parents:
diff changeset
     1
// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
1d28c8722707 201043_09
hgs
parents:
diff changeset
     2
// All rights reserved.
1d28c8722707 201043_09
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
1d28c8722707 201043_09
hgs
parents:
diff changeset
     4
// under the terms of the License "Eclipse Public License v1.0"
1d28c8722707 201043_09
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
1d28c8722707 201043_09
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
1d28c8722707 201043_09
hgs
parents:
diff changeset
     7
//
1d28c8722707 201043_09
hgs
parents:
diff changeset
     8
// Initial Contributors:
1d28c8722707 201043_09
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
1d28c8722707 201043_09
hgs
parents:
diff changeset
    10
//
1d28c8722707 201043_09
hgs
parents:
diff changeset
    11
// Contributors:
1d28c8722707 201043_09
hgs
parents:
diff changeset
    12
//
1d28c8722707 201043_09
hgs
parents:
diff changeset
    13
// Description:
1d28c8722707 201043_09
hgs
parents:
diff changeset
    14
// e32test\dll\t_nestdll.cpp
1d28c8722707 201043_09
hgs
parents:
diff changeset
    15
// 
1d28c8722707 201043_09
hgs
parents:
diff changeset
    16
//
1d28c8722707 201043_09
hgs
parents:
diff changeset
    17
1d28c8722707 201043_09
hgs
parents:
diff changeset
    18
#include <e32std.h>
1d28c8722707 201043_09
hgs
parents:
diff changeset
    19
#include <e32debug.h>
1d28c8722707 201043_09
hgs
parents:
diff changeset
    20
#include <e32svr.h>
1d28c8722707 201043_09
hgs
parents:
diff changeset
    21
1d28c8722707 201043_09
hgs
parents:
diff changeset
    22
// Utility macros for stringification, long-stringification, and token pasting
1d28c8722707 201043_09
hgs
parents:
diff changeset
    23
// These are indirected so that if you call them on things which are also macros,
1d28c8722707 201043_09
hgs
parents:
diff changeset
    24
// the macros are expanded first.
1d28c8722707 201043_09
hgs
parents:
diff changeset
    25
#define STRINGIFY_(x) #x
1d28c8722707 201043_09
hgs
parents:
diff changeset
    26
#define STRINGIFY(x) STRINGIFY_(x)
1d28c8722707 201043_09
hgs
parents:
diff changeset
    27
#define LSTRINGIFY_(x) L ## #x
1d28c8722707 201043_09
hgs
parents:
diff changeset
    28
#define LSTRINGIFY(x) LSTRINGIFY_(x)
1d28c8722707 201043_09
hgs
parents:
diff changeset
    29
#define PASTE_(x,y) x ## y
1d28c8722707 201043_09
hgs
parents:
diff changeset
    30
#define PASTE(x,y) PASTE_(x,y)
1d28c8722707 201043_09
hgs
parents:
diff changeset
    31
1d28c8722707 201043_09
hgs
parents:
diff changeset
    32
// Declare the imported functions for the DLLs we statically link to
1d28c8722707 201043_09
hgs
parents:
diff changeset
    33
#ifdef LINK_TO
1d28c8722707 201043_09
hgs
parents:
diff changeset
    34
IMPORT_C TInt PASTE(DataForDLL,LINK_TO)();
1d28c8722707 201043_09
hgs
parents:
diff changeset
    35
#endif
1d28c8722707 201043_09
hgs
parents:
diff changeset
    36
1d28c8722707 201043_09
hgs
parents:
diff changeset
    37
// Dummy class just to get a constructor into the binary
1d28c8722707 201043_09
hgs
parents:
diff changeset
    38
class ConstructorTest
1d28c8722707 201043_09
hgs
parents:
diff changeset
    39
	{
1d28c8722707 201043_09
hgs
parents:
diff changeset
    40
public:
1d28c8722707 201043_09
hgs
parents:
diff changeset
    41
	ConstructorTest();
1d28c8722707 201043_09
hgs
parents:
diff changeset
    42
	};
1d28c8722707 201043_09
hgs
parents:
diff changeset
    43
1d28c8722707 201043_09
hgs
parents:
diff changeset
    44
// Constructor, which should be called exactly once per DLL
1d28c8722707 201043_09
hgs
parents:
diff changeset
    45
ConstructorTest::ConstructorTest()
1d28c8722707 201043_09
hgs
parents:
diff changeset
    46
	{
1d28c8722707 201043_09
hgs
parents:
diff changeset
    47
	RDebug::Printf("In constructor for DLL " STRINGIFY(DLL_NUMBER));
1d28c8722707 201043_09
hgs
parents:
diff changeset
    48
1d28c8722707 201043_09
hgs
parents:
diff changeset
    49
	// Call the imported functions for the DLL we statically link to.
1d28c8722707 201043_09
hgs
parents:
diff changeset
    50
	// This is just to get them into the import table.
1d28c8722707 201043_09
hgs
parents:
diff changeset
    51
#ifdef LINK_TO
1d28c8722707 201043_09
hgs
parents:
diff changeset
    52
	PASTE(DataForDLL,LINK_TO)();
1d28c8722707 201043_09
hgs
parents:
diff changeset
    53
#endif
1d28c8722707 201043_09
hgs
parents:
diff changeset
    54
1d28c8722707 201043_09
hgs
parents:
diff changeset
    55
	// Use DLL TLS handle zero to fake a global data object
1d28c8722707 201043_09
hgs
parents:
diff changeset
    56
	TInt* loadOrder = (TInt*)UserSvr::DllTls(0);
1d28c8722707 201043_09
hgs
parents:
diff changeset
    57
	if (!loadOrder)
1d28c8722707 201043_09
hgs
parents:
diff changeset
    58
		{
1d28c8722707 201043_09
hgs
parents:
diff changeset
    59
		// If we're the first constructor, allocate an array and zero it
1d28c8722707 201043_09
hgs
parents:
diff changeset
    60
		loadOrder = new TInt[100];
1d28c8722707 201043_09
hgs
parents:
diff changeset
    61
		for (TInt i = 0; i < 100; ++i)
1d28c8722707 201043_09
hgs
parents:
diff changeset
    62
			loadOrder[i] = 0;
1d28c8722707 201043_09
hgs
parents:
diff changeset
    63
		UserSvr::DllSetTls(0, loadOrder);
1d28c8722707 201043_09
hgs
parents:
diff changeset
    64
		}
1d28c8722707 201043_09
hgs
parents:
diff changeset
    65
1d28c8722707 201043_09
hgs
parents:
diff changeset
    66
	// Find the first zero entry in the load order array and add our index
1d28c8722707 201043_09
hgs
parents:
diff changeset
    67
	TInt next = 0;
1d28c8722707 201043_09
hgs
parents:
diff changeset
    68
	while (loadOrder[next] != 0)
1d28c8722707 201043_09
hgs
parents:
diff changeset
    69
		++next;
1d28c8722707 201043_09
hgs
parents:
diff changeset
    70
	loadOrder[next] = DLL_NUMBER;
1d28c8722707 201043_09
hgs
parents:
diff changeset
    71
1d28c8722707 201043_09
hgs
parents:
diff changeset
    72
	// If we're supposed to be doing a nested DLL load, do it here.
1d28c8722707 201043_09
hgs
parents:
diff changeset
    73
	// You aren't supposed to leave in a constructor but it causes an
1d28c8722707 201043_09
hgs
parents:
diff changeset
    74
	// identifiable panic, to distinguish it from any other possible crash.
1d28c8722707 201043_09
hgs
parents:
diff changeset
    75
#ifdef LOAD_DLL
1d28c8722707 201043_09
hgs
parents:
diff changeset
    76
	RDebug::Printf("Doing nested DLL load");
1d28c8722707 201043_09
hgs
parents:
diff changeset
    77
	RLibrary lib;
1d28c8722707 201043_09
hgs
parents:
diff changeset
    78
	TInt r = lib.Load(TPtrC16((const TText*)(L"t_nestdll" LSTRINGIFY(LOAD_DLL) L".dll")));
1d28c8722707 201043_09
hgs
parents:
diff changeset
    79
	RDebug::Printf("Nested DLL load returned %d", r);
1d28c8722707 201043_09
hgs
parents:
diff changeset
    80
	User::LeaveIfError(r);
1d28c8722707 201043_09
hgs
parents:
diff changeset
    81
#endif
1d28c8722707 201043_09
hgs
parents:
diff changeset
    82
	}
1d28c8722707 201043_09
hgs
parents:
diff changeset
    83
1d28c8722707 201043_09
hgs
parents:
diff changeset
    84
// Global instance of the dummy object
1d28c8722707 201043_09
hgs
parents:
diff changeset
    85
ConstructorTest constructor_test;
1d28c8722707 201043_09
hgs
parents:
diff changeset
    86
1d28c8722707 201043_09
hgs
parents:
diff changeset
    87
// The exported function for this DLL, which just tells you how many times the constructor was called
1d28c8722707 201043_09
hgs
parents:
diff changeset
    88
EXPORT_C TInt PASTE(DataForDLL,DLL_NUMBER)()
1d28c8722707 201043_09
hgs
parents:
diff changeset
    89
	{
1d28c8722707 201043_09
hgs
parents:
diff changeset
    90
	return 0;
1d28c8722707 201043_09
hgs
parents:
diff changeset
    91
	}