freeze.c 991 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. #include "__virtualmath.h"
  2. void gc_freezeHashTable(HashTable *ht, bool is_lock){
  3. if (ht == NULL)
  4. return;
  5. if (is_lock)
  6. gc_addTmpLink(&ht->gc_status);
  7. else
  8. gc_freeTmpLink(&ht->gc_status);
  9. gc_IterAlready(&ht->gc_status);
  10. }
  11. void iterFreezeVarList(VarList *freeze, VarList *base, bool is_lock){
  12. for (PASS; freeze != NULL; freeze = freeze->next){
  13. bool need_freeze = true;
  14. for (VarList *tmp = base; tmp != NULL;tmp = tmp->next)
  15. if (tmp->hashtable == freeze->hashtable){
  16. need_freeze = false;
  17. break;
  18. }
  19. if (need_freeze)
  20. gc_freezeHashTable(freeze->hashtable, is_lock);
  21. }
  22. }
  23. /**
  24. * 冻结不可达的VarList的hashTable
  25. * @param inter
  26. * @param freeze
  27. * @param base
  28. * @param is_lock
  29. */
  30. void runFREEZE(Inter *inter, VarList *freeze, VarList *base, bool is_lock){
  31. #if START_GC
  32. gc_resetBase(inter);
  33. iterFreezeVarList(freeze, base, is_lock);
  34. #endif
  35. }