Fixed segmentation fault during ipc_client library un-initialization
caused when the RemoteEndPoint map destructor was executed before the library destructor.
This commit is contained in:
parent
5862e5062b
commit
572284e80f
@ -58,20 +58,20 @@ int DebugLevel = 0;
|
||||
bool UseSyslog = false;
|
||||
|
||||
// Application Name for logging purposes
|
||||
char unInitialized[] = "Uninitialized";
|
||||
static char unInitialized[] = "Uninitialized";
|
||||
char *pAppName = unInitialized;
|
||||
|
||||
// Application threaded information
|
||||
bool appMultithreaded;
|
||||
static bool appMultithreaded;
|
||||
|
||||
// Client mutex
|
||||
pthread_mutex_t clientMutex;
|
||||
static pthread_mutex_t clientMutex;
|
||||
|
||||
// Mutex for interlocked operations
|
||||
pthread_mutex_t interlockedMutex;
|
||||
|
||||
// Indicators
|
||||
bool svcInitialized = false;
|
||||
static bool svcInitialized = false;
|
||||
|
||||
// Map of open remote endpoints.
|
||||
//
|
||||
@ -83,10 +83,10 @@ bool svcInitialized = false;
|
||||
typedef map<uint32_t, SmartPtr<RemoteEndPoint>*> REPMap;
|
||||
typedef REPMap::iterator REPMapIter;
|
||||
typedef pair<REPMapIter, bool> REPIterBoolPair;
|
||||
REPMap repMap;
|
||||
static REPMap *g_pRepMap = NULL;
|
||||
|
||||
// RemoteEndPoint handle allocator
|
||||
uint32_t remoteEndPointHandleAllocator = 1;
|
||||
static uint32_t remoteEndPointHandleAllocator = 1;
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
@ -159,7 +159,7 @@ IpcClientOpenUnixRemoteEndPoint(
|
||||
{
|
||||
// Insert the new RemoteEndPoint into the REP map
|
||||
REPIterBoolPair insertResult;
|
||||
insertResult = repMap.insert(make_pair(handle, pSmartRemoteEndPoint));
|
||||
insertResult = g_pRepMap->insert(make_pair(handle, pSmartRemoteEndPoint));
|
||||
if (!insertResult.second)
|
||||
{
|
||||
// Insertion failed
|
||||
@ -275,7 +275,7 @@ IpcClientOpenInetRemoteEndPoint(
|
||||
{
|
||||
// Insert the new RemoteEndPoint into the REP map
|
||||
REPIterBoolPair insertResult;
|
||||
insertResult = repMap.insert(make_pair(handle, pSmartRemoteEndPoint));
|
||||
insertResult = g_pRepMap->insert(make_pair(handle, pSmartRemoteEndPoint));
|
||||
if (!insertResult.second)
|
||||
{
|
||||
// Insertion failed
|
||||
@ -352,12 +352,12 @@ IpcClientCloseRemoteEndPoint(
|
||||
|
||||
// Find the appropriate RemoteEndPoint object in the REP Map using
|
||||
// the handle provided by the caller.
|
||||
REPMapIter iter = repMap.find(endPointHandle);
|
||||
if (iter != repMap.end())
|
||||
REPMapIter iter = g_pRepMap->find(endPointHandle);
|
||||
if (iter != g_pRepMap->end())
|
||||
{
|
||||
// Object was found in the map, remove it.
|
||||
SmartRemoteEndPoint *pSmartRemoteEndPoint = iter->second;
|
||||
repMap.erase(iter);
|
||||
g_pRepMap->erase(iter);
|
||||
|
||||
// Release our mutex before deleting the endpoint
|
||||
pthread_mutex_unlock(&clientMutex);
|
||||
@ -452,8 +452,8 @@ IpcClientSubmitReq(
|
||||
|
||||
// Find the appropriate RemoteEndPoint object in the REP Map using
|
||||
// the handle provided by the caller.
|
||||
REPMapIter iter = repMap.find(endPointHandle);
|
||||
if (iter != repMap.end())
|
||||
REPMapIter iter = g_pRepMap->find(endPointHandle);
|
||||
if (iter != g_pRepMap->end())
|
||||
{
|
||||
// Object was found in the map, use it to submit
|
||||
// the request.
|
||||
@ -543,6 +543,7 @@ IpcClientInit(
|
||||
// Verify that we have not been initialized already
|
||||
if (!svcInitialized)
|
||||
{
|
||||
try {
|
||||
// Save a copy of the application name
|
||||
pAppName = new char[strlen(pName) + 1];
|
||||
if (pAppName == NULL)
|
||||
@ -552,6 +553,9 @@ IpcClientInit(
|
||||
}
|
||||
strcpy(pAppName, pName);
|
||||
|
||||
// Create our Remote Endpoint Map
|
||||
g_pRepMap = new REPMap();
|
||||
|
||||
// Save the app multithreaded information
|
||||
appMultithreaded = multithreaded;
|
||||
|
||||
@ -566,6 +570,10 @@ IpcClientInit(
|
||||
// Success
|
||||
svcInitialized = true;
|
||||
retStatus = 0;
|
||||
|
||||
} catch (...) {
|
||||
DbgTrace(0, "IpcClientInit- Exception caught\n", 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -606,11 +614,11 @@ IpcClientShutdown(void)
|
||||
|
||||
// Clean up the REP map
|
||||
pthread_mutex_lock(&clientMutex);
|
||||
while (!repMap.empty())
|
||||
while (!g_pRepMap->empty())
|
||||
{
|
||||
REPMapIter iter = repMap.begin();
|
||||
REPMapIter iter = g_pRepMap->begin();
|
||||
SmartRemoteEndPoint *pSmartRemoteEndPoint = iter->second;
|
||||
repMap.erase(iter);
|
||||
g_pRepMap->erase(iter);
|
||||
pthread_mutex_unlock(&clientMutex);
|
||||
|
||||
delete pSmartRemoteEndPoint;
|
||||
@ -629,6 +637,10 @@ IpcClientShutdown(void)
|
||||
while (numCChannelObjects)
|
||||
sleep(0); // Only suffer a time-slice
|
||||
sleep(0);
|
||||
|
||||
// Delete the Remote Endpoint Map
|
||||
delete(g_pRepMap);
|
||||
g_pRepMap = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user