Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Update: Forum Guidelines & Code of Conduct


    Qt World Summit: Early-Bird Tickets

    [SOLVED] Help me with qtlockedfile_win.cpp

    Installation and Deployment
    2
    3
    2074
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • A
      Almax last edited by

      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,

      1 Reply Last reply Reply Quote 0
      • A
        Almax last edited by

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

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

        1 Reply Last reply Reply Quote 0
        • SGaist
          SGaist Lifetime Qt Champion last edited by

          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

          Interested in AI ? www.idiap.ch
          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

          1 Reply Last reply Reply Quote 0
          • First post
            Last post