Make init_spin_delay() C89 compliant #2.
authorAndres Freund
Fri, 15 Apr 2016 02:26:13 +0000 (19:26 -0700)
committerAndres Freund
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);