From: <ale...@us...> - 2010-06-08 11:41:09
|
Revision: 51228 http://firebird.svn.sourceforge.net/firebird/?rev=51228&view=rev Author: alexpeshkoff Date: 2010-06-08 11:40:58 +0000 (Tue, 08 Jun 2010) Log Message: ----------- repeat commit for CORE-3021 in SVN Modified Paths: -------------- firebird/branches/B2_5_Release/builds/make.new/config/install-sh firebird/branches/B2_5_Release/src/jrd/DatabaseSnapshot.cpp firebird/branches/B2_5_Release/src/jrd/DatabaseSnapshot.h firebird/branches/B2_5_Release/src/jrd/event.cpp firebird/branches/B2_5_Release/src/jrd/event_proto.h firebird/branches/B2_5_Release/src/jrd/isc.h firebird/branches/B2_5_Release/src/jrd/isc_s_proto.h firebird/branches/B2_5_Release/src/jrd/isc_sync.cpp firebird/branches/B2_5_Release/src/jrd/trace/TraceConfigStorage.cpp firebird/branches/B2_5_Release/src/jrd/trace/TraceConfigStorage.h firebird/branches/B2_5_Release/src/jrd/trace/TraceLog.cpp firebird/branches/B2_5_Release/src/jrd/trace/TraceLog.h firebird/branches/B2_5_Release/src/lock/lock.cpp firebird/branches/B2_5_Release/src/lock/lock_proto.h Modified: firebird/branches/B2_5_Release/builds/make.new/config/install-sh =================================================================== --- firebird/branches/B2_5_Release/builds/make.new/config/install-sh 2010-06-06 22:24:10 UTC (rev 51227) +++ firebird/branches/B2_5_Release/builds/make.new/config/install-sh 2010-06-08 11:40:58 UTC (rev 51228) @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2006-12-25.00 +scriptversion=2009-04-28.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -515,5 +515,6 @@ # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" # End: Modified: firebird/branches/B2_5_Release/src/jrd/DatabaseSnapshot.cpp =================================================================== --- firebird/branches/B2_5_Release/src/jrd/DatabaseSnapshot.cpp 2010-06-06 22:24:10 UTC (rev 51227) +++ firebird/branches/B2_5_Release/src/jrd/DatabaseSnapshot.cpp 2010-06-08 11:40:58 UTC (rev 51228) @@ -106,12 +106,7 @@ ISC_remove_map_file(&handle); } -#ifdef WIN_NT - ISC_mutex_fini(&mutex); -#else - ISC_mutex_fini(&base->mutex); -#endif - + ISC_mutex_fini(mutex); ISC_STATUS_ARRAY statusVector; ISC_unmap_file(statusVector, &handle); } @@ -119,11 +114,8 @@ void DatabaseSnapshot::SharedData::acquire() { -#ifdef WIN_NT - checkMutex("lock", ISC_mutex_lock(&mutex)); -#else - checkMutex("lock", ISC_mutex_lock(&base->mutex)); -#endif + checkMutex("lock", ISC_mutex_lock(mutex)); + if (base->allocated > handle.sh_mem_length_mapped) { #if (defined HAVE_MMAP || defined WIN_NT) @@ -142,11 +134,7 @@ void DatabaseSnapshot::SharedData::release() { -#ifdef WIN_NT - checkMutex("unlock", ISC_mutex_unlock(&mutex)); -#else - checkMutex("unlock", ISC_mutex_unlock(&base->mutex)); -#endif + checkMutex("unlock", ISC_mutex_unlock(mutex)); } @@ -314,20 +302,27 @@ fb_assert(shmem); #ifdef WIN_NT - checkMutex("init", ISC_mutex_init(&shmem->mutex, shmemData->sh_mem_name)); + checkMutex("init", ISC_mutex_init(&shmem->winMutex, shmemData->sh_mem_name)); + shmem->mutex = &shmem->winMutex; #endif + Header* const header = (Header*) shmemData->sh_mem_address; + if (!initialize) + { +#ifndef WIN_NT + checkMutex("map", ISC_map_mutex(shmemData, &header->mutex, &shmem->mutex)); +#endif return; + } // Initialize the shared data header - Header* const header = (Header*) shmemData->sh_mem_address; header->version = MONITOR_VERSION; header->used = alignOffset(sizeof(Header)); header->allocated = shmemData->sh_mem_length_mapped; #ifndef WIN_NT - checkMutex("init", ISC_mutex_init(&header->mutex)); + checkMutex("init", ISC_mutex_init(shmemData, &header->mutex, &shmem->mutex)); #endif } Modified: firebird/branches/B2_5_Release/src/jrd/DatabaseSnapshot.h =================================================================== --- firebird/branches/B2_5_Release/src/jrd/DatabaseSnapshot.h 2010-06-06 22:24:10 UTC (rev 51227) +++ firebird/branches/B2_5_Release/src/jrd/DatabaseSnapshot.h 2010-06-08 11:40:58 UTC (rev 51228) @@ -233,8 +233,9 @@ sh_mem handle; #ifdef WIN_NT - struct mtx mutex; + struct mtx winMutex; #endif + struct mtx *mutex; Header* base; const SLONG process_id; Modified: firebird/branches/B2_5_Release/src/jrd/event.cpp =================================================================== --- firebird/branches/B2_5_Release/src/jrd/event.cpp 2010-06-06 22:24:10 UTC (rev 51227) +++ firebird/branches/B2_5_Release/src/jrd/event.cpp 2010-06-08 11:40:58 UTC (rev 51228) @@ -61,7 +61,7 @@ #include <windows.h> #define MUTEX &m_mutex #else -#define MUTEX &m_header->evh_mutex +#define MUTEX m_mutex #endif #define SRQ_BASE ((UCHAR*) m_header) @@ -1114,11 +1114,17 @@ #endif m_sharedFileCreated = initialize; + m_header = (evh*) shmem_data->sh_mem_address; if (!initialize) + { +#ifndef WIN_NT + if ( (mutex_state = ISC_map_mutex(shmem_data, &m_header->evh_mutex, &MUTEX)) ) + mutex_bugcheck("mutex map", mutex_state); +#endif return; + } - m_header = (evh*) shmem_data->sh_mem_address; m_header->evh_length = m_shmemData.sh_mem_length_mapped; m_header->evh_version = EVENT_VERSION; m_header->evh_request_id = 0; @@ -1127,7 +1133,7 @@ SRQ_INIT(m_header->evh_events); #ifndef WIN_NT - if ( (mutex_state = ISC_mutex_init(MUTEX)) ) + if ( (mutex_state = ISC_mutex_init(shmem_data, &m_header->evh_mutex, &MUTEX)) ) mutex_bugcheck("mutex init", mutex_state); #endif Modified: firebird/branches/B2_5_Release/src/jrd/event_proto.h =================================================================== --- firebird/branches/B2_5_Release/src/jrd/event_proto.h 2010-06-06 22:24:10 UTC (rev 51227) +++ firebird/branches/B2_5_Release/src/jrd/event_proto.h 2010-06-08 11:40:58 UTC (rev 51228) @@ -114,6 +114,8 @@ #ifdef WIN_NT struct mtx m_mutex; +#else + struct mtx* m_mutex; #endif bool m_sharedFileCreated; Modified: firebird/branches/B2_5_Release/src/jrd/isc.h =================================================================== --- firebird/branches/B2_5_Release/src/jrd/isc.h 2010-06-06 22:24:10 UTC (rev 51227) +++ firebird/branches/B2_5_Release/src/jrd/isc.h 2010-06-08 11:40:58 UTC (rev 51228) @@ -43,12 +43,6 @@ // Looks like a lot of linux kernels are buggy when working with PRIO_INHERIT mutexes. #undef HAVE_PTHREAD_MUTEXATTR_SETPROTOCOL -#if (SIZEOF_VOID_P < 8) && defined(DEV_BUILD) -// This hack fixes CORE-3021 - segfault in DEV_BUILD. -// Release build does not cause visible problems. -#undef HAVE_PTHREAD_MUTEXATTR_SETROBUST_NP -#endif - #endif //LINUX #ifdef UNIX Modified: firebird/branches/B2_5_Release/src/jrd/isc_s_proto.h =================================================================== --- firebird/branches/B2_5_Release/src/jrd/isc_s_proto.h 2010-06-06 22:24:10 UTC (rev 51227) +++ firebird/branches/B2_5_Release/src/jrd/isc_s_proto.h 2010-06-08 11:40:58 UTC (rev 51228) @@ -45,7 +45,7 @@ #if defined(WIN_NT) int ISC_mutex_init(struct mtx*, const TEXT*); #else -int ISC_mutex_init(struct mtx*); +int ISC_mutex_init(sh_mem* shmem_data, struct mtx* mutex, struct mtx** mapped); #endif int ISC_mutex_lock(struct mtx*); @@ -58,6 +58,9 @@ void ISC_unmap_object(ISC_STATUS*, /*sh_mem*,*/ UCHAR**, ULONG); #endif +int ISC_map_mutex(sh_mem* shmem_data, mtx* mutex, mtx** mapped); +void ISC_unmap_mutex(mtx* mutex); + #ifdef UNIX void ISC_exception_post(ULONG, const TEXT*); void ISC_sync_signals_set(void*); Modified: firebird/branches/B2_5_Release/src/jrd/isc_sync.cpp =================================================================== --- firebird/branches/B2_5_Release/src/jrd/isc_sync.cpp 2010-06-06 22:24:10 UTC (rev 51227) +++ firebird/branches/B2_5_Release/src/jrd/isc_sync.cpp 2010-06-08 11:40:58 UTC (rev 51228) @@ -2219,6 +2219,9 @@ #ifdef HAVE_MMAP + +#define HAVE_MAP_OBJECT 1 + UCHAR* ISC_map_object(ISC_STATUS* status_vector, sh_mem* shmem_data, ULONG object_offset, @@ -2278,7 +2281,6 @@ void ISC_unmap_object(ISC_STATUS* status_vector, - //sh_mem* shmem_data, UCHAR** object_pointer, ULONG object_length) { @@ -2333,6 +2335,9 @@ #ifdef WIN_NT + +#define HAVE_MAP_OBJECT 1 + UCHAR* ISC_map_object(ISC_STATUS* status_vector, sh_mem* shmem_data, ULONG object_offset, @@ -2376,7 +2381,6 @@ void ISC_unmap_object(ISC_STATUS* status_vector, - //sh_mem* shmem_data, UCHAR** object_pointer, ULONG /*object_length*/) { @@ -2409,12 +2413,42 @@ } #endif +int ISC_map_mutex(sh_mem* shmem_data, mtx* mutex, mtx** mapped) +{ +#ifdef HAVE_MAP_OBJECT + ISC_STATUS_ARRAY temp; + mutex = reinterpret_cast<mtx*>(ISC_map_object(temp, shmem_data, + reinterpret_cast<UCHAR*>(mutex) - shmem_data->sh_mem_address, sizeof(mtx))); + if (!mutex) + { + iscLogStatus("ISC_map_mutex()", temp); + return -1; + } +#endif // HAVE_MAP_OBJECT + *mapped = mutex; + return 0; +} + +void ISC_unmap_mutex(mtx* mutex) +{ +#ifdef HAVE_MAP_OBJECT + ISC_STATUS_ARRAY temp; + ISC_unmap_object(temp, reinterpret_cast<UCHAR**>(&mutex), sizeof(mtx)); + if (mutex) + { + iscLogStatus("ISC_unmap_mutex()", temp); + } +#endif // HAVE_MAP_OBJECT + +} + + #ifdef USE_POSIX_THREADS #ifdef USE_SYS5SEMAPHORE -int ISC_mutex_init(struct mtx* mutex) +int ISC_mutex_init(sh_mem* shmem_data, struct mtx* mutex, struct mtx** mapped) { /************************************** * @@ -2426,6 +2460,13 @@ * Initialize a mutex. * **************************************/ + + if (ISC_map_mutex(shmem_data, mutex, mapped) != 0) + { + return -1; // no errno known here... + } + mutex = *mapped; + if (!getSem5(mutex)) { return FB_FAILURE; @@ -2456,7 +2497,7 @@ * Destroy a mutex. * **************************************/ - // no-op for SystemV semaphores + ISC_unmap_mutex(mutex); } @@ -2562,7 +2603,7 @@ static volatile bool staticBugFlag = false; #endif -int ISC_mutex_init(struct mtx* mutex) +int ISC_mutex_init(sh_mem* shmem_data, struct mtx* mutex, struct mtx** mapped) { /************************************** * @@ -2574,6 +2615,13 @@ * Initialize a mutex. * **************************************/ + + if (ISC_map_mutex(shmem_data, mutex, mapped) != 0) + { + return -1; // no errno known here... + } + mutex = *mapped; + #ifdef BUGGY_LINUX_MUTEX do { @@ -2662,7 +2710,7 @@ * Destroy a mutex. * **************************************/ - // no-op for posix threads + ISC_unmap_mutex(mutex); } Modified: firebird/branches/B2_5_Release/src/jrd/trace/TraceConfigStorage.cpp =================================================================== --- firebird/branches/B2_5_Release/src/jrd/trace/TraceConfigStorage.cpp 2010-06-06 22:24:10 UTC (rev 51227) +++ firebird/branches/B2_5_Release/src/jrd/trace/TraceConfigStorage.cpp 2010-06-08 11:40:58 UTC (rev 51228) @@ -179,7 +179,8 @@ fb_assert(storage); #ifdef WIN_NT - checkMutex("init", ISC_mutex_init(&storage->m_mutex, shmemData->sh_mem_name)); + checkMutex("init", ISC_mutex_init(&storage->m_winMutex, shmemData->sh_mem_name)); + storage->m_mutex = &storage->m_winMutex; #endif ShMemHeader* const header = (ShMemHeader*) shmemData->sh_mem_address; @@ -195,7 +196,11 @@ header->touch_time = 0; memset(header->cfg_file_name, 0, sizeof(header->cfg_file_name)); #ifndef WIN_NT - checkMutex("init", ISC_mutex_init(&header->mutex)); + checkMutex("init", ISC_mutex_init(shmemData, &header->mutex, &storage->m_mutex)); + } + else + { + checkMutex("map", ISC_map_mutex(shmemData, &header->mutex, &storage->m_mutex)); #endif } } @@ -344,22 +349,13 @@ void ConfigStorage::acquire() { -#ifdef WIN_NT - checkMutex("lock", ISC_mutex_lock(&m_mutex)); -#else - checkMutex("lock", ISC_mutex_lock(&m_base->mutex)); -#endif + checkMutex("lock", ISC_mutex_lock(m_mutex)); } void ConfigStorage::release() { checkDirty(); - -#ifdef WIN_NT - checkMutex("unlock", ISC_mutex_unlock(&m_mutex)); -#else - checkMutex("unlock", ISC_mutex_unlock(&m_base->mutex)); -#endif + checkMutex("unlock", ISC_mutex_unlock(m_mutex)); } void ConfigStorage::addSession(TraceSession& session) Modified: firebird/branches/B2_5_Release/src/jrd/trace/TraceConfigStorage.h =================================================================== --- firebird/branches/B2_5_Release/src/jrd/trace/TraceConfigStorage.h 2010-06-06 22:24:10 UTC (rev 51227) +++ firebird/branches/B2_5_Release/src/jrd/trace/TraceConfigStorage.h 2010-06-08 11:40:58 UTC (rev 51228) @@ -122,8 +122,9 @@ sh_mem m_handle; ShMemHeader* m_base; #ifdef WIN_NT - struct mtx m_mutex; + struct mtx m_winMutex; #endif + struct mtx* m_mutex; int m_cfg_file; bool m_dirty; Firebird::Semaphore m_touchStartSem; Modified: firebird/branches/B2_5_Release/src/jrd/trace/TraceLog.cpp =================================================================== --- firebird/branches/B2_5_Release/src/jrd/trace/TraceLog.cpp 2010-06-06 22:24:10 UTC (rev 51227) +++ firebird/branches/B2_5_Release/src/jrd/trace/TraceLog.cpp 2010-06-08 11:40:58 UTC (rev 51228) @@ -245,7 +245,8 @@ TraceLog* log = (TraceLog*) arg; #ifdef WIN_NT - checkMutex("init", ISC_mutex_init(&log->m_mutex, shmemData->sh_mem_name)); + checkMutex("init", ISC_mutex_init(&log->m_winMutex, shmemData->sh_mem_name)); + log->m_mutex = &log->m_winMutex; #endif ShMemHeader* const header = (ShMemHeader*) shmemData->sh_mem_address; @@ -256,27 +257,23 @@ header->readFileNum = 0; header->writeFileNum = 0; #ifndef WIN_NT - checkMutex("init", ISC_mutex_init(&header->mutex)); + checkMutex("init", ISC_mutex_init(shmemData, &header->mutex, &log->m_mutex)); + } + else + { + checkMutex("map", ISC_map_mutex(shmemData, &header->mutex, &log->m_mutex)); #endif } } void TraceLog::lock() { -#ifdef WIN_NT - checkMutex("lock", ISC_mutex_lock(&m_mutex)); -#else - checkMutex("lock", ISC_mutex_lock(&m_base->mutex)); -#endif + checkMutex("lock", ISC_mutex_lock(m_mutex)); } void TraceLog::unlock() { -#ifdef WIN_NT - checkMutex("unlock", ISC_mutex_unlock(&m_mutex)); -#else - checkMutex("unlock", ISC_mutex_unlock(&m_base->mutex)); -#endif + checkMutex("unlock", ISC_mutex_unlock(m_mutex)); } } // namespace Jrd Modified: firebird/branches/B2_5_Release/src/jrd/trace/TraceLog.h =================================================================== --- firebird/branches/B2_5_Release/src/jrd/trace/TraceLog.h 2010-06-06 22:24:10 UTC (rev 51227) +++ firebird/branches/B2_5_Release/src/jrd/trace/TraceLog.h 2010-06-08 11:40:58 UTC (rev 51228) @@ -67,8 +67,9 @@ sh_mem m_handle; ShMemHeader* m_base; #ifdef WIN_NT - struct mtx m_mutex; + struct mtx m_winMutex; #endif + struct mtx* m_mutex; Firebird::PathName m_baseFileName; unsigned int m_fileNum; Modified: firebird/branches/B2_5_Release/src/lock/lock.cpp =================================================================== --- firebird/branches/B2_5_Release/src/lock/lock.cpp 2010-06-06 22:24:10 UTC (rev 51227) +++ firebird/branches/B2_5_Release/src/lock/lock.cpp 2010-06-08 11:40:58 UTC (rev 51228) @@ -97,7 +97,7 @@ #include <process.h> #define MUTEX &m_shmemMutex #else -#define MUTEX &m_header->lhb_mutex +#define MUTEX m_lhb_mutex #endif #ifdef DEV_BUILD @@ -2317,6 +2317,7 @@ * to have an exclusive lock on the lock file. * **************************************/ + #ifdef WIN_NT if (ISC_mutex_init(MUTEX, shmem_data->sh_mem_name)) { bug(NULL, "mutex init failed"); @@ -2336,6 +2337,11 @@ #endif if (!initializeMemory) { +#ifndef WIN_NT + if (ISC_map_mutex(shmem_data, &m_header->lhb_mutex, &(MUTEX))) { + bug(NULL, "mutex map failed"); + } +#endif return; } @@ -2354,7 +2360,7 @@ SRQ_INIT(m_header->lhb_free_requests); #ifndef WIN_NT - if (ISC_mutex_init(MUTEX)) { + if (ISC_mutex_init(shmem_data, &m_header->lhb_mutex, &(MUTEX))) { bug(NULL, "mutex init failed"); } #endif Modified: firebird/branches/B2_5_Release/src/lock/lock_proto.h =================================================================== --- firebird/branches/B2_5_Release/src/lock/lock_proto.h 2010-06-06 22:24:10 UTC (rev 51227) +++ firebird/branches/B2_5_Release/src/lock/lock_proto.h 2010-06-08 11:40:58 UTC (rev 51228) @@ -438,6 +438,8 @@ #ifdef WIN_NT struct mtx m_shmemMutex; +#else + struct mtx* m_lhb_mutex; #endif #ifdef USE_SHMEM_EXT This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |