pg.ddx.io  pgsql-interfaces@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Philip Yarra <philip@utiba.com>
To: pgsql-interfaces@postgresql.org
Subject: ECPG still having thread problems on Linux
Date: Tue, 24 Jun 2003 18:25:32 +1000
Message-ID: <200306241825.32527.philip@utiba.com> (raw)

Hi all, it looks like Lee's ECPG (and libpq) thread-safety patches
have been applied, and configure --with-threads is also added. I
have been doing some testing.

On FreeBSD 4.8, the attached sample app runs without a problem.

However, I still encounter a threading problem on Linux (RedHat 7.3).

I have done the following:
1) cvs update
2) ./configure --with-threads && make && su -c "make install"
3) compiled cn.pgc as follows:
        a) ecpg -t cn.pgc
        b) gcc -I/usr/local/pgsql/include -L/usr/local/pgsql/lib \
                -lecpg -lpgtypes -pthread cn.c
4) ./a.out - one thread runs to completion (inserts 5 records),
        the other hangs (manages one insert, then blocks forever)

Using gdb, I attached to the thread that has locked up, and the backtrace
looks like this:

(gdb) backtrace
#0  0x420e0187 in poll () from /lib/i686/libc.so.6
#1  0x4007d8cc in pqSocketPoll () from /usr/local/pgsql/lib/libpq.so.3
#2  0x4007d7ed in pqSocketCheck () from /usr/local/pgsql/lib/libpq.so.3
#3  0x4007d71f in pqWaitTimed () from /usr/local/pgsql/lib/libpq.so.3
#4  0x4007d6f5 in pqWait () from /usr/local/pgsql/lib/libpq.so.3
#5  0x4007bb53 in PQgetResult () from /usr/local/pgsql/lib/libpq.so.3
#6  0x4007bcbb in PQexec () from /usr/local/pgsql/lib/libpq.so.3
#7  0x40026d81 in ECPGexecute () from /usr/local/pgsql/lib/libecpg.so.4
#8  0x4002724c in ECPGdo () from /usr/local/pgsql/lib/libecpg.so.4
#9  0x08048927 in ins2 ()
#10 0x40043faf in pthread_start_thread () from /lib/i686/libpthread.so.0

Can anyone shed some light on why the behaviour differs between these two 
platforms? 

Also, perhaps someone other there with access to a different Linux setup 
(maybe a more recent build than RedHat 7.3, or a different distro) could try 
this app themselves to help verify if this is something that's stuffed on 
that release. I think I can rule out this problem being a quirk of my 
particular setup, as 3 different machines (all running RH7.3) give identical 
results.

Build env:
Linux 2.4.18-3
gcc version 2.96 20000731 (Red Hat Linux 7.3 2.96-113)

Regards, Philip Yarra.

Attachments:

cn.pgc (text/x-csrc, 1.4K) download | inline: /* on linux, you can compile with: ecpg cn.pgc&& gcc -I/usr/local/pgsql/include -L/usr/local/pgsql/lib -lpgtypes -lecpg -lpthread cn.c and you'll need this table: CREATE TABLE foo ( message character(40) ); */ #include <pthread.h> int main(); void ins1(); void ins2(); int main() { pthread_t thread1, thread2; pthread_create(&thread1, NULL, (void *) ins1, NULL); pthread_create(&thread2, NULL, (void *) ins2, NULL); pthread_join(thread1, NULL); pthread_join(thread2, NULL); printf("Done!"); return 0; } void ins1() { int i; EXEC SQL BEGIN DECLARE SECTION; char* cs = "test@host"; char* bar = "one!"; EXEC SQL END DECLARE SECTION; EXEC SQL WHENEVER sqlerror sqlprint; EXEC SQL CONNECT TO :cs AS test1; EXEC SQL SET AUTOCOMMIT TO ON; for (i = 0; i < 5; i++) { printf("thread1 inserting\n"); EXEC SQL INSERT INTO foo VALUES(:bar); printf("==>thread1 insert done\n"); } EXEC SQL DISCONNECT test1; printf("done!\n"); } void ins2() { int i; EXEC SQL BEGIN DECLARE SECTION; char* cs = "test@host"; char* bar = "two!"; EXEC SQL END DECLARE SECTION; EXEC SQL WHENEVER sqlerror sqlprint; EXEC SQL CONNECT TO :cs AS test2; EXEC SQL SET AUTOCOMMIT TO ON; for (i = 0; i < 5; i++) { printf("thread2 inserting\n"); EXEC SQL INSERT INTO foo VALUES(:bar); printf("==>thread2 insert done\n"); } EXEC SQL DISCONNECT test2; printf("done!\n"); }

view thread (3+ messages)  latest in thread

Message-ID: <200306241825.32527.philip@utiba.com>
Permalink:  ../200306241825.32527.philip@utiba.com/
Also on:    postgresql.org/message-id/200306241825.32527.philip@utiba.com

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-interfaces@postgresql.org
  Cc: philip@utiba.com
  Subject: Re: ECPG still having thread problems on Linux
  In-Reply-To: <200306241825.32527.philip@utiba.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox