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");
}
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