[DRE-maint] Bug#1053651: ruby-pg-query: add loongarch spinlock support

Zang Ruochen zangruochen at loongson.cn
Sun Oct 8 03:57:06 BST 2023


Package: ruby-pg-query
Version: 2.2.1-2
Severity: wishlist
Tags: patch
User: debian-devel at lists.debian.org
Usertags: loongarch64

Dear ruby-pg-query maintainers,

Fixed a compilation error with ruby-pg-query due to lack of loongarch 
spinlock support.

thanks,
Zang Ruochen
-------------- next part --------------
From 1e02735872612b4653f89ac0b0117ed9076d299f Mon Sep 17 00:00:00 2001
From: Zang Ruochen <zangruochen at loongson.cn>
Date: Sun, 8 Oct 2023 02:07:14 +0000
Subject: [PATCH] add loongarch spinlock support.

---
 ext/pg_query/include/storage/s_lock.h | 39 +++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/ext/pg_query/include/storage/s_lock.h b/ext/pg_query/include/storage/s_lock.h
index 6b368a5..393f0ab 100644
--- a/ext/pg_query/include/storage/s_lock.h
+++ b/ext/pg_query/include/storage/s_lock.h
@@ -696,6 +696,45 @@ do \
 
 #endif /* __mips__ && !__sgi */
 
+#if defined(__loongarch__)   /* loongarch */
+#define HAS_TEST_AND_SET
+
+typedef unsigned int slock_t;
+
+#define TAS(lock) tas(lock)
+
+static __inline__ int
+tas(volatile slock_t *lock)
+{
+        register volatile slock_t *_l = lock;
+        register int _res;
+        register int _tmp;
+
+        __asm__ __volatile__(
+                "       ll.w    %0, %2      \n"
+                "       ori     %1, %0, 1   \n"
+                "       sc.w    %1, %2      \n"
+                "       xori    %1, %1, 1   \n"
+                "       or      %0, %0, %1  \n"
+                "       dbar    0           \n"
+:               "=&r" (_res), "=&r" (_tmp), "+ZC" (*_l)
+:               /* no inputs */
+:               "memory");
+        return _res;
+}
+
+#define S_UNLOCK(lock)  \
+do \
+{ \
+        __asm__ __volatile__( \
+                "  dbar  0 \n" \
+:               /* no outputs */ \
+:               /* no inputs */ \
+:               "memory"); \
+        *((volatile slock_t *) (lock)) = 0; \
+} while (0)
+
+#endif /* __loongarch__ */
 
 #if defined(__m32r__) && defined(HAVE_SYS_TAS_H)	/* Renesas' M32R */
 #define HAS_TEST_AND_SET
-- 
2.40.1



More information about the Pkg-ruby-extras-maintainers mailing list