예제 #1
0
void petabricks::DynamicTask::decrementPredecessors(bool isAborting){
  bool shouldEnqueue = false;
  {
    JLOCKSCOPE(_lock);
    --_numPredecessors;
    if(_numPredecessors==0 && _state==S_PENDING){
      _state = S_READY;
      shouldEnqueue = true;
    }
    if(_numPredecessors==0 && _state==S_REMOTE_PENDING){
      _state = S_REMOTE_READY;
      shouldEnqueue = true;
    }
  }
  if (shouldEnqueue) {
    if (isAborting) {
      runWrapper(true);
    } else if (_state==S_READY) {
      inlineOrEnqueueTask();
    } else if (_state==S_REMOTE_READY) {
      remoteScheduleTask();
    } else {
      JASSERT(false);
    }
  }
}
예제 #2
0
파일: test.cpp 프로젝트: embedthis/appweb-2
int MprTestSession::runTests(MprTestResult *result)
{
	int				i;
#if BLD_FEATURE_MULTITHREAD
	MprThread		*tp;
#endif

	for (i = 0; i < numThreads; i++) {
		if (sessions[i]->init() < 0) {
			return MPR_ERR_CANT_INITIALIZE;
		}
	}

#if BLD_FEATURE_MULTITHREAD
	//
	//	Now clone this session object for all other threads
	//
	for (i = 1; i < numThreads; i++) {
		char tName[64];
		mprSprintf(tName, sizeof(tName), "test.%d", i);
		tp = new MprThread(runWrapper, MPR_NORMAL_PRIORITY, sessions[i], tName);
		if (tp->start() < 0) {
			break;
		}
	}
#endif
	runWrapper(sessions[0], 0);

#if BLD_FEATURE_MULTITHREAD
	//
	//	Wait for all the threads to complete (simple but effective)
	//
	while (result->getThreadCount() > 1) {
		mprSleep(75);
	}
#endif
	sessions[0]->terminateClasses(result);

#if BLD_FEATURE_MULTITHREAD
	for (i = 1; i < numThreads; i++) {
		sessions[i]->term();
		delete sessions[i];
	}
#endif

	mprFree(sessions);

#if BLD_FEATURE_LOG
	mpr->logService->removeListener(logger);
	delete logger;
#endif
	return 0;
}
예제 #3
0
void DynamicTask::inlineOrEnqueueTask()
{
#ifdef INLINE_NULL_TASKS
  if(isNullTask())
    runWrapper(); //dont bother enqueuing just run it
  else
#endif
  {
    WorkerThread* self = WorkerThread::self();
#ifdef DEBUG
    JASSERT(self!=NULL);
#endif
    self->pushLocal(this);
  }
}
예제 #4
0
void DynamicTask::inlineOrEnqueueTask()
{
#ifdef INLINE_NULL_TASKS
  if(isNullTask())
    runWrapper(); //dont bother enqueuing just run it
  else
#endif
  {
    WorkerThread* self = WorkerThread::self();
    if(self!=NULL) {
      self->pushLocal(this);
    }else{
      DynamicScheduler::cpuScheduler().injectWork(this);
    }
  }
}