From da87df6b86461417d769cd16bccf0a0a7756eda5 Mon Sep 17 00:00:00 2001 From: hong Date: Mon, 27 May 2019 16:18:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=89=E6=A6=82=E7=8E=87=E5=87=BA=E7=8E=B0to?= =?UTF-8?q?tal=E4=B8=BA0=E7=9A=84=E6=97=B6=E5=80=99garbage=E4=B8=8D?= =?UTF-8?q?=E4=B8=BA0=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 3rd/lua/lstring.c | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/3rd/lua/lstring.c b/3rd/lua/lstring.c index d4add290..91db72ea 100644 --- a/3rd/lua/lstring.c +++ b/3rd/lua/lstring.c @@ -230,9 +230,10 @@ struct shrmap { static struct shrmap SSM; -#define ADD_SREF(ts) ATOM_INC(&((ts)->u.ref)) -#define DEC_SREF(ts) ATOM_DEC(&((ts)->u.ref)) +#define ADD_SREF(ts) do {if(ATOM_INC(&((ts)->u.ref))==1) ATOM_DEC(&SSM.garbage);}while(0) +#define DEC_SREF(ts) do {if(ATOM_DEC(&((ts)->u.ref))==0) ATOM_INC(&SSM.garbage);}while(0) #define ZERO_SREF(ts) ((ts)->u.ref == 0) +#define FREE_SREF(ts) do {free(ts);ATOM_DEC(&SSM.total);ATOM_DEC(&SSM.garbage);}while(0) static struct ssm_ref * newref(int size) { @@ -526,9 +527,6 @@ exist(struct ssm_ref *r, TString *s) { static void release_tstring(TString *s) { DEC_SREF(s); - if (ZERO_SREF(s)) { - ATOM_INC(&SSM.garbage); - } } static int @@ -664,7 +662,7 @@ shrstr_deletepage(struct shrmap_slot *s, int sz) { TString *str = s[i].str; while (str) { TString * next = (TString *)str->next; - free(str); + FREE_SREF(str); str = next; } } @@ -694,9 +692,7 @@ shrstr_rehash(struct shrmap *s, int slotid) { while (str) { TString * next = (TString *)str->next; if (ZERO_SREF(str)) { - free(str); - ATOM_DEC(&SSM.total); - ATOM_DEC(&SSM.garbage); + FREE_SREF(str); } else { int newslotid = lmod(str->hash, s->rwslots); struct shrmap_slot *newslot = &s->readwrite[newslotid]; @@ -777,10 +773,8 @@ sweep_slot(struct shrmap *s, int i) { while (ts) { if (ZERO_SREF(ts)) { *ref = (TString *)ts->next; - free(ts); + FREE_SREF(ts); ts = *ref; - ATOM_DEC(&SSM.total); - ATOM_DEC(&SSM.garbage); ++n; } else { ref = (TString **)&(ts->next); @@ -896,18 +890,13 @@ find_and_collect(struct shrmap_slot * slot, unsigned int h, const char *str, lu_ if (ts->hash == h && ts->shrlen == l && memcmp(str, ts+1, l) == 0) { - if (ZERO_SREF(ts)) { - ATOM_INC(&SSM.garbage); - } ADD_SREF(ts); break; } if (ZERO_SREF(ts)) { *ref = (TString *)ts->next; - free(ts); + FREE_SREF(ts); ts = *ref; - ATOM_DEC(&SSM.total); - ATOM_DEC(&SSM.garbage); } else { ref = (TString **)&(ts->next); ts = *ref;