From 05b0859e1f595b06a84542f8e5eb67723cefa549 Mon Sep 17 00:00:00 2001
From: "Stephen R. van den Berg" <srb@cuci.nl>
Date: Tue, 25 Nov 2014 13:41:39 +0100
Subject: [PATCH] pgsql: Using howmuch with a sizeof compare of the Buffer does
 not work.

howmuch is the amount we need extra.  It does not relate to the amount
already in the Buffer.  To prevent a race/deadlock we need extra
signaling.
---
 lib/modules/Sql.pmod/pgsql_util.pmod | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/lib/modules/Sql.pmod/pgsql_util.pmod b/lib/modules/Sql.pmod/pgsql_util.pmod
index e9f51da5f1..40881aa5fc 100644
--- a/lib/modules/Sql.pmod/pgsql_util.pmod
+++ b/lib/modules/Sql.pmod/pgsql_util.pmod
@@ -165,6 +165,7 @@ class conxiin {
   final Thread.Mutex fillreadmux;
   final function(:void) gottimeout;
   final int timeout;
+  private int didreadcb;
 
   protected bool range_error(int howmuch) {
 #ifdef PG_DEBUG
@@ -174,8 +175,9 @@ class conxiin {
     if(fillread) {
       array cid=callout(gottimeout,timeout);
       Thread.MutexKey lock=fillreadmux->lock();
-      if(howmuch>sizeof(this))
+      if(!didreadcb)
         fillread.wait(lock);
+      didreadcb=0;
       lock=0;
       local_backend->remove_call_out(cid);
     } else
@@ -186,7 +188,7 @@ class conxiin {
   final int read_cb(mixed id,mixed b) {
     Thread.MutexKey lock=fillreadmux->lock();
     if(fillread)
-      fillread.signal();
+      didreadcb=1, fillread.signal();
     lock=0;
     return 0;
   }
-- 
GitLab