static int mark_for_duplicate(Word p, int flags ARG_LD) { term_agenda agenda; initTermAgenda(&agenda, 1, p); while((p=nextTermAgenda(&agenda))) { again: switch(tag(*p)) { case TAG_ATTVAR: { if ( flags & COPY_ATTRS ) { p = valPAttVar(*p); goto again; } /*FALLTHROUGH*/ } case TAG_VAR: { if ( virgin(*p) ) set_visited(*p); else if ( visited_once(*p) ) set_shared(*p); break; } case TAG_COMPOUND: { Functor t = valueTerm(*p); int arity = arityFunctor(t->definition); if ( virgin(t->definition) ) { set_visited(t->definition); } else { if ( visited_once(t->definition) ) set_shared(t->definition); break; } if ( !pushWorkAgenda(&agenda, arity, t->arguments) ) return MEMORY_OVERFLOW; continue; } } } clearTermAgenda(&agenda); return TRUE; }
/** * \brief Compute the position of the camera. * \param elapsed_time Elapsed time since the last call. */ void ptb::shared_camera::auto_position ( bear::universe::time_type elapsed_time ) { switch(m_placement) { case lock_first_player: set_first_player(elapsed_time); break; case lock_second_player: set_second_player(elapsed_time); break; case shared: set_shared(elapsed_time); break; case do_nothing: break; } } // shared_camera::auto_position()
void init_labyrinth(LABYRINTH labyrinth) { assert ( LABYRINTH_SIZE % 2 == 0 && LABYRINTH_SIZE * LABYRINTH_SIZE - 1 <= GROUP_MASK ); // Chaque cellule se voit attribuer son propre groupe au début de la // génération du labyrinthe. for (int i = 0; i < LABYRINTH_SIZE * LABYRINTH_SIZE; i++) labyrinth[i] = WALLS_MASK | (CELL) i; // Spécifie que les cases limitrophes aux bordures des générateurs sont // partagées entre plusieurs processus. int max_index = LABYRINTH_SIZE - 1; int middle = max_index / 2; for (int i = 0; i < LABYRINTH_SIZE; i++) { for (int j = middle; j < middle + 2; j++) { set_shared(cell_index(labyrinth, i, j)); // Horizontale set_shared(cell_index(labyrinth, j, i)); // Verticale } } }
static int mark_for_copy(Word p, int flags ARG_LD) { Word start = p; int walk_ref = FALSE; Word buf[1024]; segstack stack; initSegStack(&stack, sizeof(Word), sizeof(buf), buf); for(;;) { switch(tag(*p)) { case TAG_ATTVAR: { if ( flags & COPY_ATTRS ) { if ( !pushForMark(&stack, p, walk_ref) ) { clearSegStack(&stack); return MEMORY_OVERFLOW; } walk_ref = TRUE; p = valPAttVar(*p); continue; } /*FALLTHROUGH*/ } case TAG_VAR: { if ( virgin(*p) ) set_visited(*p); else if ( visited_once(*p) ) set_shared(*p); break; } case TAG_REFERENCE: { if ( !pushForMark(&stack, p, walk_ref) ) { clearSegStack(&stack); return MEMORY_OVERFLOW; } walk_ref = TRUE; deRef(p); continue; } case TAG_COMPOUND: { Functor t = valueTerm(*p); int arity = arityFunctor(t->definition); if ( virgin(t->definition) ) { set_visited(t->definition); } else { if ( visited_once(t->definition) ) set_shared(t->definition); break; } if ( arity >= 1 ) { if ( !pushForMark(&stack, p, walk_ref) ) { clearSegStack(&stack); return MEMORY_OVERFLOW; } walk_ref = FALSE; p = &t->arguments[arity-1]; /* last argument */ continue; } } } if ( p == start ) { clearSegStack(&stack); return TRUE; } while ( walk_ref ) { popForMark(&stack, &p, &walk_ref); if ( isAttVar(*p) ) { Word ap = valPAttVar(*p); unshare_attvar(ap PASS_LD); } if ( p == start ) { clearSegStack(&stack); return TRUE; } } p--; if ( tagex(*p) == (TAG_ATOM|STG_GLOBAL) ) { popForMark(&stack, &p, &walk_ref); update_ground(p PASS_LD); } } }