From: bdemsky Date: Tue, 11 Jul 2017 01:18:06 +0000 (-0700) Subject: Fix some of the memory leaks X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=5ac7352acbb5931293d51ba80df9d6c9039aa888;p=satune.git Fix some of the memory leaks --- diff --git a/src/AST/order.c b/src/AST/order.c index b943392..b1b52e3 100644 --- a/src/AST/order.c +++ b/src/AST/order.c @@ -29,7 +29,9 @@ void setOrderEncodingType(Order* order, OrderEncodingType type){ void deleteOrder(Order* order){ deleteVectorArrayBoolean(& order->constraints); deleteOrderEncoding(& order->order); - if(order->boolsToConstraints!= NULL) + if(order->boolsToConstraints!= NULL) { + resetAndDeleteHashTableBoolConst(order->boolsToConstraints); deleteHashTableBoolConst(order->boolsToConstraints); + } ourfree(order); } diff --git a/src/Backend/constraint.c b/src/Backend/constraint.c index ef60709..46c8c5e 100644 --- a/src/Backend/constraint.c +++ b/src/Backend/constraint.c @@ -63,6 +63,7 @@ Constraint * allocVarConstraint(CType t, uint v) { void deleteConstraint(Constraint *This) { if (This->operands!=NULL) ourfree(This->operands); + ourfree(This); } void dumpConstraint(Constraint * This, IncrementalSolver *solver) { @@ -97,7 +98,7 @@ void internalfreeConstraint(Constraint * This) { ASSERT(0); default: This->type=BOGUS; - ourfree(This); + deleteConstraint(This); } } diff --git a/src/Backend/orderpair.c b/src/Backend/orderpair.c index 2290b36..109fc53 100644 --- a/src/Backend/orderpair.c +++ b/src/Backend/orderpair.c @@ -1,12 +1,14 @@ #include "orderpair.h" -OrderPair* allocOrderPair(uint64_t first, uint64_t second){ +OrderPair* allocOrderPair(uint64_t first, uint64_t second, Constraint * constraint){ OrderPair* pair = (OrderPair*) ourmalloc(sizeof(OrderPair)); pair->first = first; pair->second = second; + pair->constraint = constraint; return pair; } + void deleteOrderPair(OrderPair* pair){ ourfree(pair); -} \ No newline at end of file +} diff --git a/src/Backend/orderpair.h b/src/Backend/orderpair.h index 21bddd7..bdffb15 100644 --- a/src/Backend/orderpair.h +++ b/src/Backend/orderpair.h @@ -14,9 +14,10 @@ struct OrderPair{ uint64_t first; uint64_t second; + Constraint *constraint; }; -OrderPair* allocOrderPair(uint64_t first, uint64_t second); +OrderPair* allocOrderPair(uint64_t first, uint64_t second, Constraint * constraint); void deleteOrderPair(OrderPair* pair); #endif /* ORDERPAIR_H */ diff --git a/src/Backend/satencoder.c b/src/Backend/satencoder.c index 3c2d3e1..fa1d513 100644 --- a/src/Backend/satencoder.c +++ b/src/Backend/satencoder.c @@ -72,6 +72,7 @@ void addConstraintToSATSolver(Constraint *c, IncrementalSolver* satSolver) { continue; ASSERT(simp->type!=FALSE); dumpConstraint(simp, satSolver); + freerecConstraint(simp); } deleteVectorConstraint(simplified); } @@ -181,10 +182,10 @@ Constraint * getPairConstraint(SATEncoder *This, HashTableBoolConst * table, Ord Constraint * constraint; if (!containsBoolConst(table, pair)) { constraint = getNewVarSATEncoder(This); - OrderPair * paircopy = allocOrderPair(pair->first, pair->second); - putBoolConst(table, paircopy, constraint); + OrderPair * paircopy = allocOrderPair(pair->first, pair->second, constraint); + putBoolConst(table, paircopy, paircopy); } else - constraint = getBoolConst(table, pair); + constraint = getBoolConst(table, pair)->constraint; if (negate) return negateConstraint(constraint); else @@ -199,9 +200,8 @@ Constraint * encodeTotalOrderSATEncoder(SATEncoder *This, BooleanOrder * boolOrd return createAllTotalOrderConstraintsSATEncoder(This, boolOrder->order); } HashTableBoolConst* boolToConsts = boolOrder->order->boolsToConstraints; - OrderPair pair={boolOrder->first, boolOrder->second}; - Constraint* constraint = getPairConstraint(This, boolToConsts, & pair); - ASSERT(constraint != NULL); + OrderPair pair={boolOrder->first, boolOrder->second, NULL}; + Constraint *constraint = getPairConstraint(This, boolToConsts, & pair); return constraint; } @@ -234,8 +234,7 @@ Constraint* createAllTotalOrderConstraintsSATEncoder(SATEncoder* This, Order* or Constraint* getOrderConstraint(HashTableBoolConst *table, OrderPair *pair){ ASSERT(pair->first!= pair->second); - Constraint* constraint= getBoolConst(table, pair); - ASSERT(constraint!= NULL); + Constraint* constraint= getBoolConst(table, pair)->constraint; if(pair->first > pair->second) return constraint; else diff --git a/src/Collections/hashtable.h b/src/Collections/hashtable.h index b7c78d9..dbf61f9 100644 --- a/src/Collections/hashtable.h +++ b/src/Collections/hashtable.h @@ -62,9 +62,10 @@ bool contains ## Name(const HashTable ## Name * tab, _Key key); \ void resize ## Name(HashTable ## Name * tab, unsigned int newsize); \ double getLoadFactor ## Name(HashTable ## Name * tab); \ - unsigned int getCapacity ## Name(HashTable ## Name * tab); + unsigned int getCapacity ## Name(HashTable ## Name * tab); \ + void resetAndDeleteHashTable ## Name(HashTable ## Name * tab); -#define HashTableImpl(Name, _Key, _Val, hash_function, equals) \ +#define HashTableImpl(Name, _Key, _Val, hash_function, equals, freefunction) \ HashTable ## Name * allocHashTable ## Name(unsigned int initialcapacity, double factor) { \ HashTable ## Name * tab = (HashTable ## Name *)ourmalloc(sizeof(HashTable ## Name)); \ tab->table = (struct hashlistnode ## Name *)ourcalloc(initialcapacity, sizeof(struct hashlistnode ## Name)); \ @@ -77,14 +78,34 @@ tab->size = 0; \ return tab; \ } \ - \ - void deleteHashTable ## Name(HashTable ## Name * tab) { \ + \ + void deleteHashTable ## Name(HashTable ## Name * tab) { \ ourfree(tab->table); \ if (tab->zero) \ ourfree(tab->zero); \ ourfree(tab); \ } \ - \ + \ + void resetAndDeleteHashTable ## Name(HashTable ## Name * tab) { \ + for(uint i=0;icapacity;i++) { \ + struct hashlistnode ## Name * bin=&tab->table[i]; \ + if (bin->key!=NULL) { \ + bin->key=NULL; \ + if (bin->val!=NULL) { \ + freefunction(bin->val); \ + bin->val=NULL; \ + } \ + } \ + } \ + if (tab->zero) { \ + if (tab->zero->val != NULL) \ + freefunction(tab->zero->val); \ + ourfree(tab->zero); \ + tab->zero=NULL; \ + } \ + tab->size=0; \ + } \ + \ void reset ## Name(HashTable ## Name * tab) { \ memset(tab->table, 0, tab->capacity * sizeof(struct hashlistnode ## Name)); \ if (tab->zero) { \ diff --git a/src/Collections/structs.c b/src/Collections/structs.c index f5f8f68..0453231 100644 --- a/src/Collections/structs.c +++ b/src/Collections/structs.c @@ -30,4 +30,4 @@ static inline unsigned int order_pair_equals(OrderPair* key1, OrderPair* key2){ return key1->first== key2->first && key1->second == key2->second; } -HashTableImpl(BoolConst, OrderPair *, Constraint *, order_pair_hash_Function, order_pair_equals); +HashTableImpl(BoolConst, OrderPair *, OrderPair *, order_pair_hash_Function, order_pair_equals, ourfree); diff --git a/src/Collections/structs.h b/src/Collections/structs.h index 6b274ce..8700459 100644 --- a/src/Collections/structs.h +++ b/src/Collections/structs.h @@ -23,7 +23,7 @@ VectorDef(ASTNode, ASTNode *); VectorDef(Int, uint64_t); HashTableDef(Void, void *, void *); -HashTableDef(BoolConst, OrderPair *, Constraint *); +HashTableDef(BoolConst, OrderPair *, OrderPair *); HashSetDef(Void, void *); diff --git a/src/csolver.c b/src/csolver.c index e3850d1..1d31e42 100644 --- a/src/csolver.c +++ b/src/csolver.c @@ -174,7 +174,6 @@ Boolean * orderConstraint(CSolver *solver, Order * order, uint64_t first, uint64 void startEncoding(CSolver* solver){ naiveEncodingDecision(solver); SATEncoder* satEncoder = allocSATEncoder(); - satEncoder->satSolver =allocIncrementalSolver(); encodeAllSATEncoder(solver, satEncoder); finishedClauses(satEncoder->satSolver); int result= solve(satEncoder->satSolver); @@ -182,4 +181,4 @@ void startEncoding(CSolver* solver){ //For now, let's just delete it, and in future for doing queries //we may need it. deleteSATEncoder(satEncoder); -} \ No newline at end of file +}