Skip site navigation (1) Skip section navigation (2)

Threading crash using ODBC

From: markw <markw(at)mohawksoft(dot)com>
To: pgsql-odbc(at)postgresql(dot)org
Subject: Threading crash using ODBC
Date: 2002-11-15 16:21:58
Message-ID: 3DD51F26.7050201@mohawksoft.com (view raw or flat)
Thread:
Lists: pgsql-odbc
Here's what  I have:

I have an application with 1 main thread and a number of worker threads.
At startup, I allocate a number of ODBC connections.
I have an internal queue that is protected by a mutex.
When one of the worker threads wants to use the database, it gets an un 
occupied SQL connection from the queue.

At startup, I can execte a query just fine. When I try to execute a 
query from one of the worker threads, I get a core dump.

I am using UNIX ODBC and the PostgreSQL driver, as shipped with RedHat 7.3.

The stack trace looks like this:

0  0x402fba4c in CC_send_query () from /usr/lib/libodbcpsql.so
(gdb) where
#0  0x402fba4c in CC_send_query () from /usr/lib/libodbcpsql.so
#1  0x40314842 in SC_execute () from /usr/lib/libodbcpsql.so
#2  0x40304c45 in PG_SQLExecute () from /usr/lib/libodbcpsql.so
#3  0x40304c6b in SQLExecute () from /usr/lib/libodbcpsql.so
#4  0x402a13f4 in SQLExecute () from /usr/lib/libodbc.so.1
#5  0x40023d6f in MSqlODBC::ExecResult (this=0x806bfd4,
    sql=0x4037f83c "select value, timeout from msession_sessions where 
session = '2b7atuahma6u9igcorr7c6q8ld7ne86o'") at modbcsql.cpp:360


The ExecResult function looks like this:

SQLRESULT MSqlODBC::ExecResult(char *sql)
{
        TRACE_FUNCT("ExecResult");
        unsigned long err;
        HSTMT hstmt;

        TRACE_STR(sql);

        err = SQLAllocStmt(m_hdbc, &hstmt);

        if(err != SQL_SUCCESS)
        {
                fprintf(stderr, "Could not get Stmt\n");
                return NULL;
        }

        err = SQLPrepare(hstmt, (SQLCHAR *)sql, SQL_NTS);

        if(err != SQL_SUCCESS)
        {
                fprintf(stderr, "Could not Prepare Statement [%s]\n", sql);
                return NULL;
        }

        err = SQLExecute(hstmt);

        if(err != SQL_SUCCESS)
        {
                fprintf(stderr, "Could not ExecDirect\n");
                SQLFreeStmt(hstmt, SQL_DROP);
                hstmt = NULL;
        }
        return (SQLRESULT)build_result(hstmt);
}



Responses

pgsql-odbc by date

Next:From: Bo┼╝ena PotempaDate: 2002-11-15 16:24:43
Subject: PostgreSQL+ Beta bug?
Previous:From: Mihai GheorghiuDate: 2002-11-14 18:39:47
Subject: Error when accessing from MSAccess95

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group