Ticket #231: qfilesystemwatcher_os2.diff

File qfilesystemwatcher_os2.diff, 2.7 KB (added by rudi, 13 years ago)

Possible fix

  • qfilesystemwatcher_os2.cpp

     
    9696QOS2FileSystemWatcherEngine::QOS2FileSystemWatcherEngine()
    9797    : notifyPipe(NULLHANDLE), eventSem(NULLHANDLE), isRunning(false)
    9898{
    99     ULONG dummy;
    100     APIRET arc = DosOpen(PIPE_CHANGENOTIFY, &notifyPipe, &dummy, 0, FILE_OPEN,
    101                          OPEN_ACTION_OPEN_IF_EXISTS,
    102                          OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY, NULL);
    103     if (arc == NO_ERROR) {
    104         // make sure the pipe is non-blocking so that we can get ERROR_NO_DATA
    105         arc = DosSetNPHState(notifyPipe, NP_NOWAIT);
    106         Q_ASSERT(arc == NO_ERROR);
    107         // connect the pipe to the semaphore
    108         arc = DosCreateEventSem(NULL, &eventSem,
     99    APIRET arc;
     100    ULONG dummy, retries = 3;
     101
     102    do {
     103        arc = DosOpen(PIPE_CHANGENOTIFY, &notifyPipe, &dummy,
     104                      0, FILE_OPEN, OPEN_ACTION_OPEN_IF_EXISTS,
     105                      OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY | OPEN_FLAGS_NOINHERIT, NULL);
     106        if (arc == NO_ERROR) {
     107            // make sure the pipe is non-blocking so that we can get ERROR_NO_DATA
     108            arc = DosSetNPHState(notifyPipe, NP_NOWAIT);
     109            Q_ASSERT(arc == NO_ERROR);
     110            // connect the pipe to the semaphore
     111            arc = DosCreateEventSem(NULL, &eventSem,
    109112                                DC_SEM_SHARED | DCE_AUTORESET | DCE_POSTONE,
    110113                                FALSE);
    111         Q_ASSERT(arc == NO_ERROR);
    112         arc = DosSetNPipeSem(notifyPipe, (HSEM)eventSem, 0);
    113         Q_ASSERT(arc == NO_ERROR);
    114     } else {
    115         notifyPipe = NULLHANDLE; // sanity (used by isOk())
    116         if (arc != ERROR_FILE_NOT_FOUND &&
    117             arc != ERROR_PATH_NOT_FOUND)
    118             qWarning("QOS2FileSystemWatcherEngine:: "
    119                      "DosOpen("PIPE_CHANGENOTIFY") returned %lu", arc);
    120     }
     114            Q_ASSERT(arc == NO_ERROR);
     115            arc = DosSetNPipeSem(notifyPipe, (HSEM)eventSem, 0);
     116            Q_ASSERT(arc == NO_ERROR);
     117
     118            retries = 0;
     119        } else {
     120            notifyPipe = NULLHANDLE; // sanity (used by isOk())
     121
     122            if (arc == ERROR_PIPE_BUSY && --retries)
     123                DosSleep(100);
     124            else if (arc != ERROR_FILE_NOT_FOUND &&
     125                     arc != ERROR_PATH_NOT_FOUND)
     126                qWarning("QOS2FileSystemWatcherEngine:: "
     127                         "DosOpen("PIPE_CHANGENOTIFY") returned %lu", arc);
     128        }
     129    } while (arc == ERROR_PIPE_BUSY && retries);
    121130}
    122131
    123132QOS2FileSystemWatcherEngine::~QOS2FileSystemWatcherEngine()