Marked code that will require some rework for LMDB.
authorArt Cancro <ajc@citadel.org>
Mon, 7 Aug 2023 14:55:11 +0000 (05:55 -0900)
committerArt Cancro <ajc@citadel.org>
Mon, 7 Aug 2023 14:55:11 +0000 (05:55 -0900)
When BDB returns data, the caller owns the memory and is required to
free it, which we usually do.  I marked the places where we take ownership
of memory pointers and then set the BDB ptr to NULL.  If we switch to
LMDB, those pointers remain valid forever, so we cannot simply free them
later.

citadel/server/modules/fulltext/serv_fulltext.c
citadel/server/modules/imap/serv_imap.c
citadel/server/modules/nntp/serv_nntp.c
citadel/server/msgbase.c
citadel/server/room_ops.c

index acbf524df3e17f514fe07e2522371b2a78bd9013..008e4fc60e4abc7f58ba436db2809183f53ac46c 100644 (file)
@@ -131,7 +131,7 @@ void ft_index_message(long msgnum, int op) {
                                        if (cdb_bucket != NULL) {
                                                ftc_num_msgs[tok] = cdb_bucket->len / sizeof(long);
                                                ftc_msgs[tok] = (long *)cdb_bucket->ptr;
-                                               cdb_bucket->ptr = NULL;
+                                               cdb_bucket->ptr = NULL;         // (this needs attention if we move to LMDB)
                                                cdb_free(cdb_bucket);
                                        }
                                        else {
@@ -315,7 +315,7 @@ void ft_search(int *fts_num_msgs, long **fts_msgs, const char *search_string) {
                                if (cdb_bucket != NULL) {
                                        ftc_num_msgs[tok] = cdb_bucket->len / sizeof(long);
                                        ftc_msgs[tok] = (long *)cdb_bucket->ptr;
-                                       cdb_bucket->ptr = NULL;
+                                       cdb_bucket->ptr = NULL;                 // (this needs attention if we move to LMDB)
                                        cdb_free(cdb_bucket);
                                }
                                else {
index 30e7b2587382e2123c87465f8c0f9eeddc53dedc..b42c5022b80ac8ca929615ee7f62e719e4c97b3e 100644 (file)
@@ -274,7 +274,7 @@ void imap_load_msgids(void) {
                Imap->msgids = (long*)cdbfr->ptr;
                Imap->num_msgs = cdbfr->len / sizeof(long);
                Imap->num_alloc = cdbfr->len / sizeof(long);
-               cdbfr->ptr = NULL;
+               cdbfr->ptr = NULL;                      // (this needs attention if we move to LMDB)
                cdbfr->len = 0;
                cdb_free(cdbfr);
        }
@@ -323,7 +323,7 @@ void imap_rescan_msgids(void) {
        cdbfr = cdb_fetch(CDB_MSGLISTS, &CC->room.QRnumber, sizeof(long));
        if (cdbfr != NULL) {
                msglist = (long*)cdbfr->ptr;
-               cdbfr->ptr = NULL;
+               cdbfr->ptr = NULL;                      // (this needs attention if we move to LMDB)
                num_msgs = cdbfr->len / sizeof(long);
                cdbfr->len = 0;
                cdb_free(cdbfr);
index ef305d50f45ad932ddf27e728dac35e2ba656d9d..4c6daaf5ef85bcef8a37aed1a86c94aadd761b69 100644 (file)
@@ -322,7 +322,7 @@ struct nntp_msglist nntp_fetch_msglist(struct ctdlroom *qrbuf) {
        cdbfr = cdb_fetch(CDB_MSGLISTS, &qrbuf->QRnumber, sizeof(long));
        if (cdbfr != NULL) {
                nm.msgnums = (long*)cdbfr->ptr;
-               cdbfr->ptr = NULL;
+               cdbfr->ptr = NULL;                      // (this needs attention if we move to LMDB)
                nm.num_msgs = cdbfr->len / sizeof(long);
                cdbfr->len = 0;
                cdb_free(cdbfr);
index e5f8b1e190813e8f672520aeb2a02ef170126fea..9b4f2535f73b404bca384fd5178be5c526ed57b3 100644 (file)
@@ -448,7 +448,7 @@ void CtdlSetSeen(long *target_msgnums, int num_target_msgnums,
        cdbfr = cdb_fetch(CDB_MSGLISTS, &which_room->QRnumber, sizeof(long));
        if (cdbfr != NULL) {
                msglist = (long *) cdbfr->ptr;
-               cdbfr->ptr = NULL;      // CtdlSetSeen() now owns this memory
+               cdbfr->ptr = NULL;      // CtdlSetSeen() now owns this memory (this needs attention if we move to LMDB)
                num_msgs = cdbfr->len / sizeof(long);
                cdb_free(cdbfr);
        }
@@ -2265,9 +2265,10 @@ int CtdlSaveMsgPointersInRoom(char *roomname, long newmsgidlist[], int num_newms
        if (cdbfr == NULL) {
                msglist = NULL;
                num_msgs = 0;
-       } else {
+       }
+       else {
                msglist = (long *) cdbfr->ptr;
-               cdbfr->ptr = NULL;      /* CtdlSaveMsgPointerInRoom() now owns this memory */
+               cdbfr->ptr = NULL;      // CtdlSaveMsgPointerInRoom() now owns this memory (this needs attention if we move to LMDB)
                num_msgs = cdbfr->len / sizeof(long);
                cdb_free(cdbfr);
        }
@@ -3255,7 +3256,7 @@ int CtdlDeleteMessages(const char *room_name,     // which room
        if (cdbfr != NULL) {
                dellist = malloc(cdbfr->len);
                msglist = (long *) cdbfr->ptr;
-               cdbfr->ptr = NULL;      /* CtdlDeleteMessages() now owns this memory */
+               cdbfr->ptr = NULL;      // CtdlDeleteMessages() now owns this memory (this needs attention if we move to LMDB)
                num_msgs = cdbfr->len / sizeof(long);
                cdb_free(cdbfr);
        }
@@ -3265,18 +3266,11 @@ int CtdlDeleteMessages(const char *room_name,   // which room
                int have_more_del = 1;
 
                num_msgs = sort_msglist(msglist, num_msgs);
-               if (num_dmsgnums > 1)
+               if (num_dmsgnums > 1) {
                        num_dmsgnums = sort_msglist(dmsgnums, num_dmsgnums);
-/*
-               {
-                       StrBuf *dbg = NewStrBuf();
-                       for (i = 0; i < num_dmsgnums; i++)
-                               StrBufAppendPrintf(dbg, ", %ld", dmsgnums[i]);
-                       syslog(LOG_DEBUG, "msgbase: Deleting before: %s", ChrPtr(dbg));
-                       FreeStrBuf(&dbg);
                }
-*/
-               i = 0; j = 0;
+               i = 0;
+               j = 0;
                while ((i < num_msgs) && (have_more_del)) {
                        delete_this = 0x00;
 
index 56c20e0d030436ab7c8099801fb3713bd34dbd49..1566e74b0a85261426a9bd1994816048a0beca8b 100644 (file)
@@ -670,7 +670,7 @@ void CtdlUserGoto(char *where, int display_result, int transiently, int *retmsgs
         cdbfr = cdb_fetch(CDB_MSGLISTS, &CC->room.QRnumber, sizeof(long));
         if (cdbfr != NULL) {
                msglist = (long *) cdbfr->ptr;
-               cdbfr->ptr = NULL;                      // CtdlUserGoto() now owns this memory
+               cdbfr->ptr = NULL;                      // CtdlUserGoto() now owns this memory (this requires attention if we move to LMDB)
                num_msgs = cdbfr->len / sizeof(long);
                cdb_free(cdbfr);
        }