IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 7626


Ignore:
Timestamp:
Jun 21, 2006, 2:36:22 PM (20 years ago)
Author:
Paul Price
Message:

Applying patch from Josh: patch to make psdb thread safe.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/db/psDB.c

    r7617 r7626  
    1212 *  @author Joshua Hoblitt
    1313 *
    14  *  @version $Revision: 1.59 $ $Name: not supported by cvs2svn $
    15  *  @date $Date: 2006-06-21 21:40:12 $
     14 *  @version $Revision: 1.60 $ $Name: not supported by cvs2svn $
     15 *  @date $Date: 2006-06-22 00:36:22 $
    1616 *
    1717 *  Copyright 2005 Joshua Hoblitt, University of Hawaii
     
    3737#include "psErrorText.h"
    3838
     39// set the pointer to NULL if we are actually freeing the memory
     40#define PSDB_NULL_FREE(ptr) \
     41if (psMemGetRefCounter(ptr) == 1) { \
     42    psFree(ptr); \
     43    ptr = NULL; \
     44} else { \
     45    psFree(ptr); \
     46}
     47
    3948typedef struct
    4049{
     
    4453mysqlType;
    4554
    46 //static pthread_mutex_t lookupTableMutex = PTHREAD_MUTEX_INITIALIZER;
     55static pthread_mutex_t lookupTableMutex = PTHREAD_MUTEX_INITIALIZER;
    4756static psHash   *pTypeToSQLlookupTable = NULL;
    4857static psHash   *sqlToPTypeLookupTable = NULL;
     
    7180static mysqlType *psDBPTypeToMySQL(psElemType pType);
    7281
    73 static psHash  *psDBGetPTypeToSQLTable(void);
     82static psHash  *psDBPTypeToSQLTableSetup(void);
     83static psHash  *psDBPTypeToSQLTableGet(void);
    7484static void     psDBPTypeToSQLTableCleanup(void);
    7585
    76 static psHash  *psDBGetSQLToPTypeTable(void);
     86static psHash  *psDBSQLToPTypeTableSetup(void);
     87static psHash  *psDBSQLToPTypeTableGet(void);
    7788static void     psDBSQLToPTypeTableCleanup(void);
    7889
    79 static psHash  *psDBGetMySQLToSQLTable(void);
     90static psHash  *psDBMySQLToSQLTableSetup(void);
     91static psHash  *psDBMySQLToSQLTableGet(void);
    8092static void     psDBMySQLToSQLTableCleanup(void);
    8193
    82 static psHash  *psDBGetPTypeToMySQLTable(void);
     94static psHash  *psDBPTypeToMySQLTableSetup(void);
     95static psHash  *psDBPTypeToMySQLTableGet(void);
    8396static void     psDBPTypeToMySQLTableCleanup(void);
    8497
     
    136149    }
    137150
     151    if (psMemGetThreadSafety()) {
     152        pthread_mutex_lock(&lookupTableMutex);
     153
     154        psDBPTypeToSQLTableSetup();
     155        psDBSQLToPTypeTableSetup();
     156        psDBMySQLToSQLTableSetup();
     157        psDBPTypeToMySQLTableSetup();
     158
     159        pthread_mutex_unlock(&lookupTableMutex);
     160    } else {
     161        psDBPTypeToSQLTableSetup();
     162        psDBSQLToPTypeTableSetup();
     163        psDBMySQLToSQLTableSetup();
     164        psDBPTypeToMySQLTableSetup();
     165    }
     166
    138167    return dbh;
    139168}
     
    142171{
    143172    // Check if argument dbh is NULL
    144     if(dbh == NULL) {
     173    if(!dbh) {
    145174        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
    146175                PS_ERRORTEXT_psDB_INVALID_PSDB);
     176        return;
     177    }
     178
     179    // Attempt to close specified database connection
     180    mysql_close(dbh->mysql);
     181    psFree(dbh);
     182
     183    // ASC WARNING NOTE: the psDBSQLToPTypeTableCleanup cleanup routine
     184    // needs to be called first because it refers to
     185    // psDBPTypeToSQLTableGet ...
     186    //
     187    // The *cleanup functions should be thread safe as they just call psFree()
     188    // but we don't want to be cleaning up & setting up at the same time
     189    if (psMemGetThreadSafety()) {
     190        pthread_mutex_lock(&lookupTableMutex);
     191
     192        psDBSQLToPTypeTableCleanup();
     193        psDBMySQLToSQLTableCleanup();
     194        psDBPTypeToSQLTableCleanup();
     195        psDBPTypeToMySQLTableCleanup();
     196
     197        pthread_mutex_unlock(&lookupTableMutex);
    147198    } else {
    148 
    149         // Attempt to close specified database connection
    150         mysql_close(dbh->mysql);
    151         dbh->mysql = NULL;
    152         psFree(dbh);
    153 
    154         // ASC WARNING NOTE: the psDBSQLToPTypeTableCleanup cleanup routine
    155         // needs to be called first because it refers to
    156         // psDBGetPTypeToSQLTable ...
    157199        psDBSQLToPTypeTableCleanup();
    158200        psDBMySQLToSQLTableCleanup();
     
    15481590    psU32           pType;              // psElemType of a field
    15491591
    1550     mysqlToSQLTable = psDBGetMySQLToSQLTable();
     1592    mysqlToSQLTable = psDBMySQLToSQLTableGet();
    15511593
    15521594    // lookup MySQL column type
     
    15541596    sqlType = psHashLookup(mysqlToSQLTable, key);
    15551597    psFree(key);
    1556     psFree(mysqlToSQLTable);
    15571598
    15581599    if (!sqlType) {
     
    15721613
    15731614    // convert MySQL type to PS type
    1574     sqlToPSTable = psDBGetSQLToPTypeTable();
     1615    sqlToPSTable = psDBSQLToPTypeTableGet();
    15751616    value = psHashLookup(sqlToPSTable, sqlType);
    1576     psFree(sqlToPSTable);
    15771617
    15781618    if (!value) {
     
    15931633    char            *sqlType;             // hash tmp value
    15941634
    1595     pTypeToSQLTable = psDBGetPTypeToSQLTable();
     1635    pTypeToSQLTable = psDBPTypeToSQLTableGet();
    15961636
    15971637    key = psDBIntToString((psU64)pType);
    15981638    sqlType = psHashLookup(pTypeToSQLTable, key);
    15991639    psFree(key);
    1600     psFree(pTypeToSQLTable);
    16011640
    16021641    if (!sqlType) {
     
    16171656    mysqlType       *mType;             // mysqlType struct to return
    16181657
    1619     pTypeToMySQLTable = psDBGetPTypeToMySQLTable();
     1658    pTypeToMySQLTable = psDBPTypeToMySQLTableGet();
    16201659
    16211660    key = psDBIntToString((psU64)pType);
    16221661    mType = psHashLookup(pTypeToMySQLTable, key);
    16231662    psFree(key);
    1624     psFree(pTypeToMySQLTable);
    16251663
    16261664    if (!mType) {
     
    16351673}
    16361674
    1637 static psHash *psDBGetPTypeToSQLTable(void)
    1638 {
    1639 
     1675// PTypeToSQLTable
     1676
     1677static psHash *psDBPTypeToSQLTableSetup(void)
     1678{
    16401679    if (!pTypeToSQLlookupTable) {
    16411680        pTypeToSQLlookupTable = psHashAlloc(14);
     
    16561695        psDBAddToLookupTable(pTypeToSQLlookupTable, PS_TYPE_BOOL,"TINYINT");
    16571696        psDBAddToLookupTable(pTypeToSQLlookupTable, PS_DATA_STRING, "VARCHAR");
    1658     }
    1659 
    1660     // simulate true ref counting
    1661     psMemIncrRefCounter(pTypeToSQLlookupTable);
     1697    } else {
     1698        // increment the ref count by one for every psDB
     1699        psMemIncrRefCounter(pTypeToSQLlookupTable);
     1700    }
    16621701
    16631702    return pTypeToSQLlookupTable;
    16641703}
    16651704
     1705static psHash *psDBPTypeToSQLTableGet(void)
     1706{
     1707    return pTypeToSQLlookupTable;
     1708}
     1709
    16661710static void psDBPTypeToSQLTableCleanup(void)
    16671711{
    1668     psFree(pTypeToSQLlookupTable);
    1669 }
    1670 
    1671 static psHash *psDBGetSQLToPTypeTable(void)
     1712    PSDB_NULL_FREE(pTypeToSQLlookupTable);
     1713}
     1714
     1715
     1716// SQLToPTypeTable
     1717
     1718static psHash *psDBSQLToPTypeTableSetup(void)
    16721719{
    16731720    psHash          *psToSQLTable;
     
    16791726    if (!sqlToPTypeLookupTable) {
    16801727        // invert the PSToSQL table
    1681         psToSQLTable = psDBGetPTypeToSQLTable();
     1728        psToSQLTable = psDBPTypeToSQLTableGet();
    16821729        sqlToPTypeLookupTable = psHashAlloc(psToSQLTable->n);
    16831730
     
    17051752        psFree(list);
    17061753        psFree(psToSQLTable);
    1707     }
    1708 
    1709     // simulate true ref counting
    1710     psMemIncrRefCounter(sqlToPTypeLookupTable);
     1754    } else {
     1755        // increment the ref count by one for every psDB
     1756        psMemIncrRefCounter(sqlToPTypeLookupTable);
     1757    }
    17111758
    17121759    return sqlToPTypeLookupTable;
    17131760}
    17141761
     1762static psHash *psDBSQLToPTypeTableGet(void)
     1763{
     1764    return sqlToPTypeLookupTable;
     1765}
     1766
    17151767static void psDBSQLToPTypeTableCleanup(void)
    17161768{
    1717     psFree(sqlToPTypeLookupTable);
    1718 }
    1719 
    1720 static psHash *psDBGetMySQLToSQLTable(void)
     1769    PSDB_NULL_FREE(sqlToPTypeLookupTable);
     1770}
     1771
     1772
     1773// MySQLToSQLTable
     1774
     1775static psHash *psDBMySQLToSQLTableSetup(void)
    17211776{
    17221777    if (!mysqlToSqlLookupTable) {
     
    17431798        psDBAddToLookupTable(mysqlToSqlLookupTable, FIELD_TYPE_NULL,      "NULL-type");
    17441799        psDBAddToLookupTable(mysqlToSqlLookupTable, FIELD_TYPE_CHAR,      "TINYINT");
    1745     }
    1746 
    1747     // simulate true ref counting
    1748     psMemIncrRefCounter(mysqlToSqlLookupTable);
     1800    } else {
     1801        // increment the ref count by one for every psDB
     1802        psMemIncrRefCounter(mysqlToSqlLookupTable);
     1803    }
    17491804
    17501805    return mysqlToSqlLookupTable;
    17511806}
    17521807
     1808static psHash *psDBMySQLToSQLTableGet(void)
     1809{
     1810    return mysqlToSqlLookupTable;
     1811}
     1812
    17531813static void psDBMySQLToSQLTableCleanup(void)
    17541814{
    1755     psFree(mysqlToSqlLookupTable);
    1756 }
    1757 
    1758 static psHash *psDBGetPTypeToMySQLTable(void)
     1815    PSDB_NULL_FREE(mysqlToSqlLookupTable);
     1816}
     1817
     1818
     1819// PTypeToMySQLTable
     1820
     1821static psHash *psDBPTypeToMySQLTableSetup(void)
    17591822{
    17601823    if (!pTypeToMysqlLookupTable) {
     
    17891852        //        psDBAddVoidToLookupTable(pTypeToMysqlLookupTable, PS_DATA_ASTROM, psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
    17901853        psDBAddVoidToLookupTable(pTypeToMysqlLookupTable, PS_DATA_UNKNOWN,psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
    1791     }
    1792 
    1793     // simulate true ref counting
    1794     psMemIncrRefCounter(pTypeToMysqlLookupTable);
     1854    } else {
     1855        // increment the ref count by one for every psDB
     1856        psMemIncrRefCounter(pTypeToMysqlLookupTable);
     1857    }
    17951858
    17961859    return pTypeToMysqlLookupTable;
    17971860}
    17981861
     1862static psHash *psDBPTypeToMySQLTableGet(void)
     1863{
     1864    return pTypeToMysqlLookupTable;
     1865}
     1866
    17991867static void psDBPTypeToMySQLTableCleanup(void)
    18001868{
    1801     psFree(pTypeToMysqlLookupTable);
     1869    PSDB_NULL_FREE(pTypeToMysqlLookupTable);
    18021870}
    18031871
Note: See TracChangeset for help on using the changeset viewer.