From: Alexander P. <ale...@us...> - 2004-08-30 18:11:29
|
Build Version : T2.0.0.8219 Firebird 2.0 UNSTABLE (writeBuildNum.sh,v 1.8221 2004/08/30 18:10:50 alexpeshkoff ) Update of /cvsroot/firebird/firebird2/src/dsql In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20878/dsql Modified Files: alld.cpp dsql.cpp dsql.h Log Message: added (and used in sources) template to change and restore default pool Index: alld.cpp =================================================================== RCS file: /cvsroot/firebird/firebird2/src/dsql/alld.cpp,v retrieving revision 1.28 retrieving revision 1.29 diff -b -U3 -r1.28 -r1.29 --- alld.cpp 16 Aug 2004 12:28:24 -0000 1.28 +++ alld.cpp 30 Aug 2004 18:10:46 -0000 1.29 @@ -105,40 +105,15 @@ DSQL_permanent_pool = DsqlMemoryPool::createPool(); pools = FB_NEW(*DSQL_permanent_pool) Firebird::vector<DsqlMemoryPool*> (10, *DSQL_permanent_pool, dsql_type_vec); - tdsql->setDefaultPool(DSQL_permanent_pool); + // I don't catch why this happens only for !init_flag. Alex. + // tdsql->setDefaultPool(DSQL_permanent_pool); } } -#ifdef NOT_USED_OR_REPLACED -void DsqlMemoryPool::ALLD_push(BLK object, dsql_lls** stack) -{ - tsql* tdsql = DSQL_get_thread_data(); - DsqlMemoryPool* pool = tdsql->getDefaultPool(); - - dsql_lls* node = pool->lls_cache.newBlock(); - node->lls_object = object; - node->lls_next = *stack; - *stack = node; -} - - -BLK DsqlMemoryPool::ALLD_pop(dsql_lls* *stack) -{ - dsql_lls* node = *stack; - *stack = node->lls_next; - BLK object = node->lls_object; - - DsqlMemoryPool* pool = (DsqlMemoryPool*)MemoryPool::blk_pool(node); - pool->lls_cache.returnBlock(node); - - return object; -} -#endif //NOT_USED_OR_REPLACED DsqlMemoryPool* DsqlMemoryPool::createPool() { DsqlMemoryPool* result = (DsqlMemoryPool*)internal_create(sizeof(DsqlMemoryPool)); -// new (&result->lls_cache) BlockCache<class dsql_lls> (*result); if (!DSQL_permanent_pool) return result; @@ -168,7 +143,6 @@ void DsqlMemoryPool::deletePool(DsqlMemoryPool* pool) { -// pool->lls_cache.~BlockCache<class dsql_lls>(); MemoryPool::deletePool(pool); if (pool == DSQL_permanent_pool) Index: dsql.cpp =================================================================== RCS file: /cvsroot/firebird/firebird2/src/dsql/dsql.cpp,v retrieving revision 1.118 retrieving revision 1.119 diff -b -U3 -r1.118 -r1.119 --- dsql.cpp 21 Aug 2004 09:20:06 -0000 1.118 +++ dsql.cpp 30 Aug 2004 18:10:46 -0000 1.119 @@ -436,23 +436,20 @@ FB_API_HANDLE* db_handle, dsql_req** req_handle) { - tsql thd_context; + tsql thd_context(user_status); tsql* tdsql; DSQL_set_thread_data(tdsql, &thd_context); try { - tdsql->tsql_status = user_status; - tdsql->setDefaultPool(0); - init(0); // If we haven't been initialized yet, do it now dsql_dbb* database = init(db_handle); - tdsql->setDefaultPool(DsqlMemoryPool::createPool()); + DsqlContextPoolHolder context(tdsql, DsqlMemoryPool::createPool()); // allocate the request block @@ -509,7 +506,7 @@ USHORT out_msg_length, UCHAR* out_msg) { - tsql thd_context; + tsql thd_context(user_status); tsql* tdsql; ISC_STATUS sing_status; @@ -517,14 +514,11 @@ try { - tdsql->tsql_status = user_status; - tdsql->setDefaultPool(0); - init(0); sing_status = 0; dsql_req* request = *req_handle; - tdsql->setDefaultPool(&request->req_pool); + DsqlContextPoolHolder context(tdsql, &request->req_pool); if ((SSHORT) in_msg_type == -1) { request->req_type = REQ_EMBED_SELECT; @@ -651,19 +645,16 @@ * **************************************/ ISC_STATUS status; - tsql thd_context; + tsql thd_context(user_status); tsql* tdsql; DSQL_set_thread_data(tdsql, &thd_context); try { - tdsql->tsql_status = user_status; - tdsql->setDefaultPool(0); - dsql_dbb* database = init(db_handle); - tdsql->setDefaultPool(DsqlMemoryPool::createPool()); + DsqlContextPoolHolder context(tdsql, DsqlMemoryPool::createPool()); // allocate the request block, then prepare the request @@ -958,20 +949,17 @@ dsql_msg* message; dsql_par* parameter; ISC_STATUS s; - tsql thd_context; + tsql thd_context(user_status); tsql* tdsql; DSQL_set_thread_data(tdsql, &thd_context); try { - tdsql->tsql_status = user_status; - tdsql->setDefaultPool(0); - init(0); dsql_req* request = *req_handle; - tdsql->setDefaultPool(&request->req_pool); + DsqlContextPoolHolder context(tdsql, &request->req_pool); // if the cursor isn't open, we've got a problem @@ -1178,20 +1166,17 @@ USHORT option) { dsql_req* request; - tsql thd_context; + tsql thd_context(user_status); tsql* tdsql; DSQL_set_thread_data(tdsql, &thd_context); try { - tdsql->tsql_status = user_status; - tdsql->setDefaultPool(0); - init(0); request = *req_handle; - tdsql->setDefaultPool(&request->req_pool); + DsqlContextPoolHolder context(tdsql, &request->req_pool); if (option & DSQL_drop) { // Release everything associate with the request. @@ -1244,20 +1229,17 @@ USHORT msg_length, const UCHAR* dsql_msg_buf) { - tsql thd_context; + tsql thd_context(user_status); tsql* tdsql; DSQL_set_thread_data(tdsql, &thd_context); try { - tdsql->tsql_status = user_status; - tdsql->setDefaultPool(0); - init(0); dsql_req* request = *req_handle; - tdsql->setDefaultPool(&request->req_pool); + DsqlContextPoolHolder context(tdsql, &request->req_pool); // if the cursor isn't open, we've got a problem @@ -1332,16 +1314,13 @@ UCHAR* buffer) { ISC_STATUS status; - tsql thd_context; + tsql thd_context(user_status); tsql* tdsql; DSQL_set_thread_data(tdsql, &thd_context); try { - tdsql->tsql_status = user_status; - tdsql->setDefaultPool(0); - init(0); dsql_req* old_request = *req_handle; @@ -1376,7 +1355,7 @@ /* Because that's the client's allocated statement handle and we don't want to trash the context in it -- 2001-Oct-27 Ann Harrison */ - tdsql->setDefaultPool(DsqlMemoryPool::createPool()); + DsqlContextPoolHolder context(tdsql, DsqlMemoryPool::createPool()); dsql_req* request = FB_NEW(*tdsql->getDefaultPool()) dsql_req(*tdsql->getDefaultPool()); request->req_dbb = database; @@ -1440,9 +1419,10 @@ // Now that we know that the new request exists, zap the old one. - tdsql->setDefaultPool(&old_request->req_pool); + { + DsqlContextPoolHolder context(tdsql, &old_request->req_pool); release_request(old_request, true); - tdsql->setDefaultPool(0); + } /* The request was sucessfully prepared, and the old request was * successfully zapped, so set the client's handle to the new request */ @@ -1494,20 +1474,17 @@ const TEXT* input_cursor, USHORT type) { - tsql thd_context; + tsql thd_context(user_status); tsql* tdsql; DSQL_set_thread_data(tdsql, &thd_context); try { - tdsql->tsql_status = user_status; - tdsql->setDefaultPool(0); - init(0); dsql_req* request = *req_handle; - tdsql->setDefaultPool(&request->req_pool); + DsqlContextPoolHolder context(tdsql, &request->req_pool); TEXT cursor[132]; @@ -1604,16 +1581,13 @@ { UCHAR buffer[256], *buffer_ptr; USHORT length, number, first_index; - tsql thd_context; + tsql thd_context(user_status); tsql* tdsql; DSQL_set_thread_data(tdsql, &thd_context); try { - tdsql->tsql_status = user_status; - tdsql->setDefaultPool(0); - init(0); memset(buffer, 0, sizeof(buffer)); @@ -4150,6 +4124,10 @@ { init_flag = true; ALLD_init(); + + // may be someone needs context pool later - + // lets set it correctly here, not in ALLD_init() + DsqlContextPoolHolder context(DSQL_get_thread_data(), DSQL_permanent_pool); HSHD_init(); #ifdef DSQL_DEBUG @@ -4916,13 +4894,12 @@ // If request is parent, orphan the children and // release a portion of their requests - for (dsql_req* child = request->req_offspring; child; child = child->req_sibling) { + for (dsql_req* child = request->req_offspring; child; child = child->req_sibling) + { child->req_flags |= REQ_orphan; child->req_parent = NULL; - DsqlMemoryPool *save_default = tdsql->getDefaultPool(); - tdsql->setDefaultPool(&child->req_pool); + DsqlContextPoolHolder(tdsql, &child->req_pool); release_request(child, false); - tdsql->setDefaultPool(save_default); } // For top level requests that are linked to a parent, unlink it Index: dsql.h =================================================================== RCS file: /cvsroot/firebird/firebird2/src/dsql/dsql.h,v retrieving revision 1.66 retrieving revision 1.67 diff -b -U3 -r1.66 -r1.67 --- dsql.h 27 Aug 2004 04:52:24 -0000 1.66 +++ dsql.h 30 Aug 2004 18:10:46 -0000 1.67 @@ -606,35 +606,45 @@ // DSQL threading declarations -class tsql : public thdd +class tsql : public ThreadData { private: DsqlMemoryPool* tsql_default; -public: - ISC_STATUS* tsql_status; - ISC_STATUS* tsql_user_status; + friend class Firebird::SubsystemContextPoolHolder <tsql, DsqlMemoryPool>; void setDefaultPool(DsqlMemoryPool* p) { - thdd::setPool(p); tsql_default = p; } + +public: + tsql(ISC_STATUS* status) + : ThreadData(tddSQL), tsql_default(0), + tsql_status(status), tsql_user_status(0) + { + } + + ISC_STATUS* tsql_status; + ISC_STATUS* tsql_user_status; + DsqlMemoryPool* getDefaultPool() { return tsql_default; } }; +typedef Firebird::SubsystemContextPoolHolder <tsql, DsqlMemoryPool> + DsqlContextPoolHolder; + inline tsql* DSQL_get_thread_data() { - return (tsql*) thdd::getSpecific(); + return (tsql*) ThreadData::getSpecific(); } inline void DSQL_set_thread_data(tsql* &tdsql, tsql* thd_context) { tdsql = thd_context; - tdsql->thdd_type = THDD_TYPE_TSQL; tdsql->putSpecific(); } inline void DSQL_restore_thread_data() { - thdd::restoreSpecific(); + ThreadData::restoreSpecific(); } /*! \var unsigned DSQL_debug |