Make init_spin_delay() C89 compliant #2.
authorAndres Freund <andres@anarazel.de>
Fri, 15 Apr 2016 02:26:13 +0000 (19:26 -0700)
committerAndres Freund <andres@anarazel.de>
Fri, 15 Apr 2016 02:26:13 +0000 (19:26 -0700)
My previous attempt at doing so, in 80abbeba23, was not sufficient. While that
fixed the problem for bufmgr.c and lwlock.c , s_lock.c still has non-constant
expressions in the struct initializer, because the file/line/function
information comes from the caller of s_lock().

Give up on using a macro, and use a static inline instead.

Discussion: 4369.1460435533@sss.pgh.pa.us

src/backend/storage/buffer/bufmgr.c
src/backend/storage/lmgr/lwlock.c
src/backend/storage/lmgr/s_lock.c
src/include/storage/s_lock.h

index 47644ea528b3d95300454afddeec9d1e90e2fce2..462dd4a22620e3394713bf1f899dddf6ebd40d57 100644 (file)
@@ -4029,9 +4029,11 @@ rnode_comparator(const void *p1, const void *p2)
 uint32
 LockBufHdr(BufferDesc *desc)
 {
-       SpinDelayStatus delayStatus = init_local_spin_delay();
+       SpinDelayStatus delayStatus;
        uint32          old_buf_state;
 
+       init_local_spin_delay(&delayStatus);
+
        while (true)
        {
                /* set BM_LOCKED flag */
@@ -4055,9 +4057,11 @@ LockBufHdr(BufferDesc *desc)
 static uint32
 WaitBufHdrUnlocked(BufferDesc *buf)
 {
-       SpinDelayStatus delayStatus = init_local_spin_delay();
+       SpinDelayStatus delayStatus;
        uint32          buf_state;
 
+       init_local_spin_delay(&delayStatus);
+
        buf_state = pg_atomic_read_u32(&buf->state);
 
        while (buf_state & BM_LOCKED)
index ddb653a06d795e708d335f1ae2adc56602d4d436..25eec9800dea8c0f79abe21f1f66f86b3b22c530 100644 (file)
@@ -870,7 +870,9 @@ LWLockWaitListLock(LWLock *lock)
 
                /* and then spin without atomic operations until lock is released */
                {
-                       SpinDelayStatus delayStatus = init_local_spin_delay();
+                       SpinDelayStatus delayStatus;
+
+                       init_local_spin_delay(&delayStatus);
 
                        while (old_state & LW_FLAG_LOCKED)
                        {
index 3902cbf2d962816e2ff1eff878494ab303204a6f..599940cbd2d493271922059584ecc785f0f620bd 100644 (file)
@@ -91,7 +91,9 @@ s_lock_stuck(const char *file, int line, const char *func)
 int
 s_lock(volatile slock_t *lock, const char *file, int line, const char *func)
 {
-       SpinDelayStatus delayStatus = init_spin_delay(file, line, func);
+       SpinDelayStatus delayStatus;
+
+       init_spin_delay(&delayStatus, file, line, func);
 
        while (TAS_SPIN(lock))
        {
index 50ea5c0eaf793a700b2f2af2a5614c87f733db55..7aad2de43d0d8373d158af155dd08ad82cb3b7ba 100644 (file)
@@ -1005,8 +1005,19 @@ typedef struct
        const char *func;
 } SpinDelayStatus;
 
-#define init_spin_delay(file, line, func) {0, 0, 0, file, line, func}
-#define init_local_spin_delay() init_spin_delay(__FILE__, __LINE__, PG_FUNCNAME_MACRO)
+static inline void
+init_spin_delay(SpinDelayStatus *status,
+                               const char *file, int line, const char *func)
+{
+       status->spins = 0;
+       status->delays = 0;
+       status->cur_delay = 0;
+       status->file = file;
+       status->line = line;
+       status->func = func;
+}
+
+#define init_local_spin_delay(status) init_spin_delay(status, __FILE__, __LINE__, PG_FUNCNAME_MACRO)
 void perform_spin_delay(SpinDelayStatus *status);
 void finish_spin_delay(SpinDelayStatus *status);