OSDN Git Service

Don't call OwnLatch while holding a spinlock. OwnLatch can elog() under
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Wed, 15 Sep 2010 06:51:19 +0000 (06:51 +0000)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Wed, 15 Sep 2010 06:51:19 +0000 (06:51 +0000)
some "can't happen" scenarios, and spinlocks should only be held for
a few instructions anyway. As pointed out by Fujii Masao.

src/backend/replication/walsender.c

index c477e7c..9be53ee 100644 (file)
@@ -28,7 +28,7 @@
  * Portions Copyright (c) 2010-2010, PostgreSQL Global Development Group
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/replication/walsender.c,v 1.31 2010/09/14 13:35:14 heikki Exp $
+ *       $PostgreSQL: pgsql/src/backend/replication/walsender.c,v 1.32 2010/09/15 06:51:19 heikki Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -511,15 +511,15 @@ InitWalSnd(void)
                else
                {
                        /*
-                        * Found a free slot. Take ownership of the latch and initialize
-                        * the other fields.
+                        * Found a free slot. Reserve it for us.
                         */
-                       OwnLatch((Latch *) &walsnd->latch);
                        walsnd->pid = MyProcPid;
                        MemSet(&walsnd->sentPtr, 0, sizeof(XLogRecPtr));
-                       /* Set MyWalSnd only after it's fully initialized. */
-                       MyWalSnd = (WalSnd *) walsnd;
                        SpinLockRelease(&walsnd->mutex);
+                       /* don't need the lock anymore */
+                       OwnLatch((Latch *) &walsnd->latch);
+                       MyWalSnd = (WalSnd *) walsnd;
+
                        break;
                }
        }