void SupervisorThread::threadEntryPoint() { #ifdef GETSPECIFICTHREADLOCAL if(pthread_setspecific(threadSupervisor->m_ThreadSpecificKey,m_ThreadLocal)) abort(); #endif m_Interrupt=&THREADLOCAL(interrupts_interruptedFlag,struct atomic_field); m_Exception=&THREADLOCAL(interrupts_exceptionFlag,struct atomic_field); reverse_run(thread_prepare_list);// re-initialize any thread local variables while(m_KeepRunning) { if(currentAllowedThreads<=m_LocalThreadId) { sleep(1); continue; } AO_store(&m_Interrupt->field,false); struct ThreadTask* task = threadSupervisor->getTask(); task->run(this); } }
static void reverse_run(struct FUNCTION_CELL *p) { if (p) { reverse_run(p->next); (*p->fun)(); } }
FriBidiStrIndex fribidi_reorder_runs ( /* input */ const FriBidiCharType *bidi_types, const FriBidiStrIndex len, const FriBidiParType base_dir, /* input and output */ FriBidiLevel *embedding_levels, /* output */ FriBidiRun *runs ) { FriBidiStrIndex i; FriBidiLevel level; FriBidiLevel last_level = -1; FriBidiLevel max_level = 0; FriBidiStrIndex run_count = 0; FriBidiStrIndex run_start = 0; FriBidiStrIndex run_index = 0; if (len == 0) { goto out; } assert (bidi_types); assert (embedding_levels); /* L1. Reset the embedding levels of some chars: 4. any sequence of white space characters at the end of the line. */ for (i = len - 1; i >= 0 && FRIBIDI_IS_EXPLICIT_OR_BN_OR_WS (bidi_types[i]); i--) embedding_levels[i] = FRIBIDI_DIR_TO_LEVEL (base_dir); /* Find max_level of the line. We don't reuse the paragraph * max_level, both for a cleaner API, and that the line max_level * may be far less than paragraph max_level. */ for (i = len - 1; i >= 0; i--) if (embedding_levels[i] > max_level) max_level = embedding_levels[i]; for (i = 0; i < len; i++) { if (embedding_levels[i] != last_level) run_count++; last_level = embedding_levels[i]; } if (runs == NULL) goto out; while (run_start < len) { int runLength = 0; while ((run_start + runLength) < len && embedding_levels[run_start] == embedding_levels[run_start + runLength]) runLength++; runs[run_index].pos = run_start; runs[run_index].level = embedding_levels[run_start]; runs[run_index].len = runLength; run_start += runLength; run_index++; } /* L2. Reorder. */ for (level = max_level; level > 0; level--) { for (i = run_count - 1; i >= 0; i--) { if (runs[i].level >= level) { int end = i; for (i--; (i >= 0 && runs[i].level >= level); i--) ; reverse_run (runs + i + 1, end - i); } } } out: return run_count; }