qthreadstorage.h
上传用户:detong
上传日期:2022-06-22
资源大小:20675k
文件大小:4k
- /****************************************************************************
- **
- ** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
- ** Contact: Qt Software Information (qt-info@nokia.com)
- **
- ** This file is part of the QtCore module of the Qt Toolkit.
- **
- ** Commercial Usage
- ** Licensees holding valid Qt Commercial licenses may use this file in
- ** accordance with the Qt Commercial License Agreement provided with the
- ** Software or, alternatively, in accordance with the terms contained in
- ** a written agreement between you and Nokia.
- **
- **
- ** GNU General Public License Usage
- ** Alternatively, this file may be used under the terms of the GNU
- ** General Public License versions 2.0 or 3.0 as published by the Free
- ** Software Foundation and appearing in the file LICENSE.GPL included in
- ** the packaging of this file. Please review the following information
- ** to ensure GNU General Public Licensing requirements will be met:
- ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
- ** http://www.gnu.org/copyleft/gpl.html. In addition, as a special
- ** exception, Nokia gives you certain additional rights. These rights
- ** are described in the Nokia Qt GPL Exception version 1.3, included in
- ** the file GPL_EXCEPTION.txt in this package.
- **
- ** Qt for Windows(R) Licensees
- ** As a special exception, Nokia, as the sole copyright holder for Qt
- ** Designer, grants users of the Qt/Eclipse Integration plug-in the
- ** right for the Qt/Eclipse Integration to link to functionality
- ** provided by Qt Designer and its related libraries.
- **
- ** If you are unsure which license is appropriate for your use, please
- ** contact the sales department at qt-sales@nokia.com.
- **
- ****************************************************************************/
- #ifndef QTHREADSTORAGE_H
- #define QTHREADSTORAGE_H
- #include <QtCore/qglobal.h>
- #ifndef QT_NO_THREAD
- QT_BEGIN_HEADER
- QT_BEGIN_NAMESPACE
- QT_MODULE(Core)
- class Q_CORE_EXPORT QThreadStorageData
- {
- public:
- explicit QThreadStorageData(void (*func)(void *));
- ~QThreadStorageData();
- void** get() const;
- void** set(void* p);
- static void finish(void**);
- int id;
- };
- #if !defined(QT_MOC_CPP)
- // MOC_SKIP_BEGIN
- // pointer specialization
- template <typename T>
- inline
- T *&qThreadStorage_localData(QThreadStorageData &d, T **)
- {
- void **v = d.get();
- if (!v) v = d.set(0);
- return *(reinterpret_cast<T**>(v));
- }
- template <typename T>
- inline
- T *qThreadStorage_localData_const(const QThreadStorageData &d, T **)
- {
- void **v = d.get();
- return v ? *(reinterpret_cast<T**>(v)) : 0;
- }
- template <typename T>
- inline
- void qThreadStorage_setLocalData(QThreadStorageData &d, T **t)
- { (void) d.set(*t); }
- #ifndef QT_NO_PARTIAL_TEMPLATE_SPECIALIZATION
- // value-based specialization
- template <typename T>
- inline
- T &qThreadStorage_localData(QThreadStorageData &d, T *)
- {
- void **v = d.get();
- if (!v) v = d.set(new T());
- return *(reinterpret_cast<T*>(*v));
- }
- template <typename T>
- inline
- T qThreadStorage_localData_const(const QThreadStorageData &d, T *)
- {
- void **v = d.get();
- return v ? *(reinterpret_cast<T*>(*v)) : T();
- }
- template <typename T>
- inline
- void qThreadStorage_setLocalData(QThreadStorageData &d, T *t)
- { (void) d.set(new T(*t)); }
- #endif // QT_NO_PARTIAL_TEMPLATE_SPECIALIZATION
- // MOC_SKIP_END
- #endif
- template <class T>
- class QThreadStorage
- {
- private:
- QThreadStorageData d;
- Q_DISABLE_COPY(QThreadStorage)
- static inline void deleteData(void *x)
- { delete static_cast<T>(x); }
- public:
- inline QThreadStorage() : d(deleteData) { }
- inline ~QThreadStorage() { }
- inline bool hasLocalData() const
- { return d.get() != 0; }
- inline T& localData()
- { return qThreadStorage_localData(d, reinterpret_cast<T*>(0)); }
- inline T localData() const
- { return qThreadStorage_localData_const(d, reinterpret_cast<T*>(0)); }
- inline void setLocalData(T t)
- { qThreadStorage_setLocalData(d, &t); }
- };
- QT_END_NAMESPACE
- QT_END_HEADER
- #endif // QT_NO_THREAD
- #endif // QTHREADSTORAGE_H