To avoid too many `#ifdef EROFS_MT_ENABLED`s.

Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com>
---
 include/erofs/lock.h | 44 +++++++++++++++++++++++++++++++++++++++++++
 lib/fragments.c      | 45 ++++++++++++++------------------------------
 2 files changed, 58 insertions(+), 31 deletions(-)
 create mode 100644 include/erofs/lock.h

diff --git a/include/erofs/lock.h b/include/erofs/lock.h
new file mode 100644
index 0000000..f7a4b47
--- /dev/null
+++ b/include/erofs/lock.h
@@ -0,0 +1,44 @@
+/* SPDX-License-Identifier: GPL-2.0+ OR Apache-2.0 */
+#ifndef __EROFS_LOCK_H
+#define __EROFS_LOCK_H
+
+#include "defs.h"
+
+#if defined(HAVE_PTHREAD_H) && defined(EROFS_MT_ENABLED)
+#include <pthread.h>
+
+typedef pthread_mutex_t erofs_mutex_t;
+
+static inline void erofs_mutex_init(erofs_mutex_t *lock)
+{
+       pthread_mutex_init(lock, NULL);
+}
+#define erofs_mutex_lock       pthread_mutex_lock
+#define erofs_mutex_unlock     pthread_mutex_unlock
+
+typedef pthread_rwlock_t erofs_rwsem_t;
+
+static inline void erofs_init_rwsem(erofs_rwsem_t *lock)
+{
+       pthread_rwlock_init(lock, NULL);
+}
+#define erofs_down_read                pthread_rwlock_rdlock
+#define erofs_down_write       pthread_rwlock_wrlock
+#define erofs_up_read          pthread_rwlock_unlock
+#define erofs_up_write         pthread_rwlock_unlock
+#else
+typedef struct {} erofs_mutex_t;
+
+static inline void erofs_mutex_init(erofs_mutex_t *lock) {}
+static inline void erofs_mutex_lock(erofs_mutex_t *lock) {}
+static inline void erofs_mutex_unlock(erofs_mutex_t *lock) {}
+
+typedef struct {} erofs_rwsem_t;
+static inline void erofs_init_rwsem(erofs_rwsem_t *lock) {}
+static inline void erofs_down_read(erofs_rwsem_t *lock) {}
+static inline void erofs_down_write(erofs_rwsem_t *lock) {}
+static inline void erofs_up_read(erofs_rwsem_t *lock) {}
+static inline void erofs_up_write(erofs_rwsem_t *lock) {}
+
+#endif
+#endif
diff --git a/lib/fragments.c b/lib/fragments.c
index 0784a82..28963cd 100644
--- a/lib/fragments.c
+++ b/lib/fragments.c
@@ -19,6 +19,7 @@
 #include "erofs/internal.h"
 #include "erofs/fragments.h"
 #include "erofs/bitops.h"
+#include "erofs/lock.h"
 #include "liberofs_private.h"
 #ifdef HAVE_SYS_SENDFILE_H
 #include <sys/sendfile.h>
@@ -38,18 +39,14 @@ struct erofs_fragmentitem {
 
 struct erofs_fragment_bucket {
        struct list_head hash;
-#ifdef EROFS_MT_ENABLED
-       pthread_rwlock_t lock;
-#endif
+       erofs_rwsem_t lock;
 };
 
 struct erofs_packed_inode {
        struct erofs_fragment_bucket *bks;
        int fd;
        unsigned long *uptodate;
-#if EROFS_MT_ENABLED
-       pthread_mutex_t mutex;
-#endif
+       erofs_mutex_t mutex;
        u64 uptodate_bits;
 };
 
@@ -146,9 +143,7 @@ int erofs_fragment_findmatch(struct erofs_inode *inode, int 
fd, u32 tofh)
        e1 = s1 - EROFS_TOF_HASHLEN;
        deduped = 0;
 
-#ifdef EROFS_MT_ENABLED
-       pthread_rwlock_rdlock(&bk->lock);
-#endif
+       erofs_down_read(&bk->lock);
        list_for_each_entry(cur, &bk->hash, list) {
                unsigned int e2, mn;
                erofs_off_t inmax, i;
@@ -181,9 +176,7 @@ int erofs_fragment_findmatch(struct erofs_inode *inode, int 
fd, u32 tofh)
                if (deduped == inode->i_size)
                        break;
        }
-#ifdef EROFS_MT_ENABLED
-       pthread_rwlock_unlock(&bk->lock);
-#endif
+       erofs_up_read(&bk->lock);
        free(data);
        if (deduped) {
                DBG_BUGON(!fi);
@@ -348,30 +341,23 @@ int erofs_fragment_commit(struct erofs_inode *inode, u32 
tofh)
        offset += fi->length;
 
        if (!list_empty(&fi->list)) {
-#ifdef EROFS_MT_ENABLED
                struct erofs_fragment_bucket *bk = 
&epi->bks[FRAGMENT_HASH(tofh)];
-#endif
                void *nb;
 
                sz = min_t(u64, fi->length, EROFS_FRAGMENT_INMEM_SZ_MAX);
-#ifdef EROFS_MT_ENABLED
-               pthread_rwlock_wrlock(&bk->lock);
-#endif
+
+               erofs_down_write(&bk->lock);
                memmove(fi->data, fi->data + fi->length - sz, sz);
 
                nb = realloc(fi->data, sz);
                if (!nb) {
-#ifdef EROFS_MT_ENABLED
-                       pthread_rwlock_unlock(&bk->lock);
-#endif
+                       erofs_up_write(&bk->lock);
                        fi->data = NULL;
                        return -ENOMEM;
                }
                fi->data = nb;
                fi->pos = (erofs_off_t)offset;
-#ifdef EROFS_MT_ENABLED
-               pthread_rwlock_unlock(&bk->lock);
-#endif
+               erofs_up_write(&bk->lock);
                inode->fragmentoff = fi->pos - len;
                return 0;
        }
@@ -451,9 +437,7 @@ int erofs_packedfile_init(struct erofs_sb_info *sbi, bool 
fragments_mkfs)
                }
                for (i = 0; i < FRAGMENT_HASHSIZE; ++i) {
                        init_list_head(&epi->bks[i].hash);
-#ifdef EROFS_MT_ENABLED
-                       pthread_rwlock_init(&epi->bks[i].lock, NULL);
-#endif
+                       erofs_init_rwsem(&epi->bks[i].lock);
                }
        }
 
@@ -489,6 +473,7 @@ int erofs_packedfile_init(struct erofs_sb_info *sbi, bool 
fragments_mkfs)
                        err = -ENOMEM;
                        goto err_out;
                }
+               erofs_mutex_init(&epi->mutex);
        }
        return 0;
 
@@ -616,23 +601,21 @@ int erofs_packedfile_read(struct erofs_sb_info *sbi,
                        uptodate = __erofs_test_bit(bnr, epi->uptodate);
                        if (!uptodate) {
 #if EROFS_MT_ENABLED
-                               pthread_mutex_lock(&epi->mutex);
+                               erofs_mutex_lock(&epi->mutex);
                                uptodate = __erofs_test_bit(bnr, epi->uptodate);
                                if (!uptodate) {
 #endif
                                        free(buffer);
                                        buffer = erofs_packedfile_preload(&pi, 
&map);
                                        if (IS_ERR(buffer)) {
-#if EROFS_MT_ENABLED
-                                               
pthread_mutex_unlock(&epi->mutex);
-#endif
+                                               erofs_mutex_unlock(&epi->mutex);
                                                buffer = NULL;
                                                goto fallback;
                                        }
 
 #if EROFS_MT_ENABLED
                                }
-                               pthread_mutex_unlock(&epi->mutex);
+                               erofs_mutex_unlock(&epi->mutex);
 #endif
                        }
 
-- 
2.43.5


Reply via email to