e5fcad3 by Lars Knoll at 2009-03-23 1
/****************************************************************************
2
**
89c08c0 by Jason McDonald at 2012-01-11 3
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
04e3b30 by Jason McDonald at 2009-09-09 4
** All rights reserved.
858c70f by Jason McDonald at 2009-06-16 5
** Contact: Nokia Corporation (qt-info@nokia.com)
e5fcad3 by Lars Knoll at 2009-03-23 6
**
7
** This file is part of the QtCore module of the Qt Toolkit.
8
**
9
** $QT_BEGIN_LICENSE:LGPL$
10
** GNU Lesser General Public License Usage
1eea52e by Jyri Tahtela at 2011-05-13 11
** This file may be used under the terms of the GNU Lesser General Public
12
** License version 2.1 as published by the Free Software Foundation and
13
** appearing in the file LICENSE.LGPL included in the packaging of this
14
** file. Please review the following information to ensure the GNU Lesser
15
** General Public License version 2.1 requirements will be met:
16
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
e5fcad3 by Lars Knoll at 2009-03-23 17
**
04e3b30 by Jason McDonald at 2009-09-09 18
** In addition, as a special exception, Nokia gives you certain additional
1eea52e by Jyri Tahtela at 2011-05-13 19
** rights. These rights are described in the Nokia Qt LGPL Exception
04e3b30 by Jason McDonald at 2009-09-09 20
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
e5fcad3 by Lars Knoll at 2009-03-23 21
**
1eea52e by Jyri Tahtela at 2011-05-13 22
** GNU General Public License Usage
23
** Alternatively, this file may be used under the terms of the GNU General
24
** Public License version 3.0 as published by the Free Software Foundation
25
** and appearing in the file LICENSE.GPL included in the packaging of this
26
** file. Please review the following information to ensure the GNU General
27
** Public License version 3.0 requirements will be met:
28
** http://www.gnu.org/copyleft/gpl.html.
309db73 by Jason McDonald at 2009-08-31 29
**
1eea52e by Jyri Tahtela at 2011-05-13 30
** Other Usage
31
** Alternatively, this file may be used in accordance with the terms and
32
** conditions contained in a signed written agreement between you and Nokia.
309db73 by Jason McDonald at 2009-08-31 33
**
34
**
35
**
36
**
e5fcad3 by Lars Knoll at 2009-03-23 37
**
38
** $QT_END_LICENSE$
39
**
40
****************************************************************************/
41
42
#include "qsystemsemaphore.h"
43
#include "qsystemsemaphore_p.h"
44
#include "qcoreapplication.h"
45
#include <qdebug.h>
46
47
#ifndef QT_NO_SYSTEMSEMAPHORE
48
7b60b66 by Ritt Konstantin at 2011-06-06 49
//#define QSYSTEMSEMAPHORE_DEBUG
50
51
QT_BEGIN_NAMESPACE
52
e5fcad3 by Lars Knoll at 2009-03-23 53
QSystemSemaphorePrivate::QSystemSemaphorePrivate() :
7b60b66 by Ritt Konstantin at 2011-06-06 54
    semaphore(0), error(QSystemSemaphore::NoError)
e5fcad3 by Lars Knoll at 2009-03-23 55
{
56
}
57
58
void QSystemSemaphorePrivate::setErrorString(const QString &function)
59
{
7b60b66 by Ritt Konstantin at 2011-06-06 60
    DWORD windowsError = GetLastError();
e5fcad3 by Lars Knoll at 2009-03-23 61
    if (windowsError == 0)
62
        return;
63
64
    switch (windowsError) {
65
    case ERROR_NO_SYSTEM_RESOURCES:
66
    case ERROR_NOT_ENOUGH_MEMORY:
67
        error = QSystemSemaphore::OutOfResources;
68
        errorString = QCoreApplication::translate("QSystemSemaphore", "%1: out of resources").arg(function);
69
        break;
70
    case ERROR_ACCESS_DENIED:
71
        error = QSystemSemaphore::PermissionDenied;
72
        errorString = QCoreApplication::translate("QSystemSemaphore", "%1: permission denied").arg(function);
73
        break;
74
    default:
75
        errorString = QCoreApplication::translate("QSystemSemaphore", "%1: unknown error %2").arg(function).arg(windowsError);
76
        error = QSystemSemaphore::UnknownError;
7b60b66 by Ritt Konstantin at 2011-06-06 77
#ifdef QSYSTEMSEMAPHORE_DEBUG
e5fcad3 by Lars Knoll at 2009-03-23 78
        qDebug() << errorString << "key" << key;
79
#endif
7b60b66 by Ritt Konstantin at 2011-06-06 80
        break;
e5fcad3 by Lars Knoll at 2009-03-23 81
    }
82
}
83
84
HANDLE QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode)
85
{
86
    // don't allow making handles on empty keys
87
    if (key.isEmpty())
88
        return 0;
89
90
    // Create it if it doesn't already exists.
91
    if (semaphore == 0) {
75771dd by Ritt Konstantin at 2011-01-21 92
        semaphore = CreateSemaphore(0, initialValue, MAXLONG, (wchar_t*)fileName.utf16());
e5fcad3 by Lars Knoll at 2009-03-23 93
        if (semaphore == NULL)
94
            setErrorString(QLatin1String("QSystemSemaphore::handle"));
95
    }
96
97
    return semaphore;
98
}
99
100
void QSystemSemaphorePrivate::cleanHandle()
101
{
102
    if (semaphore && !CloseHandle(semaphore)) {
103
#if defined QSYSTEMSEMAPHORE_DEBUG
104
        qDebug() << QLatin1String("QSystemSemaphorePrivate::CloseHandle: sem failed");
105
#endif
106
    }
107
    semaphore = 0;
108
}
109
110
bool QSystemSemaphorePrivate::modifySemaphore(int count)
111
{
112
    if (0 == handle())
113
        return false;
114
115
    if (count > 0) {
7b60b66 by Ritt Konstantin at 2011-06-06 116
        if (0 == ReleaseSemaphore(semaphore, count, 0)) {
e5fcad3 by Lars Knoll at 2009-03-23 117
            setErrorString(QLatin1String("QSystemSemaphore::modifySemaphore"));
118
#if defined QSYSTEMSEMAPHORE_DEBUG
119
            qDebug() << QLatin1String("QSystemSemaphore::modifySemaphore ReleaseSemaphore failed");
120
#endif
121
            return false;
122
        }
123
    } else {
124
        if (WAIT_OBJECT_0 != WaitForSingleObject(semaphore, INFINITE)) {
125
            setErrorString(QLatin1String("QSystemSemaphore::modifySemaphore"));
126
#if defined QSYSTEMSEMAPHORE_DEBUG
127
            qDebug() << QLatin1String("QSystemSemaphore::modifySemaphore WaitForSingleObject failed");
128
#endif
129
            return false;
130
        }
131
    }
132
133
    return true;
134
}
135
136
QT_END_NAMESPACE
a5211c5 by suzuki toshiya at 2011-09-06 137
138
#endif // QT_NO_SYSTEMSEMAPHORE