+ memset(ao_lisp_cons, '\0', sizeof (ao_lisp_cons));
+ ao_lisp_cons_noted = 0;
+ for (i = 0; i < AO_LISP_ROOT; i++) {
+ if (!ao_lisp_root[i].addr)
+ continue;
+ if (ao_lisp_root[i].type) {
+ void *addr = *ao_lisp_root[i].addr;
+ if (!addr)
+ continue;
+ DBG_MOVE("root %d\n", DBG_OFFSET(addr));
+ if (!ao_lisp_move(ao_lisp_root[i].type,
+ ao_lisp_root[i].addr)) {
+ DBG_MOVE("root moves from %p to %p\n",
+ addr,
+ *ao_lisp_root[i].addr);
+ }
+ } else {
+ ao_poly p = *(ao_poly *) ao_lisp_root[i].addr;
+ if (!p)
+ continue;
+ if (!ao_lisp_poly_move((ao_poly *) ao_lisp_root[i].addr, 0)) {
+ DBG_MOVE("root poly move from %04x to %04x\n",
+ p, *(ao_poly *) ao_lisp_root[i].addr);
+ }
+ }
+ }
+ while (ao_lisp_cons_noted) {
+ memcpy(ao_lisp_cons_last, ao_lisp_cons, sizeof (ao_lisp_cons));
+ memset(ao_lisp_cons, '\0', sizeof (ao_lisp_cons));
+ ao_lisp_cons_noted = 0;
+ for (i = 0; i < AO_LISP_POOL; i += 4) {
+ if (busy(ao_lisp_cons_last, i)) {
+ void *addr = ao_lisp_pool + i;
+ DBG_MOVE("cons %d\n", DBG_OFFSET(addr));
+ if (!ao_lisp_move(&ao_lisp_cons_type, &addr)) {
+ DBG_MOVE("cons moves from %p to %p\n",
+ ao_lisp_pool + i, addr);
+ }
+ }