Switch from singly linked list to a tail queue - dedup - deduplicating backup program
 (HTM) git clone git://bitreich.org/dedup/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/dedup/
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Tags
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 507fc4bcf4bbfe7d0fefa6c8cdd699322715da61
 (DIR) parent a7753b65b2b40ba265e30e8f2f0bda25da7baa53
 (HTM) Author: sin <sin@2f30.org>
       Date:   Tue,  7 May 2019 16:57:40 +0100
       
       Switch from singly linked list to a tail queue
       
       This is needed to guarantee correct order of traversal for upcoming
       streaming encryption/authentication support.
       
       Diffstat:
         M snap.c                              |      30 +++++++++++++++---------------
       
       1 file changed, 15 insertions(+), 15 deletions(-)
       ---
 (DIR) diff --git a/snap.c b/snap.c
       @@ -21,11 +21,11 @@
        
        struct mdnode {
                unsigned char md[MDSIZE];        /* hash of block */
       -        SLIST_ENTRY(mdnode) e;                /* mdhead link node */
       +        TAILQ_ENTRY(mdnode) e;                /* mdhead link node */
        };
        
        struct sctx {
       -        SLIST_HEAD(mdhead, mdnode) mdhead;        /* list of hashes contained in snapshot */
       +        TAILQ_HEAD(mdhead, mdnode) mdhead;        /* list of hashes contained in snapshot */
                struct mdnode *mdnext;        /* next hash to be returned via sget() */
                int fd;                /* underlying snapshot file descriptor */
                int rdonly;        /* when set to 1, the ssync() operation is a no-op */
       @@ -48,7 +48,7 @@ loadmd(struct sctx *sctx)
                        sseterr("failed to read block hash: %s", strerror(errno));
                        return -1;
                }
       -        SLIST_INSERT_HEAD(&sctx->mdhead, mdnode, e);
       +        TAILQ_INSERT_TAIL(&sctx->mdhead, mdnode, e);
                return 0;
        }
        
       @@ -68,11 +68,11 @@ initmdhead(struct sctx *sctx)
                                continue;
        
                        /* Cleanup */
       -                while (!SLIST_EMPTY(&sctx->mdhead)) {
       +                while (!TAILQ_EMPTY(&sctx->mdhead)) {
                                struct mdnode *mdnode;
        
       -                        mdnode = SLIST_FIRST(&sctx->mdhead);
       -                        SLIST_REMOVE(&sctx->mdhead, mdnode, mdnode, e);
       +                        mdnode = TAILQ_FIRST(&sctx->mdhead);
       +                        TAILQ_REMOVE(&sctx->mdhead, mdnode, e);
                                free(mdnode);
                        }
                        return -1;
       @@ -103,7 +103,7 @@ screat(char *path, int mode, struct sctx **sctx)
                        return -1;
                }
        
       -        SLIST_INIT(&(*sctx)->mdhead);
       +        TAILQ_INIT(&(*sctx)->mdhead);
                (*sctx)->mdnext = NULL;
                (*sctx)->fd = fd;
                return 0;
       @@ -138,7 +138,7 @@ sopen(char *path, int flags, int mode, struct sctx **sctx)
                        return -1;
                }
        
       -        SLIST_INIT(&(*sctx)->mdhead);
       +        TAILQ_INIT(&(*sctx)->mdhead);
                (*sctx)->mdnext = NULL;
                (*sctx)->fd = fd;
                (*sctx)->rdonly = 1;
       @@ -167,7 +167,7 @@ sput(struct sctx *sctx, unsigned char *md)
                        return -1;
                }
                memcpy(mdnode->md, md, MDSIZE);
       -        SLIST_INSERT_HEAD(&sctx->mdhead, mdnode, e);
       +        TAILQ_INSERT_TAIL(&sctx->mdhead, mdnode, e);
                return 0;
        }
        
       @@ -183,9 +183,9 @@ sget(struct sctx *sctx, unsigned char *md)
        
                mdnode = sctx->mdnext;
                if (mdnode == NULL)
       -                mdnode = SLIST_FIRST(&sctx->mdhead);
       +                mdnode = TAILQ_FIRST(&sctx->mdhead);
                else
       -                mdnode = SLIST_NEXT(mdnode, e);
       +                mdnode = TAILQ_NEXT(mdnode, e);
                sctx->mdnext = mdnode;
                if (mdnode != NULL) {
                        memcpy(md, mdnode->md, MDSIZE);
       @@ -222,7 +222,7 @@ ssync(struct sctx *sctx)
                        sseterr("lseek: %s", strerror(errno));
                        return -1;
                }
       -        SLIST_FOREACH(mdnode, &sctx->mdhead, e) {
       +        TAILQ_FOREACH(mdnode, &sctx->mdhead, e) {
                        if (xwrite(sctx->fd, mdnode->md, MDSIZE) != MDSIZE) {
                                sseterr("failed to write block hash: %s",
                                        strerror(errno));
       @@ -245,11 +245,11 @@ sclose(struct sctx *sctx)
                        return -1;
        
                /* Cleanup */
       -        while (!SLIST_EMPTY(&sctx->mdhead)) {
       +        while (!TAILQ_EMPTY(&sctx->mdhead)) {
                        struct mdnode *mdnode;
        
       -                mdnode = SLIST_FIRST(&sctx->mdhead);
       -                SLIST_REMOVE(&sctx->mdhead, mdnode, mdnode, e);
       +                mdnode = TAILQ_FIRST(&sctx->mdhead);
       +                TAILQ_REMOVE(&sctx->mdhead, mdnode, e);
                        free(mdnode);
                }