X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fserver%2Fmodules%2Fexpire%2Fserv_expire.c;h=abcf62b121f8e57d6984da64ad377211f2d26020;hb=d8de66ffdc9d5f595357f76a78339bb29d094891;hp=014dfa6c7768478b4fe07073b176a7ba772e9bd0;hpb=e9cac79780cb6870fe23d1c22d5f8f07f73bcbc3;p=citadel.git diff --git a/citadel/server/modules/expire/serv_expire.c b/citadel/server/modules/expire/serv_expire.c index 014dfa6c7..abcf62b12 100644 --- a/citadel/server/modules/expire/serv_expire.c +++ b/citadel/server/modules/expire/serv_expire.c @@ -66,11 +66,6 @@ struct ctdlroomref { long msgnum; }; -struct UPurgeList { - struct UPurgeList *next; - char up_key[256]; -}; - struct EPurgeList { struct EPurgeList *next; int ep_keylen; @@ -584,13 +579,13 @@ int PurgeVisits(void) { // Purge the use table of old entries. +// Holy crap, this is WAY better. We need to replace most linked lists with arrays. int PurgeUseTable(StrBuf *ErrMsg) { int purged = 0; int total = 0; struct cdbdata *cdbut; struct UseTable ut; - struct UPurgeList *ul = NULL; - struct UPurgeList *uptr; + Array *purge_list = array_new(sizeof(int)); // Phase 1: traverse through the table, discovering old records... @@ -606,26 +601,20 @@ int PurgeUseTable(StrBuf *ErrMsg) { } cdb_free(cdbut); - if ( (time(NULL) - ut.ut_timestamp) > USETABLE_RETAIN ) { - uptr = (struct UPurgeList *) malloc(sizeof(struct UPurgeList)); - if (uptr != NULL) { - uptr->next = ul; - safestrncpy(uptr->up_key, ut.ut_msgid, sizeof uptr->up_key); - ul = uptr; - } + if ( (time(NULL) - ut.timestamp) > USETABLE_RETAIN ) { + array_append(purge_list, &ut.hash); ++purged; } - } // Phase 2: delete the records syslog(LOG_DEBUG, "Purge use table: phase 2"); - while (ul != NULL) { - cdb_delete(CDB_USETABLE, ul->up_key, strlen(ul->up_key)); - uptr = ul->next; - free(ul); - ul = uptr; + int i; + for (i=0; ihash, sizeof(int)); } + array_free(purge_list); syslog(LOG_DEBUG, "Purge use table: finished (purged %d of %d records)", purged, total); return(purged);