[pgsql-jp: 37948] libpqがスレッドセーフかを調べる
河本陽一
komoto.yoichi @ kcc.co.jp
2007年 1月 16日 (火) 14:42:53 JST
こうもとです。
複数スレッドから同時にDBに接続しに行くと、メモリチェッカで異常とな
るので、libpqがスレッドセーフになっているのか状態を知ろうと思ってい
ます。
調べてみると、PQisthreadsafe() でわかるようなのですが、使用してい
るPostgreSQLが7.3なのでこの関数はありませんでした。
7.3でも使用できる、スレッドセーフかどうかのチェック方法はないです
か。
環境は以下のとおりです。
OS : RHEL4
Kernel : 2.4.21-9.EL
DB : PostgreSQL 7.3.15-RH
rpm : rh-postgresql-7.3.15-2
ちなみに、以下のコードと実行方法で異常となりました。
-------------------------------------------------------------
#include <libpq-fe.h>
#include <pthread.h>
#define THCNT 10
void *fDb(void *vpTmp)
{
PGconn *pPgConn = PQconnectdb("dbname=mmgt");
PQfinish(pPgConn);
}
int main(void)
{
int i;
pthread_t sTh[THCNT];
for(i = 0; i < THCNT; i++){
pthread_create(&sTh[i], NULL, fDb, NULL);
}
for(i = 0; i < THCNT; i++){
pthread_join(sTh[i], NULL);
}
}
-------------------------------------------------------------
$ cc thtest.c -lpq -pthread
$ valgrind --version
valgrind-3.2.1
$ valgrind --leak-check=full ./a.out
<省略>
==11376== 5,109 (252 direct, 4,857 indirect) bytes in 3 blocks are definitely lost in loss record 11 of 14
==11376== at 0x401A6EE: malloc (vg_replace_malloc.c:149)
==11376== by 0x42F4E2A: (within /usr/kerberos/lib/libkrb5.so.3.1)
==11376== by 0x42F4DC8: krb5_init_context (in /usr/kerberos/lib/libkrb5.so.3.1)
==11376== by 0x4036DAD: (within /usr/lib/libpq.so.3.0)
==11376== by 0x4036F6E: (within /usr/lib/libpq.so.3.0)
==11376== by 0x403772A: fe_getauthname (in /usr/lib/libpq.so.3.0)
==11376== by 0x4039CEE: (within /usr/lib/libpq.so.3.0)
==11376== by 0x40377C9: PQconnectStart (in /usr/lib/libpq.so.3.0)
==11376== by 0x4037761: PQconnectdb (in /usr/lib/libpq.so.3.0)
==11376== by 0x804856A: fDb (in /opt/MMGT_TOOL/src/a.out)
==11376== by 0x404CDAB: start_thread (in /lib/tls/libpthread-0.60.so)
==11376== by 0x4133A89: clone (in /lib/tls/libc-2.3.2.so)
==11376==
==11376== LEAK SUMMARY:
==11376== definitely lost: 288 bytes in 6 blocks.
==11376== indirectly lost: 4,965 bytes in 237 blocks.
==11376== possibly lost: 204 bytes in 3 blocks.
==11376== still reachable: 46 bytes in 1 blocks.
==11376== suppressed: 0 bytes in 0 blocks.
==11376== Reachable blocks (those to which a pointer was found) are not shown.
==11376== To see them, rerun with: --show-reachable=yes
======================================================================
河本陽一(こうもとよういち)
mailto:komoto.yoichi @ kcc.co.jp
pgsql-jp メーリングリストの案内