From 512d8fbad8978d18664afd7b1c30def327166b74 Mon Sep 17 00:00:00 2001 From: prabatuty Date: Sun, 17 Jun 2007 09:36:20 +0000 Subject: [PATCH] Feature: 1501518 Procmgmt --- src/server/Connection.cxx | 3 +- src/server/DatabaseManagerImpl.cxx | 65 +++++++++++++++++++------------------- src/server/Process.cxx | 12 ++++++- src/server/SessionImpl.cxx | 16 +++++----- src/sql/Makefile | 16 +++++----- 5 files changed, 60 insertions(+), 52 deletions(-) diff --git a/src/server/Connection.cxx b/src/server/Connection.cxx index 3ada771e..7dd754b4 100644 --- a/src/server/Connection.cxx +++ b/src/server/Connection.cxx @@ -21,10 +21,9 @@ Connection::~Connection() { if (NULL != session) { - session ->rollback(); + session->rollback(); session->close(); } - delete session; session = NULL; Index::destroy(); diff --git a/src/server/DatabaseManagerImpl.cxx b/src/server/DatabaseManagerImpl.cxx index 441243c6..ac4cbabb 100644 --- a/src/server/DatabaseManagerImpl.cxx +++ b/src/server/DatabaseManagerImpl.cxx @@ -207,30 +207,36 @@ DbRetVal DatabaseManagerImpl::openDatabase(const char *name) printError(ErrAlready, "User Database already open"); return ErrAlready; } - //system db should be opened before user database files - caddr_t rtnAddr = (caddr_t) NULL; - - shared_memory_id shm_id = 0; - shared_memory_key key = 0; + caddr_t attAddr; if (0 == strcmp(name, SYSTEMDB)) - key = config.getSysDbKey(); + attAddr = ProcessManager::sysAddr; else - key = config.getUserDbKey(); - shm_id = os::shm_open(key, size, 0666); - if (shm_id == -1 ) + attAddr = ProcessManager::usrAddr; + + if (ProcessManager::noThreads == 0) { - printError(ErrOS, "Shared memory open failed"); - return ErrOS; - } + //system db should be opened before user database files + caddr_t rtnAddr = (caddr_t) NULL; - void *shm_ptr = os::shm_attach(shm_id, startaddr, SHM_RND); + shared_memory_id shm_id = 0; + shared_memory_key key = 0; - rtnAddr = (caddr_t) shm_ptr; + if (0 == strcmp(name, SYSTEMDB)) + key = config.getSysDbKey(); + else + key = config.getUserDbKey(); + shm_id = os::shm_open(key, size, 0666); + if (shm_id == -1 ) + { + printError(ErrOS, "Shared memory open failed"); + return ErrOS; + } - if (rtnAddr < 0 || shm_ptr == (char*)0xffffffff) - { - //check if is the first thread to be registered. - if ( NULL == csqlProcInfo.sysDbAttachAddr) + void *shm_ptr = os::shm_attach(shm_id, startaddr, SHM_RND); + + rtnAddr = (caddr_t) shm_ptr; + + if (rtnAddr < 0 || shm_ptr == (char*)0xffffffff) { printError(ErrOS, "Shared memory attach returned -ve value %x %d", shm_ptr, errno); return ErrOS; @@ -238,26 +244,21 @@ DbRetVal DatabaseManagerImpl::openDatabase(const char *name) else { db_ = new Database(); - if (0 == strcmp(name, SYSTEMDB)) - db_->setMetaDataPtr((DatabaseMetaData*)csqlProcInfo.sysDbAttachAddr); + db_->setMetaDataPtr((DatabaseMetaData*)rtnAddr); + if (0 == strcmp(name, SYSTEMDB)) + ProcessManager::sysAddr = rtnAddr; else - db_->setMetaDataPtr((DatabaseMetaData*)csqlProcInfo.userDbAttachAddr); + ProcessManager::usrAddr = rtnAddr; + printDebug(DM_Database, "Opening database: %s", name); logFinest(logger, "Opened database %s" , name); return OK; } } - //store it in the global static object. - if (0 == strcmp(name, SYSTEMDB)) - csqlProcInfo.sysDbAttachAddr = rtnAddr; - else - csqlProcInfo.userDbAttachAddr = rtnAddr; - db_ = new Database(); printDebug(DM_Database, "Opening database: %s", name); - db_->setMetaDataPtr((DatabaseMetaData*)rtnAddr); - + db_->setMetaDataPtr((DatabaseMetaData*)attAddr); logFinest(logger, "Opened database %s" , name); return OK; } @@ -272,11 +273,9 @@ DbRetVal DatabaseManagerImpl::closeDatabase() return ErrAlready; } //check if this is the last thread to be deregistered. - if (db_->isLastThread()) + if (ProcessManager::noThreads == 1) { - //os::shm_detach((char*)db_->getMetaDataPtr()); - //csqlProcInfo.sysDbAttachAddr = NULL; - //csqlProcInfo.userDbAttachAddr = NULL; + os::shm_detach((char*)db_->getMetaDataPtr()); } delete db_; db_ = NULL; diff --git a/src/server/Process.cxx b/src/server/Process.cxx index 1b292d47..5d884a35 100644 --- a/src/server/Process.cxx +++ b/src/server/Process.cxx @@ -20,11 +20,16 @@ #include #include - +int ProcessManager::noThreads=0; +caddr_t ProcessManager::sysAddr=0; +caddr_t ProcessManager::usrAddr=0; //It does not check for re registering as well as deregistering unregistered threads. //as it is handled in the connection class open and close methods. DbRetVal ProcessManager::registerThread() { +#ifdef LINUX + noThreads++; +#else DbRetVal rv = systemDatabase->getProcessTableMutex(); if (OK != rv) { @@ -91,10 +96,14 @@ DbRetVal ProcessManager::registerThread() pInfo->numThreads_++; } systemDatabase->releaseProcessTableMutex(); +#endif return OK; } DbRetVal ProcessManager::deregisterThread() { +#ifdef LINUX + noThreads--; +#else DbRetVal rv = systemDatabase->getProcessTableMutex(); if (OK != rv) { @@ -149,6 +158,7 @@ DbRetVal ProcessManager::deregisterThread() if (0 == pInfo->numThreads_) pInfo->pid_ = 0; systemDatabase->releaseProcessTableMutex(); +#endif return OK; } diff --git a/src/server/SessionImpl.cxx b/src/server/SessionImpl.cxx index 90b29da2..42442704 100644 --- a/src/server/SessionImpl.cxx +++ b/src/server/SessionImpl.cxx @@ -128,12 +128,6 @@ DbRetVal SessionImpl::open(const char *username, const char *password) return rv; } - rv = dbMgr->registerThread(); - if (OK != rv) - { - printError(rv,"Unable to register to csql server"); - return rv; - } rv = dbMgr->sysDb()->getDatabaseMutex(); if (OK != rv) @@ -161,6 +155,12 @@ DbRetVal SessionImpl::open(const char *username, const char *password) rv = dbMgr->openDatabase("praba"); if (OK != rv) return rv; + rv = dbMgr->registerThread(); + if (OK != rv) + { + printError(rv,"Unable to register to csql server"); + return rv; + } return OK; } @@ -169,12 +169,12 @@ DbRetVal SessionImpl::close() DbRetVal rv = OK; if (dbMgr) { - rv = dbMgr->deregisterThread(); - if (rv != OK) return ErrBadCall; rv = dbMgr->closeDatabase(); if (rv != OK) return ErrBadCall; rv = dbMgr->closeSystemDatabase(); if (rv != OK) return ErrBadCall; + rv = dbMgr->deregisterThread(); + if (rv != OK) return ErrBadCall; delete dbMgr; dbMgr = NULL; } diff --git a/src/sql/Makefile b/src/sql/Makefile index d1a44e53..e53e2860 100644 --- a/src/sql/Makefile +++ b/src/sql/Makefile @@ -91,14 +91,14 @@ HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = ${SHELL} /home/praba/kishore/csql/missing --run aclocal-1.9 +ACLOCAL = ${SHELL} /home/praba/testbld/csql/missing --run aclocal-1.9 AMDEP_FALSE = # AMDEP_TRUE = -AMTAR = ${SHELL} /home/praba/kishore/csql/missing --run tar +AMTAR = ${SHELL} /home/praba/testbld/csql/missing --run tar AR = ar -AUTOCONF = ${SHELL} /home/praba/kishore/csql/missing --run autoconf -AUTOHEADER = ${SHELL} /home/praba/kishore/csql/missing --run autoheader -AUTOMAKE = ${SHELL} /home/praba/kishore/csql/missing --run automake-1.9 +AUTOCONF = ${SHELL} /home/praba/testbld/csql/missing --run autoconf +AUTOHEADER = ${SHELL} /home/praba/testbld/csql/missing --run autoheader +AUTOMAKE = ${SHELL} /home/praba/testbld/csql/missing --run automake-1.9 AWK = gawk CC = gcc CCDEPMODE = depmode=gcc3 @@ -134,7 +134,7 @@ LIBS = LIBTOOL = $(SHELL) $(top_builddir)/libtool LN_S = ln -s LTLIBOBJS = -MAKEINFO = ${SHELL} /home/praba/kishore/csql/missing --run makeinfo +MAKEINFO = ${SHELL} /home/praba/testbld/csql/missing --run makeinfo OBJEXT = o PACKAGE = csql PACKAGE_BUGREPORT = @@ -181,7 +181,7 @@ host_vendor = pc htmldir = ${docdir} includedir = ${prefix}/include infodir = ${datarootdir}/info -install_sh = /home/praba/kishore/csql/install-sh +install_sh = /home/praba/testbld/csql/install-sh libdir = ${exec_prefix}/lib libexecdir = ${exec_prefix}/libexec localedir = ${datarootdir}/locale @@ -190,7 +190,7 @@ mandir = ${datarootdir}/man mkdir_p = mkdir -p -- oldincludedir = /usr/include pdfdir = ${docdir} -prefix = /home/praba/kishore/csql/install +prefix = /home/praba/testbld/csql/install program_transform_name = s,x,x, psdir = ${docdir} sbindir = ${exec_prefix}/sbin -- 2.11.4.GIT