HI,  igaztanaga
I don't use any of experimental detail classes like("emulation_recursive_mutex").
I'm using wmanaged_windows_shared_memory::find method to find a element, and find method eventually
will call emulation_recursive_mutex::lock. The stack cannot see find due to compile optimization.

The code is like this:

namespace BOOSTIP = ::boost::interprocess;

typedef struct _CACHE_ITEM
{
    BOOSTIP::offset_ptr<BYTE>   CacheValue;
    ULONG                       CacheLength;
    ULONG                       CacheMaxLength;
    volatile BOOL               CacheDirty;

    _CACHE_ITEM()
    {
        CacheValue = 0;
        CacheLength = 0;
        CacheMaxLength = 0;
        CacheDirty = FALSE;
    }

} CACHE_ITEM, *PCACHE_ITEM;


BOOL
CConfigCache::Read(__in LPCTSTR lpszName,
                   __out PVOID lpValue,
                   __in DWORD dwSize,
                   __out_opt PDWORD dwRetSize /*= NULL */)
{
    try
    {
        if (CanIAccessCache())
        {
            CScopeGuard<CMutex> guard(m_FunctionLock);

            //
            //  ....... ignore some useless code
            //

            PCACHE_ITEM CacheItem = m_SharedMemory.find<CACHE_ITEM>(lpszName).first;

            if (CacheItem)
            {
                if (dwSize >= CacheItem->CacheLength)
                {
                    if (dwRetSize)
                        *dwRetSize = CacheItem->CacheLength;

                    if (lpValue && CacheItem->CacheLength && CacheItem->CacheValue)
                    {
                        CopyMemory(lpValue, CacheItem->CacheValue.get(), CacheItem->CacheLength);
                        return DecryptBuffer((LPBYTE)lpValue, CacheItem->CacheLength);
                    }
                    else
                    {
                        return TRUE;
                    }
                }
                else if (dwRetSize)
                {
                    *dwRetSize = CacheItem->CacheLength;
                    return TRUE;
                }
                else
                {
                    return FALSE;
                }
            }
            else
            {
                ++m_ReadConfigCacheMissCount;
            }
        }

        return FALSE;
    }
    catch (BOOSTIP::interprocess_exception &)
    {
        EXCEPTION_OUT("CConfigCache::Read interprocess_exception\n");
        MakeCacheInvalid();
        return FALSE;
    }
    catch (CConfigCacheBaseException &)
    {
        EXCEPTION_OUT("CConfigCache::Read CConfigCacheBaseException\n");
        MakeCacheInvalid();
        return FALSE;
    }
}

Program random crash at :

PCACHE_ITEM CacheItem = m_SharedMemory.find<CACHE_ITEM>(lpszName).first;

I don't know why?


2011/11/3 <igaztanaga@gmail.com>
El 02/11/2011 8:00, nevergone . escribió:

Hello,

I'm using boost::interprocess to share config information between
processes on windows platform. It random crash on custom pc.
I only have a minidump dump, here is the stack output by windbg:

It's hard to say, but using experimental detail classes ("emulation_recursive_mutex") is not supported. They are ongoin experiments.

Ion
_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users