int bdd_noderesize(int doRehash) { BddNode *newnodes; int oldsize = bddnodesize; int n; if (bddnodesize >= bddmaxnodesize && bddmaxnodesize > 0) return -1; bddnodesize = bddnodesize << 1; if (bddnodesize > oldsize + bddmaxnodeincrease) bddnodesize = oldsize + bddmaxnodeincrease; if (bddnodesize > bddmaxnodesize && bddmaxnodesize > 0) bddnodesize = bddmaxnodesize; bddnodesize = bdd_prime_lte(bddnodesize); if (resize_handler != NULL) resize_handler(oldsize, bddnodesize); newnodes = (BddNode*)realloc(bddnodes, sizeof(BddNode)*bddnodesize); if (newnodes == NULL) return bdd_error(BDD_MEMORY); bddnodes = newnodes; if (doRehash) for (n=0 ; n<oldsize ; n++) bddnodes[n].hash = 0; for (n=oldsize ; n<bddnodesize ; n++) { bddnodes[n].refcou = 0; bddnodes[n].hash = 0; LEVEL(n) = 0; LOW(n) = -1; bddnodes[n].next = n+1; } bddnodes[bddnodesize-1].next = bddfreepos; bddfreepos = oldsize; bddfreenum += bddnodesize - oldsize; if (doRehash) bdd_gbc_rehash(); bddresized = 1; return 0; }
static int bdd_noderesize2(int doRehash, int oldsize, int newsize) { int n; newsize = bdd_prime_lte(newsize); if (oldsize > newsize) { return 0; } bddnodesize = newsize; if (resize_handler != NULL) resize_handler(oldsize, bddnodesize); if (bddnodesize > MAX_ALLOC_NODES) { alloced = (BddNode*)realloc(alloced, sizeof(BddNode)*bddnodesize); if (alloced == NULL) return bdd_error(BDD_MEMORY); bddnodes = alloced; MAX_ALLOC_NODES = bddnodesize; } else { bddnodes = alloced; } if (doRehash) for (n=0 ; n<oldsize ; n++) SETHASH(n, 0); for (n=oldsize ; n<bddnodesize ; n++) { INIT_NODE(n); } SETNEXT(bddnodesize-1, bddfreepos); bddfreepos = oldsize; bddfreenum += bddnodesize - oldsize; if (doRehash) bdd_gbc_rehash(); bddresized = 1; return 0; }