1 /**************************************************************************** 2 ** 3 ** Copyright (C) 2016 The Qt Company Ltd. 4 ** Contact: https://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 https://www.qt.io/terms-conditions. For further 15 ** information use the contact form at https://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 3 as published by the Free Software 20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the 21 ** packaging of this file. Please review the following information to 22 ** ensure the GNU Lesser General Public License version 3 requirements 23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. 24 ** 25 ** GNU General Public License Usage 26 ** Alternatively, this file may be used under the terms of the GNU 27 ** General Public License version 2.0 or (at your option) the GNU General 28 ** Public license version 3 or any later version approved by the KDE Free 29 ** Qt Foundation. The licenses are as published by the Free Software 30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 31 ** included in the packaging of this file. Please review the following 32 ** information to ensure the GNU General Public License requirements will 33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and 34 ** https://www.gnu.org/licenses/gpl-3.0.html. 35 ** 36 ** $QT_END_LICENSE$ 37 ** 38 ****************************************************************************/ 39 40 #ifndef QSHAREDMEMORY_P_H 41 #define QSHAREDMEMORY_P_H 42 43 // 44 // W A R N I N G 45 // ------------- 46 // 47 // This file is not part of the Qt API. It exists purely as an 48 // implementation detail. This header file may change from version to 49 // version without notice, or even be removed. 50 // 51 // We mean it. 52 // 53 54 #include "qsharedmemory.h" 55 56 #include <QtCore/qstring.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 71 #ifndef QT_NO_QOBJECT 72 # include "private/qobject_p.h" 73 #endif 74 75 #if !defined(Q_OS_WIN) && !defined(Q_OS_ANDROID) && !defined(Q_OS_INTEGRITY) && !defined(Q_OS_RTEMS) 76 # include <sys/sem.h> 77 #endif 78 79 QT_BEGIN_NAMESPACE 80 81 #ifndef QT_NO_SYSTEMSEMAPHORE 82 /*! 83 Helper class 84 */ 85 class QSharedMemoryLocker 86 { 87 88 public: QSharedMemoryLocker(QSharedMemory * sharedMemory)89 inline QSharedMemoryLocker(QSharedMemory *sharedMemory) : q_sm(sharedMemory) 90 { 91 Q_ASSERT(q_sm); 92 } 93 ~QSharedMemoryLocker()94 inline ~QSharedMemoryLocker() 95 { 96 if (q_sm) 97 q_sm->unlock(); 98 } 99 lock()100 inline bool lock() 101 { 102 if (q_sm && q_sm->lock()) 103 return true; 104 q_sm = nullptr; 105 return false; 106 } 107 108 private: 109 QSharedMemory *q_sm; 110 }; 111 #endif // QT_NO_SYSTEMSEMAPHORE 112 113 class Q_AUTOTEST_EXPORT QSharedMemoryPrivate 114 #ifndef QT_NO_QOBJECT 115 : public QObjectPrivate 116 #endif 117 { 118 #ifndef QT_NO_QOBJECT 119 Q_DECLARE_PUBLIC(QSharedMemory) 120 #endif 121 122 public: 123 QSharedMemoryPrivate(); 124 125 void *memory; 126 int size; 127 QString key; 128 QString nativeKey; 129 QSharedMemory::SharedMemoryError error; 130 QString errorString; 131 #ifndef QT_NO_SYSTEMSEMAPHORE 132 QSystemSemaphore systemSemaphore; 133 bool lockedByMe; 134 #endif 135 136 static int createUnixKeyFile(const QString &fileName); 137 static QString makePlatformSafeKey(const QString &key, 138 const QString &prefix = QLatin1String("qipc_sharedmemory_")); 139 #ifdef Q_OS_WIN 140 Qt::HANDLE handle(); 141 #elif defined(QT_POSIX_IPC) 142 int handle(); 143 #else 144 key_t handle(); 145 #endif 146 bool initKey(); 147 bool cleanHandle(); 148 bool create(int size); 149 bool attach(QSharedMemory::AccessMode mode); 150 bool detach(); 151 152 void setErrorString(QLatin1String function); 153 154 #ifndef QT_NO_SYSTEMSEMAPHORE tryLocker(QSharedMemoryLocker * locker,const QString & function)155 bool tryLocker(QSharedMemoryLocker *locker, const QString &function) { 156 if (!locker->lock()) { 157 errorString = QSharedMemory::tr("%1: unable to lock").arg(function); 158 error = QSharedMemory::LockError; 159 return false; 160 } 161 return true; 162 } 163 #endif // QT_NO_SYSTEMSEMAPHORE 164 165 private: 166 #ifdef Q_OS_WIN 167 Qt::HANDLE hand; 168 #elif defined(QT_POSIX_IPC) 169 int hand; 170 #else 171 key_t unix_key; 172 #endif 173 }; 174 175 QT_END_NAMESPACE 176 177 #endif // QT_NO_SHAREDMEMORY 178 179 #endif // QSHAREDMEMORY_P_H 180 181