> The following listening worker thread behaves as expected if I insert/delete > rows into/from table "t1" in psql prompt. > > My trouble is when the SQL execution worker thread inserts/ deletes rows > into/from table "t1", the listening worker thread then goes crazy: > PQnotifies() always returns NULL which pushes the listening thread to grab > all CPU power because select() returns immediately in every iteration. The > weird part is that select() says that there is something available but > PQnotifies() returns NULL. > > --------- > PGconn *c=/* Take one connection from connection pool */; > PGresult *result=PQexec(c,"LISTEN NotifyMe"); > PQclear(result); > fd_set InputMask; > int sock=PQsocket(c); > struct timeval TimeOut={1,200000}; > int SelectResult; > PGnotify *notify; > int terminated=0; > while(!terminated){ > FD_ZERO(&InputMask); > FD_SET((unsigned int)sock,&InputMask); > SelectResult=select(sock+1,&InputMask,NULL,NULL,&TimeOut); > if(SelectResult == SOCKET_ERROR){ > puts("select() failed:"); > break; > } > if(SelectResult == 0) > continue; > if(!FD_ISSET(sock,&InputMask)) > continue; > PQconsumeInput(c); > while((notify=PQnotifies(c)) != NULL){ //here: unstable! > if(stricmp(notify->relname,"NotifyMe") == 0) > puts("Got notification"); > PQfreemem(notify); > } > } > PQfinish(c);
Please ignore this question! My connection pool implementation seems to have flaw. Somehow and somewhere the connection acquired by a thread is robbed by other threads. The PGconn sending "LISTEN NotifyMe" becomes different from the PGconn passed to PQsocket(), PQconsumeInput(), and/or PQnotifies(). Please also pardon me for asking inappropriate questions like this one. As far as I can recall, every issue I encountered before always finally proved that PostgreSQL is flawless. Best Regards, CN -- Sent via pgsql-general mailing list (pgsql-general@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-general