diff -r 000000000000 -r f979ecb2b13e pimappsupport/vcardandvcal/inc/VersitTls.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pimappsupport/vcardandvcal/inc/VersitTls.h Tue Feb 02 10:12:19 2010 +0200 @@ -0,0 +1,110 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// + +#ifndef __VERSITTLS_H__ +#define __VERSITTLS_H__ + +// System includes +#include +#include + +#include + +class CVersitTimer; +class CVersitAdditionalStorage; + +class CVersitTlsData : public CBase +/** Versit thread local storage. + +This class provides a performance improvement by allowing a CVersitUnicodeUtils +instance to be shared between parsers operating in the same thread, so that +a new instance does not have to be created for each parser. A pointer to the +unicode utilities object is held in thread local storage: a single word (32bits) +of data. Each unicode utilities object is managed by an instance of this class. + +Every time a parser is created, CVersitParser::ConstructL() calls the +CVersitTlsData constructor, and when the parser is destroyed the CVersitTlsData +destructor is called. If a CVersitTlsData object exists, the constructor +returns a pointer to it, otherwise a new one is constructed. The CVersitTlsData +object is only destroyed when no more parsers refer to it: a count is kept, +which is incremented every time the constructor is called and decremented each +time the destructor is called, and the object is only destroyed when the count +reaches zero. + +This class provides an additional major performance improvement +if you are sequentially constructing and destructing multiple parsers. +By default, when the count of parsers reaches zero, the thread local +storage object is destroyed (even if the thread has not finished). However, +by using the technique described below, the thread local storage object, and therefore +the unicode utilities object, can be made to persist, significantly reducing +the overhead of sequentially constructing and destructing parsers. + +The constructor needs to be called an extra time before creating any parsers, +and the destructor needs to be called an extra time once the parsers have +been destroyed. This has the effect of adding one to the reference count so +that during all the parser construction and deletion the count never hits +zero, which would trigger the TLS object's destruction. + +This can be implemented as follows: + +1. Create a thread local storage data class instance as follows: +@code +CVersitTlsData* versitTLS = CVersitTlsData::VersitTlsDataL(); +@endcode + +2. Create and delete the parsers. + +3. Delete the Thread Local Storage Data class instance: +@code +delete versitTLS; +@endcode +@publishedAll +@released +*/ + { + friend class CVersitTimer; + +public: + IMPORT_C static CVersitTlsData& VersitTlsDataL(); + IMPORT_C static void CloseVersitTlsData(); + IMPORT_C void VersitTlsDataClose(); + +public: + inline CVersitUnicodeUtils& UnicodeUtils() + /** Returns a pointer to the current Unicode utilities object. + + @return A pointer to the current Unicode utilities object. */ + { return *iUnicodeUtils; } + + inline CVersitAdditionalStorage& AdditionalStorage() + /** Returns a pointer to the additional property storage object. + + @return A pointer to the additional property storage. */ + { + return *iAdditionalStorage; + } + +private: + static CVersitTlsData* NewL(); + void ConstructL(); + ~CVersitTlsData(); + +private: + TInt iRefCount; + CVersitUnicodeUtils* iUnicodeUtils; + CVersitAdditionalStorage* iAdditionalStorage; + }; + +#endif