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; } } } }
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; }
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; }
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; }
int Edge305Device::finishReadFitnessData() { return getThreadState(); }
int Edge305Device::finishReadFromGps() { return getThreadState(); }
int Edge305Device::finishReadFitnessDirectory() { return getThreadState(); }