[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 メーリングリストの案内