BUG #1569: Threads don't see ecpg default connection
От | Gavin Scott |
---|---|
Тема | BUG #1569: Threads don't see ecpg default connection |
Дата | |
Msg-id | 20050329235622.68440F0CE7@svr2.postgresql.org обсуждение исходный текст |
Ответы |
Re: BUG #1569: Threads don't see ecpg default connection
(Bruce Momjian <pgman@candle.pha.pa.us>)
|
Список | pgsql-bugs |
The following bug has been logged online: Bug reference: 1569 Logged by: Gavin Scott Email address: gavin@ipalsoftware.com PostgreSQL version: 8.0.1 Operating system: Fedora Core 3 Description: Threads don't see ecpg default connection Details: When using postgresql 8.0 compiled with --enable-thread-safety, new threads no longer see the default ecpg connection. That was not the case in 7.4.x compiled with or without --enable-thread-safety. TEST CASE The program at the end of this mail sets up a database table named "dbthreadtest" in the default database. It then spawns 5 threads which each do a select from that table using the default connection. If the program is saved as dbthreadtest.pgc, compile with: ecpg -t -o dbthreadtest.c dbthreadtest.pgc gcc -Wall -o dbthreadtest dbthreadtest.c -lecpg -lpthread Results under 7.4.x / 8.0 without --enable-thread-safety: [gavin@hesse protocol_lib]$ psql --version psql (PostgreSQL) 7.4.7 contains support for command-line editing [gavin@hesse protocol_lib]$ ./dbthreadtest got id = 1 got id = 1 got id = 1 got id = 1 got id = 1 Results under 8.0 with --enable-thread-safety: [gavin@marquez protocol_lib]$ psql --version psql (PostgreSQL) 8.0.1 contains support for command-line editing [gavin@marquez protocol_lib]$ ./dbthreadtest 'No such connection NULL in line 76.', sqlcode = -220 select id TEST PROGRAM /* -*-C-*- */ #include <stdlib.h> #include <pthread.h> #define CHECK_SQL(fmt, args...) \ do \ { \ if (sqlca.sqlcode != ECPG_NO_ERROR) \ { \ fprintf (stderr, "'%s', sqlcode = %ld " fmt "\n", \ sqlca.sqlerrm.sqlerrmc, \ sqlca.sqlcode, ## args); \ exit (1); \ } \ } \ while (0) #define FATAL(fmt, args...) \ do \ { \ fprintf (stderr, fmt "\n", ## args); \ exit (1); \ } \ while (0) pthread_mutex_t global_lock; pthread_t global_threads[5]; void setup_db () { exec sql begin declare section; const char *_user; exec sql end declare section; pthread_mutex_lock (&global_lock); _user = getenv ("LOGNAME"); exec sql connect to :_user; CHECK_SQL ("connect"); exec sql create table dbthreadtest (id int); CHECK_SQL ("create dbthreadtest"); exec sql insert into dbthreadtest (id) values (1); CHECK_SQL ("insert 1"); pthread_mutex_unlock (&global_lock); } void teardown_db () { pthread_mutex_lock (&global_lock); exec sql drop table dbthreadtest; CHECK_SQL ("drop dbthreadtest"); exec sql disconnect; CHECK_SQL ("disconnect"); pthread_mutex_unlock (&global_lock); } void *query_db (void *ignorep) { exec sql begin declare section; int _id; exec sql end declare section; pthread_mutex_lock (&global_lock); exec sql select id into :_id from dbthreadtest; CHECK_SQL ("select id"); fprintf (stdout, "got id = %d\n", _id); pthread_mutex_unlock (&global_lock); return NULL; } int main () { int i; pthread_mutex_init (&global_lock, NULL); setup_db (); for (i = 0; i < sizeof (global_threads) / sizeof (global_threads[0]); ++i) { if (pthread_create (&global_threads[i], NULL, query_db, NULL)) FATAL ("pthread_create %d failed", i); } for (i = 0; i < sizeof (global_threads) / sizeof (global_threads[0]); ++i) { if (pthread_join (global_threads[i], NULL)) FATAL ("pthread_join %d failed", i); } teardown_db (); return 0; }
В списке pgsql-bugs по дате отправления: