Пример #1
0
void sumCMatrixElements(matrix_data_t *m)
{
    int i, j;

    for ( i = 0; i < m->C.rows; i++ ) {
        int ret;
        int thID = getFreeThread();

        thread_data_t *threadData = malloc(sizeof(thread_data_t));
        threadData->i = i;
        threadData->threadID = thID;
        threadData->m = m;
        if(activeThreads[thID] == 2) //juz raz uzylismy...
        {
            /* VERBOSE fprintf(stderr, "Reusing thread... securing with pthread_join just in case\n"); */
            int *val;
            ret = pthread_join(threads[thID], (void **)&val);
            fprintf(stderr, "Thread %d exit status %d\n", thID, val);
            if( ret != 0) {
                fprintf(stderr, "%s:%d pthread_join fail %d\n", __FILE__, __LINE__, ret);
                exit(EXIT_FAILURE);
            }
            else {
                /* VERBOSE fprintf(stderr, "%s:%d pthread_join OK\n", __FILE__, __LINE__); */
                activeThreads[thID] = 1;
            }
        }

        setThreadState(thID, 0);// Busy

        //raise(SIGINT);

        /* VERBOSE fprintf(stderr, "Thread %d\n", thID);  */
        ret = pthread_create( &threads[thID], NULL, sumThread, (void*) threadData); 
        if( ret != 0) {
            fprintf(stderr, "%s:%d pthread_create fail %d\n", __FILE__, __LINE__, ret);
            exit(EXIT_FAILURE);
        }
    }
    for (i = 0; i < MAX_THREADS;i++)
    {
        if(getThreadState(i) == 2 || getThreadState(i) == 0)
        {
            int *val;
            int ret = pthread_join(threads[i], (void **)&val);
            fprintf(stderr, "Thread %d exit status %d\n", i, val);
            if( ret != 0) {
                fprintf(stderr, "%s:%d pthread_join fail %d\n", __FILE__, __LINE__, ret);
                exit(EXIT_FAILURE);
            }
            else {
                /* VERBOSE fprintf(stderr, "%s:%d pthread_join OK\n", __FILE__, __LINE__); */
                activeThreads[i] = 1;
            }
        }
    }
}
Пример #2
0
bool
GenericSchedulerThread::abortThreadedTask(bool keepOldestRender)
{
    if ( !isRunning() ) {
        return false;
    }

    ThreadStateEnum state = getThreadState();
    bool shouldRequestAbort = state != eThreadStateAborted && state != eThreadStateIdle;
    if ( keepOldestRender && !shouldRequestAbort ) {
        return false;
    }

    {
        QMutexLocker l(&_imp->abortRequestedMutex);


        // We are already aborting
        if (_imp->abortRequested > 0 && keepOldestRender) {
            return false;
        }

#ifdef TRACE_GENERIC_SCHEDULER_THREAD
        qDebug() << QThread::currentThread() << ": Aborting task on" <<  getThreadName().c_str();
#endif
        if (shouldRequestAbort) {
            ++_imp->abortRequested;
        }
    }

    onAbortRequested(keepOldestRender);

    return true;
}
Пример #3
0
bool
GenericSchedulerThread::quitThread(bool allowRestarts)
{
    if ( !isRunning() ) {
        return false;
    }

    // Disallow temporarily any thread to request a new render so that we do not end up starting the thread again
    // just after the abort
    {
        QMutexLocker k(&_imp->mustQuitMutex);
        // We already called quitThread
        if (_imp->mustQuit || !_imp->lastQuitThreadAllowedRestart) {
            return true;
        }
        _imp->mustQuit = true;
        _imp->startingThreadAllowed = false;
        _imp->lastQuitThreadAllowedRestart = allowRestarts;
    }

    if (getThreadState() == eThreadStateActive) {
        abortThreadedTask();
    }


    // Clear any task enqueued and push a fake request
    {
        QMutexLocker k(&_imp->enqueuedTasksMutex);
        _imp->enqueuedTasks.clear();
        boost::shared_ptr<GenericThreadStartArgs> stubArgs( new GenericThreadStartArgs(true) );
        _imp->enqueuedTasks.push_back(stubArgs);
    }


    // Wake-up the thread with a fake request
    {
        QMutexLocker l3(&_imp->startRequestsMutex);
        ++_imp->startRequests;
        _imp->startRequestsCond.wakeOne();
    }
#ifdef TRACE_GENERIC_SCHEDULER_THREAD
    qDebug() << QThread::currentThread() << ": Termination request on " << getThreadName().c_str();
#endif

    onQuitRequested(allowRestarts);
    return true;
}
Пример #4
0
void
GenericSchedulerThread::requestExecutionOnMainThread(const ExecOnMTArgsPtr& inArgs)
{
    // We must be within the run() function
    assert(QThread::currentThread() == this);
    assert(getThreadState() == eThreadStateActive);

    QMutexLocker processLocker (&_imp->executingOnMainThreadMutex);
    assert(!_imp->executingOnMainThread);
    _imp->executingOnMainThread = true;

    Q_EMIT executionOnMainThreadRequested(inArgs);

    while (_imp->executingOnMainThread) {
        _imp->executingOnMainThreadCond.wait(&_imp->executingOnMainThreadMutex);
    }
}
BufferedTextOutput::BufferState* BufferedTextOutput::getBuffer() const
{
    if ((mFlags&MULTITHREADED) != 0) {
        ThreadState* ts = getThreadState();
        if (ts) {
            while (ts->states.size() <= (size_t)mIndex) ts->states.add(NULL);
            BufferState* bs = ts->states[mIndex].get();
            if (bs != NULL && bs->seq == mSeq) return bs;
            
            ts->states.editItemAt(mIndex) = new BufferState(mIndex);
            bs = ts->states[mIndex].get();
            if (bs != NULL) return bs;
        }
    }
    
    return mGlobalState;
}
Пример #6
0
int Edge305Device::finishReadFitnessData()
{
    return getThreadState();
}
Пример #7
0
int Edge305Device::finishReadFromGps() {
    return getThreadState();
}
Пример #8
0
int Edge305Device::finishReadFitnessDirectory() {
    return getThreadState();
}