[SOLVED] Help me with qtlockedfile_win.cpp



  • Hi,
    I'm trying to build the opensource PokerTH game under win 8 with QT 5.2.1 mingw
    and stucked on qtlockedfile_qin.cpp

    @
    /******
    ** This file is part of a Qt Solutions component.
    **
    ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
    ********/

    #include "qtlockedfile.h"
    #include <qt_windows.h>
    #include <QtCore/QFileInfo>

    #define MUTEX_PREFIX "QtLockedFile mutex "
    // Maximum number of concurrent read locks. Must not be greater than MAXIMUM_WAIT_OBJECTS
    #define MAX_READERS MAXIMUM_WAIT_OBJECTS

    Qt::HANDLE QtLockedFile::getMutexHandle(int idx, bool doCreate)
    {
    if (mutexname.isEmpty()) {
    QFileInfo fi(*this);
    mutexname = QString::fromLatin1(MUTEX_PREFIX)
    + fi.absoluteFilePath().toLower();
    }
    QString mname(mutexname);
    if (idx >= 0)
    mname += QString::number(idx);

    Qt::HANDLE mutex;
    if (doCreate) {
        QT_WA( { mutex = CreateMutexW(NULL, FALSE, (TCHAR*)mname.utf16())},
               { mutex = CreateMutexA(NULL, FALSE, mname.toLocal8Bit().constData()); } );
        if (!mutex) {
            qErrnoWarning("QtLockedFile::lock(): CreateMutex failed");
            return 0;
        }
    }
        else {
        QT_WA( { mutex = OpenMutexW(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, (TCHAR*)mname.utf16()) },
               { mutex = OpenMutexA(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, mname.toLocal8Bit().constData()); } );
        if (!mutex) {
            if (GetLastError() != ERROR_FILE_NOT_FOUND)
                qErrnoWarning("QtLockedFile::lock(): OpenMutex failed");
            return 0;
        }
    }
    return mutex;
    

    }

    bool QtLockedFile::waitMutex(Qt::HANDLE mutex, bool doBlock)
    {
    Q_ASSERT(mutex);
    DWORD res = WaitForSingleObject(mutex, doBlock ? INFINITE : 0);
    switch (res) {
    case WAIT_OBJECT_0:
    case WAIT_ABANDONED:
    return true;
    break;
    case WAIT_TIMEOUT:
    break;
    default:
    qErrnoWarning("QtLockedFile::lock(): WaitForSingleObject failed");
    }
    return false;
    }

    bool QtLockedFile::lock(LockMode mode, bool block)
    {
    if (!isOpen()) {
    qWarning("QtLockedFile::lock(): file is not opened");
    return false;
    }

    if (mode == NoLock)
        return unlock();
    
    if (mode == m_lock_mode)
        return true;
    
    if (m_lock_mode != NoLock)
        unlock();
    
    if (!wmutex && !(wmutex = getMutexHandle(-1, true)))
        return false;
    
    if (!waitMutex(wmutex, block))
        return false;
    
    if (mode == ReadLock) {
        int idx = 0;
        for (; idx < MAX_READERS; idx++) {
            rmutex = getMutexHandle(idx, false);
            if (!rmutex || waitMutex(rmutex, false))
                break;
            CloseHandle(rmutex);
        }
        bool ok = true;
        if (idx >= MAX_READERS) {
            qWarning("QtLockedFile::lock(): too many readers");
            rmutex = 0;
            ok = false;
        }
        else if (!rmutex) {
            rmutex = getMutexHandle(idx, true);
            if (!rmutex || !waitMutex(rmutex, false))
                ok = false;
        }
        if (!ok && rmutex) {
            CloseHandle(rmutex);
            rmutex = 0;
        }
        ReleaseMutex(wmutex);
        if (!ok)
            return false;
    }
    else {
        Q_ASSERT(rmutexes.isEmpty());
        for (int i = 0; i < MAX_READERS; i++) {
            Qt::HANDLE mutex = getMutexHandle(i, false);
            if (mutex)
                rmutexes.append(mutex);
        }
        if (rmutexes.size()) {
            DWORD res = WaitForMultipleObjects(rmutexes.size(), rmutexes.constData(),
                                               TRUE, block ? INFINITE : 0);
            if (res != WAIT_OBJECT_0 && res != WAIT_ABANDONED) {
                if (res != WAIT_TIMEOUT)
                    qErrnoWarning("QtLockedFile::lock(): WaitForMultipleObjects failed");
                m_lock_mode = WriteLock;  // trick unlock() to clean up - semiyucky
                unlock();
                return false;
            }
        }
    }
    
    m_lock_mode = mode;
    return true;
    

    }

    bool QtLockedFile::unlock()
    {
    if (!isOpen()) {
    qWarning("QtLockedFile::unlock(): file is not opened");
    return false;
    }

    if (!isLocked())
        return true;
    
    if (m_lock_mode == ReadLock) {
        ReleaseMutex(rmutex);
        CloseHandle(rmutex);
        rmutex = 0;
    }
    else {
        foreach(Qt::HANDLE mutex, rmutexes) {
            ReleaseMutex(mutex);
            CloseHandle(mutex);
        }
        rmutexes.clear();
        ReleaseMutex(wmutex);
    }
    
    m_lock_mode = QtLockedFile::NoLock;
    return true;
    

    }

    QtLockedFile::~QtLockedFile()
    {
    if (isOpen())
    unlock();
    if (wmutex)
    CloseHandle(wmutex);
    }
    @

    screenshot with errors*

    !http://ofc.kz/image/data/qtErrors.jpg(qtlockedfile_win.cpp errors)!

    there is kind a syntax related errors, i tried to use other versions of qtlockedfile that i found around the web
    but they were far more errors

    i started building under linux, as instructions told but stucked at the very beginning of building process,
    and got a lot of unfigurable errors ,
    then i try qt-5.2.1 windows mingw edition and go much further than with linux qt.

    Can somebody at least point me where to dig in,



  • after a while i solve that by adding some semicolons and inserting this -

    #if QT_VERSION >= 0x050000
    #define QT_WA(unicode, ansi) unicode
    #endif


  • Lifetime Qt Champion

    Hi and welcome to devnet,

    You should consider going on the "bug report system":http://bugreports.qt-project.org to signal this, other users might get hit by it


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.