1 /**************************************************************************** 2 ** 3 ** Copyright (C) 2015 The Qt Company Ltd. 4 ** Contact: http://www.qt.io/licensing/ 5 ** 6 ** This file is part of the QtCore module of the Qt Toolkit. 7 ** 8 ** $QT_BEGIN_LICENSE:LGPL$ 9 ** Commercial License Usage 10 ** Licensees holding valid commercial Qt licenses may use this file in 11 ** accordance with the commercial license agreement provided with the 12 ** Software or, alternatively, in accordance with the terms contained in 13 ** a written agreement between you and The Qt Company. For licensing terms 14 ** and conditions see http://www.qt.io/terms-conditions. For further 15 ** information use the contact form at http://www.qt.io/contact-us. 16 ** 17 ** GNU Lesser General Public License Usage 18 ** Alternatively, this file may be used under the terms of the GNU Lesser 19 ** General Public License version 2.1 or version 3 as published by the Free 20 ** Software Foundation and appearing in the file LICENSE.LGPLv21 and 21 ** LICENSE.LGPLv3 included in the packaging of this file. Please review the 22 ** following information to ensure the GNU Lesser General Public License 23 ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and 24 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. 25 ** 26 ** As a special exception, The Qt Company gives you certain additional 27 ** rights. These rights are described in The Qt Company LGPL Exception 28 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. 29 ** 30 ** GNU General Public License Usage 31 ** Alternatively, this file may be used under the terms of the GNU 32 ** General Public License version 3.0 as published by the Free Software 33 ** Foundation and appearing in the file LICENSE.GPL included in the 34 ** packaging of this file. Please review the following information to 35 ** ensure the GNU General Public License version 3.0 requirements will be 36 ** met: http://www.gnu.org/copyleft/gpl.html. 37 ** 38 ** $QT_END_LICENSE$ 39 ** 40 ****************************************************************************/ 41 42 #ifndef QSHAREDMEMORY_P_H 43 #define QSHAREDMEMORY_P_H 44 45 // 46 // W A R N I N G 47 // ------------- 48 // 49 // This file is not part of the Qt API. It exists purely as an 50 // implementation detail. This header file may change from version to 51 // version without notice, or even be removed. 52 // 53 // We mean it. 54 // 55 56 #include "qsharedmemory.h" 57 58 #ifdef QT_NO_SHAREDMEMORY 59 # ifndef QT_NO_SYSTEMSEMAPHORE 60 namespace QSharedMemoryPrivate 61 { 62 int createUnixKeyFile(const QString &fileName); 63 QString makePlatformSafeKey(const QString &key, 64 const QString &prefix = QLatin1String("qipc_sharedmemory_")); 65 } 66 #endif 67 #else 68 69 #include "qsystemsemaphore.h" 70 #include "private/qobject_p.h" 71 72 #ifdef Q_OS_WIN 73 # include <qt_windows.h> 74 #elif defined(Q_OS_SYMBIAN) 75 # include <e32std.h> 76 # include <sys/types.h> 77 #else 78 # include <sys/types.h> 79 #endif 80 81 QT_BEGIN_NAMESPACE 82 83 #ifndef QT_NO_SYSTEMSEMAPHORE 84 /*! 85 Helper class 86 */ 87 class QSharedMemoryLocker 88 { 89 90 public: QSharedMemoryLocker(QSharedMemory * sharedMemory)91 inline QSharedMemoryLocker(QSharedMemory *sharedMemory) : q_sm(sharedMemory) 92 { 93 Q_ASSERT(q_sm); 94 } 95 ~QSharedMemoryLocker()96 inline ~QSharedMemoryLocker() 97 { 98 if (q_sm) 99 q_sm->unlock(); 100 } 101 lock()102 inline bool lock() 103 { 104 if (q_sm && q_sm->lock()) 105 return true; 106 q_sm = 0; 107 return false; 108 } 109 110 private: 111 QSharedMemory *q_sm; 112 }; 113 #endif // QT_NO_SYSTEMSEMAPHORE 114 115 class Q_AUTOTEST_EXPORT QSharedMemoryPrivate : public QObjectPrivate 116 { 117 Q_DECLARE_PUBLIC(QSharedMemory) 118 119 public: 120 QSharedMemoryPrivate(); 121 122 void *memory; 123 int size; 124 QString key; 125 QString nativeKey; 126 QSharedMemory::SharedMemoryError error; 127 QString errorString; 128 #ifndef QT_NO_SYSTEMSEMAPHORE 129 QSystemSemaphore systemSemaphore; 130 bool lockedByMe; 131 #endif 132 133 static int createUnixKeyFile(const QString &fileName); 134 static QString makePlatformSafeKey(const QString &key, 135 const QString &prefix = QLatin1String("qipc_sharedmemory_")); 136 #ifdef Q_OS_WIN 137 HANDLE handle(); 138 #elif defined(QT_POSIX_IPC) 139 int handle(); 140 #else 141 key_t handle(); 142 #endif 143 bool initKey(); 144 void cleanHandle(); 145 bool create(int size); 146 bool attach(QSharedMemory::AccessMode mode); 147 bool detach(); 148 149 #ifdef Q_OS_SYMBIAN 150 void setErrorString(const QString &function, TInt errorCode); 151 #else 152 void setErrorString(const QString &function); 153 #endif 154 155 #ifndef QT_NO_SYSTEMSEMAPHORE tryLocker(QSharedMemoryLocker * locker,const QString & function)156 inline bool tryLocker(QSharedMemoryLocker *locker, const QString &function) { 157 if (!locker->lock()) { 158 errorString = QSharedMemory::tr("%1: unable to lock").arg(function); 159 error = QSharedMemory::LockError; 160 return false; 161 } 162 return true; 163 } 164 #endif // QT_NO_SYSTEMSEMAPHORE 165 166 private: 167 #ifdef Q_OS_WIN 168 HANDLE hand; 169 #elif defined(Q_OS_SYMBIAN) 170 RChunk chunk; 171 #elif defined(QT_POSIX_IPC) 172 int hand; 173 #else 174 key_t unix_key; 175 #endif 176 }; 177 178 QT_END_NAMESPACE 179 180 #endif // QT_NO_SHAREDMEMORY 181 182 #endif // QSHAREDMEMORY_P_H 183 184