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