kernel/eka/compsupp/symaehabi/emergency_buffer.h
author hgs
Mon, 18 Oct 2010 15:31:10 +0100
changeset 291 206a6eaaeb71
permissions -rw-r--r--
201041_05
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
291
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
     1
// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
     2
// All rights reserved.
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
     4
// under the terms of the License "ARM EABI LICENCE.txt"
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
     6
// in kernel/eka/compsupp.
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
     7
//
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
     8
// Initial Contributors:
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    10
//
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    11
// Contributors:
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    12
//
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    13
// Description:
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    14
// 
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    15
//
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    16
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    17
template<typename T, unsigned N> class TEmergencyBuffer
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    18
	{
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    19
public:
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    20
	void Init();
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    21
public:
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    22
	void* Alloc(unsigned);
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    23
	void* Free(void*);
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    24
private:
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    25
	bool iIsOccupied[N];
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    26
	T iSlots[N];
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    27
private:
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    28
	TEmergencyBuffer();
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    29
	};
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    30
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    31
template<typename T, unsigned N> inline void TEmergencyBuffer<T,N>::Init()
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    32
	{
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    33
	for (int i=0; i < N; i++)
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    34
		{
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    35
		iIsOccupied[i] = 0;
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    36
		}
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    37
	}
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    38
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    39
template<typename T, unsigned N> void* TEmergencyBuffer<T,N>::Alloc(unsigned n)
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    40
	{
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    41
	if ( n <= sizeof(T) )
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    42
		{
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    43
		for (int i=0; i < N; i++)
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    44
			{
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    45
			bool& isOccupied = iIsOccupied[i];
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    46
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    47
			if ( ! isOccupied )
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    48
				{
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    49
				isOccupied = 1;
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    50
				return &iSlots[i];
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    51
				}
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    52
			}
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    53
		}
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    54
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    55
	return NULL;
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    56
	}
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    57
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    58
template<typename T, unsigned N> void* TEmergencyBuffer<T,N>::Free(void* p)
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    59
	{
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    60
	for (int i=0; i < N; i++)
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    61
		{
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    62
		const void* bp = &iSlots[i];
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    63
		bool& isOccupied = iIsOccupied[i];
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    64
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    65
		if ( bp == p && isOccupied )
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    66
			{
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    67
			isOccupied = 0;
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    68
			return p;
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    69
			}
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    70
		}
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    71
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    72
	return NULL;
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    73
	}
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    74
206a6eaaeb71 201041_05
hgs
parents:
diff changeset
    75