freeze.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #include "__virtualmath.h"
  2. void gc_freezeValue(Value *value, bool is_lock);
  3. void gc_freezeHashTable(HashTable *ht, bool is_lock);
  4. void gc_freezeVarList(VarList *vl, bool is_lock);
  5. void gc_freezeVar(Var *var, bool is_lock);
  6. void gc_freezeLinkValue(LinkValue *value, bool is_lock){
  7. if (value == NULL)
  8. return;
  9. if (is_lock)
  10. gcAddTmp(&value->gc_status);
  11. else
  12. gcFreeTmpLink(&value->gc_status);
  13. if (!setIterAlready(&value->gc_status)){
  14. gc_freezeLinkValue(value->father, is_lock);
  15. gc_freezeValue(value->value, is_lock);
  16. }
  17. }
  18. void gc_freezeValue(Value *value, bool is_lock){
  19. if (value == NULL)
  20. return;
  21. if (is_lock)
  22. gcAddTmp(&value->gc_status);
  23. else
  24. gcFreeTmpLink(&value->gc_status);
  25. if (setIterAlready(&value->gc_status))
  26. return;
  27. switch (value->type) {
  28. case function:
  29. gc_freezeVarList(value->data.function.var, is_lock);
  30. break;
  31. case list:
  32. for (int i=0;i < value->data.list.size;i++)
  33. gc_freezeLinkValue(value->data.list.list[i], is_lock);
  34. break;
  35. case dict:
  36. gc_freezeHashTable(value->data.dict.dict, is_lock);
  37. break;
  38. default:
  39. break;
  40. }
  41. }
  42. void gc_freezeVarList(VarList *vl, bool is_lock){
  43. while (vl != NULL) {
  44. gc_freezeHashTable(vl->hashtable, is_lock);
  45. vl = vl->next;
  46. }
  47. }
  48. void gc_freezeHashTable(HashTable *ht, bool is_lock){
  49. if (ht == NULL)
  50. return;
  51. if (is_lock)
  52. gcAddTmp(&ht->gc_status);
  53. else
  54. gcFreeTmpLink(&ht->gc_status);
  55. if (setIterAlready(&ht->gc_status))
  56. return;
  57. for (int i=0;i < MAX_SIZE;i++){
  58. gc_freezeVar(ht->hashtable[i], is_lock);
  59. }
  60. }
  61. void gc_freezeVar(Var *var, bool is_lock){
  62. while (var != NULL){
  63. gc_freezeLinkValue(var->name_, is_lock);
  64. gc_freezeLinkValue(var->value, is_lock);
  65. var = var->next;
  66. }
  67. }
  68. void iterFreezeVarList(VarList *freeze, VarList *base, bool is_lock){
  69. while (freeze != NULL){
  70. VarList *tmp = base;
  71. bool need_freeze = true;
  72. while (tmp != NULL){
  73. if (tmp->hashtable == freeze->hashtable){
  74. need_freeze = false;
  75. break;
  76. }
  77. tmp = tmp->next;
  78. }
  79. if (need_freeze)
  80. gc_freezeHashTable(freeze->hashtable, is_lock);
  81. freeze = freeze->next;
  82. }
  83. }
  84. /**
  85. * 冻结不可达的VarList的hashTable
  86. * @param inter
  87. * @param freeze
  88. * @param base
  89. * @param is_lock
  90. */
  91. void runFREEZE(Inter *inter, VarList *freeze, VarList *base, bool is_lock){
  92. #if START_GC
  93. gc_resetBase(inter);
  94. iterFreezeVarList(freeze, base, is_lock);
  95. #endif
  96. }