bluetooth/btstack/linkmgr/hostmbufpool.h
author hgs
Mon, 12 Jul 2010 07:03:47 +0300
changeset 33 4e80e1b997a8
permissions -rw-r--r--
201025_01
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
     1
// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
     2
// All rights reserved.
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
     7
//
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
     8
// Initial Contributors:
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    10
//
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    11
// Contributors:
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    12
//
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    13
// Description:
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    14
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    15
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    16
#ifndef HOSTMBUFPOOL
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    17
#define HOSTMBUFPOOL
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    18
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    19
#include <e32base.h>
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    20
#include <bttypes.h>
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    21
#include <es_mbuf.h>
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    22
#include <bluetooth/hcicommandqueueclient.h>
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    23
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    24
#ifdef HOSTCONTROLLER_TO_HOST_FLOW_CONTROL
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    25
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    26
class MHCICommandQueue;
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    27
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    28
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    29
NONSHARABLE_CLASS(CHostMBufPool) 
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    30
	: public CActive
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    31
	, private MHCICommandQueueClient
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    32
	{
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    33
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    34
	NONSHARABLE_STRUCT(TPoolBuffer)
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    35
		{
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    36
		RMBufChain		iMBufChain;
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    37
		THCIConnHandle	iCurrentHandle;
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    38
		TSglQueLink		iLink;
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    39
		};
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    40
	
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    41
public:
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    42
	static CHostMBufPool* NewL(MHCICommandQueue& aCommandQueue);
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    43
	~CHostMBufPool();
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    44
	
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    45
	RMBufChain TakeBufferL(THCIConnHandle aConnHandle);
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    46
	
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    47
	void InvalidateByConnH(THCIConnHandle aConnHandle);
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    48
	
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    49
private:
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    50
	CHostMBufPool(MHCICommandQueue& aCommandQueue);
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    51
	void ConstructL();
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    52
	
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    53
	void DeletePool(TSglQue<TPoolBuffer>& aPool);
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    54
	void DeleteBuffer(TPoolBuffer*& aBuffer);
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    55
	void AllocNewBuffer(TPoolBuffer& aBuffer);
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    56
	TPoolBuffer* CreatePoolBufferL();
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    57
	void HostNumberOfCompletedPacketsL(THCIConnHandle aConnH, TUint16 aNumPackets);
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    58
	void TryToAllocQueuedBuffer();
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    59
	
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    60
	inline void AddToBufferPool(TPoolBuffer& aBuffer);
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    61
	inline void RemoveFromBufferPool(TPoolBuffer& aBuffer);
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    62
	
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    63
	void Error(TInt aError);
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    64
	
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    65
private: // from CActive
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    66
	void RunL();
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    67
	void DoCancel();
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    68
	TInt RunError(TInt aError);
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    69
	
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    70
private: // from MHCICommandQueueClient
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    71
	void MhcqcCommandEventReceived(const THCIEventBase& aEvent, const CHCICommandBase* aRelatedCommand);
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    72
	void MhcqcCommandErrored(TInt aErrorCode, const CHCICommandBase* aCommand);
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    73
	
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    74
private:
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    75
	MHCICommandQueue& iCmdQ;
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    76
	
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    77
	TSglQue<TPoolBuffer> iBufferPool;
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    78
	TSglQue<TPoolBuffer> iWaitingAllocPool;
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    79
	TPoolBuffer* iBufferBeingAllocd;
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    80
	
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    81
	// We batch up completed packets notifications for a connection handle so that they are 
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    82
	// only sent every 'x' packets OR if we get a packet for a different connection handle.
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    83
	TInt iCurrAckHandle; // current handle of packets being batched for completion
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    84
	TUint iCurrCompletedPackets; // number of packets already completed for current handle
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    85
	
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    86
	RMBufAsyncRequest iMBufRequester;
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    87
	};
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    88
	
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    89
inline void CHostMBufPool::AddToBufferPool(TPoolBuffer& aBuffer)
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    90
	{
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    91
	iBufferPool.AddLast(aBuffer);
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    92
	}
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    93
	
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    94
inline void CHostMBufPool::RemoveFromBufferPool(TPoolBuffer& aBuffer)
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    95
	{
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    96
	iBufferPool.Remove(aBuffer);
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    97
	}
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    98
	
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
    99
#endif //HOSTCONTROLLER_TO_HOST_FLOW_CONTROL
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
   100
4e80e1b997a8 201025_01
hgs
parents:
diff changeset
   101
#endif // HOSTMBUFPOOL