wlan_bearer/wlanldd/wlan_common/osa_common/inc/osahandle.inl
changeset 0 c40eb8fe8501
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wlan_bearer/wlanldd/wlan_common/osa_common/inc/osahandle.inl	Tue Feb 02 02:03:13 2010 +0200
@@ -0,0 +1,265 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:   inline implementation of Handle
+*
+*/
+
+/*
+* %version: 4 %
+*/
+
+#include "algorithm.h"  // for operator !=
+#include <wlanosa.h>    // for assert
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+template<class T>
+inline Handle<T>::Handle( T& aElem ) 
+    : iData( &aElem ), iRefCount( new TInt( 1 ) )
+    {
+    TraceDump(INFO_LEVEL, (("[WLAN] Handle ctor +: 0x%08x"), this));
+    TraceDump(INFO_LEVEL, (("[WLAN] data: 0x%08x"), iData));
+    TraceDump(INFO_LEVEL, (("[WLAN] refcount: 0x%08x"), iRefCount));
+
+    if ( iRefCount )
+        {
+        // allocation success
+        TraceDump(INFO_LEVEL, 
+            (("[WLAN] reference count: %d"), *iRefCount));
+        Validate();
+        }
+    else
+        {
+        // allocation failure
+        TraceDump(ERROR_LEVEL, ("[WLAN] error: allocation"));
+        Trace( ERROR_LEVEL, 
+            reinterpret_cast<const TInt8*>(WLAN_FILE), __LINE__ );
+
+        InValidate();
+        }
+
+    TraceDump(INFO_LEVEL, (("[WLAN] Handle ctor -: 0x%08x"), this));
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+template<class T>
+inline Handle<T>::~Handle()
+    {
+    TraceDump(INFO_LEVEL, (("[WLAN] Handle dtor +: 0x%08x"), this));
+
+    Dispose();
+
+    TraceDump(INFO_LEVEL, (("[WLAN] Handle dtor -: 0x%08x"), this));
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+template<class T>
+inline Handle<T>::Handle( const Self& aElem ) 
+    : iData( aElem.iData ), iRefCount( aElem.iRefCount )
+    {
+    TraceDump(INFO_LEVEL, (("[WLAN] Handle copy ctor +: 0x%08x"), this));
+    TraceDump(INFO_LEVEL, (("[WLAN] data: 0x%08x"), iData));
+    TraceDump(INFO_LEVEL, (("[WLAN] refcount: 0x%08x"), iRefCount));
+
+
+    MWlanOsa::Assert( reinterpret_cast<const TInt8*>(WLAN_FILE), 
+        __LINE__, (iRefCount != NULL) );
+
+    ++(*iRefCount);
+    TraceDump(INFO_LEVEL, (("[WLAN] reference count: %d"), *iRefCount));
+
+    TraceDump(INFO_LEVEL, (("[WLAN] Handle copy ctor -: 0x%08x"), this));
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+template<class T>
+inline Handle<T>& Handle<T>::operator=( const Self& aElem )
+    {
+    TraceDump(INFO_LEVEL, 
+        (("[WLAN] Handle assignement operator +: 0x%08x"), this));
+
+    if ( *this != aElem )
+        {
+        Dispose();
+
+        iData = aElem.iData;
+        iRefCount = aElem.iRefCount;
+
+        TraceDump(INFO_LEVEL, (("[WLAN] data: 0x%08x"), iData));
+        TraceDump(INFO_LEVEL, (("[WLAN] refcount: 0x%08x"), iRefCount));
+
+        MWlanOsa::Assert( reinterpret_cast<const TInt8*>(WLAN_FILE), 
+            __LINE__, (iRefCount != NULL) );
+
+        ++(*iRefCount);
+        }
+    else
+        {
+        // left intentionally empty
+        }
+
+    TraceDump(INFO_LEVEL, (("[WLAN] reference count: %d"), *iRefCount));
+    TraceDump(INFO_LEVEL, 
+        (("[WLAN] Handle assignement operator -: 0x%08x"), this));
+
+    return *this;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+template<class T>
+inline T* Handle<T>::operator->()
+    {
+    return iData;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+template<class T>
+inline T* Handle<T>::Data()
+    {
+    MWlanOsa::Assert( reinterpret_cast<const TInt8*>(WLAN_FILE), 
+        __LINE__, (iData != NULL) );
+    return iData;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+template<class T>
+inline const T* Handle<T>::Data() const
+    {
+    MWlanOsa::Assert( reinterpret_cast<const TInt8*>(WLAN_FILE), 
+        __LINE__, (iData != NULL) );
+    return iData;
+    }
+
+// -----------------------------------------------------------------------------
+// only upon allocation failure return EFalse
+// -----------------------------------------------------------------------------
+//
+template<class T>
+inline TBool Handle<T>::Bind( T& aElem )
+    {
+    TraceDump(INFO_LEVEL, (("[WLAN] Handle::Bind +: 0x%08x"), this));
+
+    TBool ret( ETrue );
+
+    if ( aElem != *iData )
+        {
+        if ( --(*iRefCount) == 0 )
+            {
+            TraceDump(INFO_LEVEL, 
+                ("[WLAN] Handle::Bind deallocate referenced data"));
+            TraceDump(INFO_LEVEL, 
+                (("[WLAN] old data delloac: 0x%08x"), iData));
+            TraceDump(INFO_LEVEL, (("[WLAN] refcount: 0x%08x"), iRefCount));
+
+            delete iData;
+            ++(*iRefCount); // recycle counter
+            }
+        else
+            {
+            // references still exist after this critter is a goner
+            // as we are doing a rebind we shall create a new counter
+            iRefCount = new TInt( 1 );
+            if ( !iRefCount )
+                {
+                TraceDump(ERROR_LEVEL, ("[WLAN] error: allocation"));
+                Trace( ERROR_LEVEL, 
+                    reinterpret_cast<const TInt8*>(WLAN_FILE), __LINE__ );
+
+                ret = EFalse;
+                }
+            else
+                {
+                // allocation success
+                // left intentionally empty
+                TraceDump(INFO_LEVEL, 
+                    (("[WLAN] new refcount: 0x%08x"), iRefCount));
+                }
+            }
+
+        iData = &aElem;
+        TraceDump(INFO_LEVEL, (("[WLAN] new data: 0x%08x"), iData));
+        }
+    else
+        {
+        // left intentionally empty
+        }
+
+    TraceDump(INFO_LEVEL, (("[WLAN] reference count: %d"), *iRefCount));
+    TraceDump(INFO_LEVEL, (("[WLAN] Handle::Bind -: 0x%08x"), this));
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+template<class T>
+inline void Handle<T>::Dispose()
+    {
+    TraceDump(INFO_LEVEL, (("[WLAN] Handle::Dispose +: 0x%08x"), this));
+
+    if ( IsValid() )
+        {
+        // we are a valid object
+        MWlanOsa::Assert( reinterpret_cast<const TInt8*>(WLAN_FILE), 
+            __LINE__, (iRefCount != NULL) );
+
+        if ( --(*iRefCount) == 0 )
+            {
+            TraceDump(INFO_LEVEL, 
+                ("[WLAN] Handle::Dispose deallocate referenced data"));
+
+            TraceDump(INFO_LEVEL, (("[WLAN] data: 0x%08x"), iData));
+            delete iData;
+            TraceDump(INFO_LEVEL, (("[WLAN] refcount: 0x%08x"), iRefCount));
+            delete iRefCount;
+            }
+        else
+            {
+            // references still exist after this critter is a goner
+            // left intentionally empty
+            TraceDump(INFO_LEVEL, 
+                (("[WLAN] reference count: %d"), *iRefCount));
+            }
+        }
+    else
+        {
+        // we are an invalid object
+        // left intentionally empty
+        }
+
+    TraceDump(INFO_LEVEL, (("[WLAN] Handle::Dispose -: 0x%08x"), this));
+    }