Fix context leak
This commit is contained in:
parent
788eed763a
commit
dc16dd98fb
12 changed files with 59 additions and 38 deletions
|
|
@ -157,6 +157,11 @@ typedef struct workarea {
|
|||
typedef struct sj3context {
|
||||
Global* work;
|
||||
STDY* stdy;
|
||||
|
||||
JREC* jrec_free;
|
||||
JREC* jrec_pool;
|
||||
CLREC* clrec_free;
|
||||
CLREC* clrec_pool;
|
||||
} Sj3Context;
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -64,10 +64,10 @@ TypeIdxOfs count_uidx(SJ3_CONTEXT2);
|
|||
void chg_uidx(SJ3_CONTEXT TypeDicSeg, u_char*, int);
|
||||
|
||||
/* alloc.c */
|
||||
JREC* alloc_jrec(void);
|
||||
void free_jrec(JREC*);
|
||||
CLREC* alloc_clrec(void);
|
||||
void free_clrec(CLREC*);
|
||||
JREC* alloc_jrec(SJ3_CONTEXT2);
|
||||
void free_jrec(SJ3_CONTEXT JREC*);
|
||||
CLREC* alloc_clrec(SJ3_CONTEXT2);
|
||||
void free_clrec(SJ3_CONTEXT CLREC*);
|
||||
|
||||
/* charsize.c */
|
||||
int codesize(u_char);
|
||||
|
|
@ -163,10 +163,10 @@ int istrcmp(u_char*, u_char*, int, int);
|
|||
void sstrncpy(u_char*, u_char*, int);
|
||||
|
||||
/* memory.c */
|
||||
JREC* free_jlst(JREC*);
|
||||
JREC* free_jlst(SJ3_CONTEXT JREC*);
|
||||
CLREC* free_clst(SJ3_CONTEXT CLREC*, int);
|
||||
void free_clall(CLREC*);
|
||||
void free_jall(JREC*);
|
||||
void free_clall(SJ3_CONTEXT CLREC*);
|
||||
void free_jall(SJ3_CONTEXT JREC*);
|
||||
void freework(SJ3_CONTEXT2);
|
||||
|
||||
/* mk2claus.c */
|
||||
|
|
|
|||
|
|
@ -46,10 +46,15 @@
|
|||
#define JREC_NUM 128
|
||||
#define CLREC_NUM 128
|
||||
|
||||
#ifdef SJ3_GLOBAL
|
||||
static JREC* jrec = NULL;
|
||||
static CLREC* clrec = NULL;
|
||||
#else
|
||||
#define jrec ctx->jrec_free
|
||||
#define clrec ctx->clrec_free
|
||||
#endif
|
||||
|
||||
JREC* alloc_jrec() {
|
||||
JREC* alloc_jrec(SJ3_CONTEXT2) {
|
||||
JREC* p;
|
||||
int i;
|
||||
|
||||
|
|
@ -59,6 +64,10 @@ JREC* alloc_jrec() {
|
|||
for(i = 0, p = jrec; i < JREC_NUM - 1; i++, p++)
|
||||
p->jsort = p + 1;
|
||||
p->jsort = NULL;
|
||||
|
||||
#ifndef SJ3_GLOBAL
|
||||
ctx->jrec_pool = jrec;
|
||||
#endif
|
||||
}
|
||||
p = jrec;
|
||||
jrec = jrec->jsort;
|
||||
|
|
@ -66,7 +75,7 @@ JREC* alloc_jrec() {
|
|||
return p;
|
||||
}
|
||||
|
||||
void free_jrec(JREC* p) {
|
||||
void free_jrec(SJ3_CONTEXT JREC* p) {
|
||||
if(p != NULL) {
|
||||
p->jsort = jrec;
|
||||
jrec = p;
|
||||
|
|
@ -74,7 +83,7 @@ void free_jrec(JREC* p) {
|
|||
}
|
||||
|
||||
CLREC*
|
||||
alloc_clrec() {
|
||||
alloc_clrec(SJ3_CONTEXT2) {
|
||||
CLREC* p;
|
||||
int i;
|
||||
|
||||
|
|
@ -84,6 +93,10 @@ alloc_clrec() {
|
|||
for(i = 0, p = clrec; i < CLREC_NUM - 1; i++, p++)
|
||||
p->clsort = p + 1;
|
||||
p->clsort = NULL;
|
||||
|
||||
#ifndef SJ3_GLOBAL
|
||||
ctx->clrec_pool = clrec;
|
||||
#endif
|
||||
}
|
||||
p = clrec;
|
||||
clrec = clrec->clsort;
|
||||
|
|
@ -91,7 +104,7 @@ alloc_clrec() {
|
|||
return p;
|
||||
}
|
||||
|
||||
void free_clrec(CLREC* p) {
|
||||
void free_clrec(SJ3_CONTEXT CLREC* p) {
|
||||
if(p != NULL) {
|
||||
p->clsort = clrec;
|
||||
clrec = p;
|
||||
|
|
|
|||
|
|
@ -87,8 +87,8 @@ void cvtphknj(SJ3_CONTEXT2) {
|
|||
|
||||
not_enough_memory:
|
||||
|
||||
free_clall(clt1st);
|
||||
free_jall(jrt1st);
|
||||
free_clall(SJ3_CONTEXT_PASS clt1st);
|
||||
free_jall(SJ3_CONTEXT_PASS jrt1st);
|
||||
}
|
||||
|
||||
void cvtkouho(SJ3_CONTEXT KHREC* krec) {
|
||||
|
|
|
|||
|
|
@ -118,6 +118,9 @@ void free_context(Sj3Context* ctx) {
|
|||
|
||||
freework(ctx);
|
||||
|
||||
free(ctx->jrec_pool);
|
||||
free(ctx->clrec_pool);
|
||||
|
||||
free(ctx->stdy);
|
||||
free(ctx->work);
|
||||
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@
|
|||
|
||||
#include "sj_kanakan.h"
|
||||
|
||||
JREC* free_jlst(JREC* p) {
|
||||
JREC* free_jlst(SJ3_CONTEXT JREC* p) {
|
||||
JREC* jpk;
|
||||
JREC* jp;
|
||||
JREC* jn;
|
||||
|
|
@ -57,7 +57,7 @@ JREC* free_jlst(JREC* p) {
|
|||
}
|
||||
|
||||
else {
|
||||
free_jrec(p);
|
||||
free_jrec(SJ3_CONTEXT_PASS p);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -97,7 +97,7 @@ free_clst(SJ3_CONTEXT CLREC* p, int l) {
|
|||
else {
|
||||
(p->jnode->count)--;
|
||||
|
||||
free_clrec(p);
|
||||
free_clrec(SJ3_CONTEXT_PASS p);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -106,31 +106,31 @@ free_clst(SJ3_CONTEXT CLREC* p, int l) {
|
|||
return cpk;
|
||||
}
|
||||
|
||||
void free_clall(CLREC* p) {
|
||||
void free_clall(SJ3_CONTEXT CLREC* p) {
|
||||
CLREC* next;
|
||||
|
||||
while(p) {
|
||||
(p->jnode->count)--;
|
||||
next = p->clsort;
|
||||
free_clrec(p);
|
||||
free_clrec(SJ3_CONTEXT_PASS p);
|
||||
p = next;
|
||||
}
|
||||
}
|
||||
|
||||
void free_jall(JREC* p) {
|
||||
void free_jall(SJ3_CONTEXT JREC* p) {
|
||||
JREC* next;
|
||||
|
||||
while(p) {
|
||||
next = p->jsort;
|
||||
free_jrec(p);
|
||||
free_jrec(SJ3_CONTEXT_PASS p);
|
||||
p = next;
|
||||
}
|
||||
}
|
||||
|
||||
void freework(SJ3_CONTEXT2) {
|
||||
free_clall(maxclptr);
|
||||
free_clall(SJ3_CONTEXT_PASS maxclptr);
|
||||
clt1st = maxclptr = NULL;
|
||||
|
||||
free_jall(maxjptr);
|
||||
free_jall(SJ3_CONTEXT_PASS maxjptr);
|
||||
jrt1st = maxjptr = NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -99,8 +99,8 @@ void mk2claus(SJ3_CONTEXT2) {
|
|||
|
||||
if(len != clrec->cllen) {
|
||||
if(clt2nd != maxclptr) {
|
||||
free_clall(maxclptr);
|
||||
free_jall(maxjptr);
|
||||
free_clall(SJ3_CONTEXT_PASS maxclptr);
|
||||
free_jall(SJ3_CONTEXT_PASS maxjptr);
|
||||
}
|
||||
|
||||
save2ln = set2nd(SJ3_CONTEXT_PASS clrec);
|
||||
|
|
@ -138,16 +138,16 @@ void mk2claus(SJ3_CONTEXT2) {
|
|||
|
||||
if(clt2nd == maxclptr) continue;
|
||||
|
||||
free_clall(clt2nd);
|
||||
free_jall(jrt2nd);
|
||||
free_clall(SJ3_CONTEXT_PASS clt2nd);
|
||||
free_jall(SJ3_CONTEXT_PASS jrt2nd);
|
||||
jrt2nd = maxjptr;
|
||||
clt2nd = maxclptr;
|
||||
}
|
||||
|
||||
if(clt2nd != maxclptr) {
|
||||
free_clall(maxclptr);
|
||||
free_clall(SJ3_CONTEXT_PASS maxclptr);
|
||||
maxclptr = NULL;
|
||||
free_jall(maxjptr);
|
||||
free_jall(SJ3_CONTEXT_PASS maxjptr);
|
||||
maxjptr = NULL;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@ argclrec(SJ3_CONTEXT int len) {
|
|||
CLREC* rec;
|
||||
CLREC* child;
|
||||
|
||||
rec = alloc_clrec();
|
||||
rec = alloc_clrec(SJ3_CONTEXT_PASS2);
|
||||
|
||||
if(!rec) {
|
||||
if(!maxclptr)
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@ JREC* argjrec(SJ3_CONTEXT int len, JREC* rec) {
|
|||
JREC* jrec;
|
||||
JREC* child;
|
||||
|
||||
jrec = alloc_jrec();
|
||||
jrec = alloc_jrec(SJ3_CONTEXT_PASS2);
|
||||
|
||||
if(!jrec) {
|
||||
if(!maxjptr) return NULL;
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ int ph2knj(SJ3_CONTEXT u_char* zyomi, u_char* kanji, int knjlen) {
|
|||
prevclrow = selcl->right;
|
||||
|
||||
clt1st = free_clst(SJ3_CONTEXT_PASS clt1st, (int)selcl->cllen);
|
||||
jrt1st = free_jlst(jrt1st);
|
||||
jrt1st = free_jlst(SJ3_CONTEXT_PASS jrt1st);
|
||||
|
||||
cnvstart += selcl->cllen;
|
||||
cnvlen -= selcl->cllen;
|
||||
|
|
@ -98,8 +98,8 @@ int ph2knj(SJ3_CONTEXT u_char* zyomi, u_char* kanji, int knjlen) {
|
|||
}
|
||||
|
||||
if(!kanjilen) {
|
||||
free_clall(clt1st);
|
||||
free_jall(jrt1st);
|
||||
free_clall(SJ3_CONTEXT_PASS clt1st);
|
||||
free_jall(SJ3_CONTEXT_PASS jrt1st);
|
||||
}
|
||||
|
||||
*kanjipos = 0;
|
||||
|
|
|
|||
|
|
@ -77,8 +77,8 @@ void selclrec(SJ3_CONTEXT2) {
|
|||
int klen;
|
||||
u_char ch;
|
||||
|
||||
free_clall(clt1st);
|
||||
free_jall(jrt1st);
|
||||
free_clall(SJ3_CONTEXT_PASS clt1st);
|
||||
free_jall(SJ3_CONTEXT_PASS jrt1st);
|
||||
|
||||
klen = cnvlen;
|
||||
cnvlen = len;
|
||||
|
|
@ -97,8 +97,8 @@ void selclrec(SJ3_CONTEXT2) {
|
|||
*(cnvstart + len) = ch;
|
||||
}
|
||||
|
||||
free_clall(clt2nd);
|
||||
free_clall(SJ3_CONTEXT_PASS clt2nd);
|
||||
clt2nd = NULL;
|
||||
free_jall(jrt2nd);
|
||||
free_jall(SJ3_CONTEXT_PASS jrt2nd);
|
||||
jrt2nd = NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ void wakachi(SJ3_CONTEXT2) {
|
|||
int i;
|
||||
int maxlen;
|
||||
|
||||
free_jall(maxjptr);
|
||||
free_jall(SJ3_CONTEXT_PASS maxjptr);
|
||||
maxjptr = NULL;
|
||||
|
||||
maxlen = (cnvlen > MAXCLINPUTLEN) ? MAXCLINPUTLEN : cnvlen;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue