static int see_rec(alists_t * alists, const board_t * board, int colour, int to, int piece_value) { int from, piece; int value; ASSERT(alists!=NULL); ASSERT(board!=NULL); ASSERT(COLOUR_IS_OK(colour)); ASSERT(SQUARE_IS_OK(to)); ASSERT(piece_value>0); // find the least valuable attacker from = alist_pop(alists->alist[colour],board); if (from == SquareNone) return 0; // no more attackers // find hidden attackers alists_hidden(alists,board,from,to); // calculate the capture value value = +piece_value; // captured piece if (value == ValueKing) return value; // do not allow an answer to a king capture piece = board->square[from]; ASSERT(piece_is_ok(piece)); ASSERT(COLOUR_IS(piece,colour)); piece_value = VALUE_PIECE(piece); // promote if (piece_value == ValuePawn && SQUARE_IS_PROMOTE(to)) { // HACK: PIECE_IS_PAWN(piece) ASSERT(PIECE_IS_PAWN(piece)); piece_value = ValueQueen; value += ValueQueen - ValuePawn; } value -= see_rec(alists,board,COLOUR_OPP(colour),to,piece_value); if (value < 0) value = 0; return value; }
static int taskmgr_thread(void *arg) { TaskManager *mgr = arg; attr_unused SDL_threadID tid = SDL_ThreadID(); if(SDL_SetThreadPriority(mgr->thread_prio) < 0) { log_sdl_error(LOG_WARN, "SDL_SetThreadPriority"); } bool running; bool aborted; do { SDL_LockMutex(mgr->mutex); running = mgr->running; aborted = mgr->aborted; if(!running && !aborted) { SDL_CondWait(mgr->cond, mgr->mutex); } SDL_UnlockMutex(mgr->mutex); } while(!running && !aborted); while(running && !aborted) { SDL_LockMutex(mgr->mutex); Task *task = alist_pop(&mgr->queue); running = mgr->running; aborted = mgr->aborted; if(running && task == NULL && !aborted) { SDL_CondWait(mgr->cond, mgr->mutex); } SDL_UnlockMutex(mgr->mutex); if(task != NULL) { SDL_LockMutex(task->mutex); bool task_disowned = task->disowned; if(aborted && task->status == TASK_PENDING) { task->status = TASK_CANCELLED; } if(task->status == TASK_PENDING) { task->status = TASK_RUNNING; SDL_UnlockMutex(task->mutex); task->result = task->callback(task->userdata); SDL_LockMutex(task->mutex); assert(task->in_queue); task->in_queue = false; (void)SDL_AtomicDecRef(&mgr->numtasks); if((task_disowned = task->disowned)) { SDL_UnlockMutex(task->mutex); task_free(task); } else { task->status = TASK_FINISHED; SDL_CondBroadcast(task->cond); SDL_UnlockMutex(task->mutex); } } else if(task->status == TASK_CANCELLED) { assert(task->in_queue); task->in_queue = false; (void)SDL_AtomicDecRef(&mgr->numtasks); SDL_UnlockMutex(task->mutex); if(task_disowned) { task_free(task); } } else { UNREACHABLE; } } } return 0; }