Hi Bernard,
I've checked our source code, and we never use IceUtil::Mutex, but rather IceUtil::RecMutex. As far as I can tell, we always use recursive mutex.
So, here is the stack trace. It is stopping in the system assert caused by the assert mentioned previously in IceUtil/Mutex.h. Here is the call stack:
- msvcr71d.dll!_assert(const char * expr=0x10119630, const char * filename=0x1011964c, unsigned int lineno=140) Line 306 C
- ice13d.dll!IceUtil::Monitor<IceUtil::Mutex>::lock( ) + 0x92
- ice13d.dll!IceInternal::decRef() + 0xa220
- ice13d.dll!Ice:

perator<() + 0x37c
- ice13d.dll!Ice:

perator<() + 0x5aba
- rwsender.exe!Sender::SenderImpl::~SenderImpl() Line 83 C++
- rwsender.exe!Sender::SenderImpl::`vbase destructor'() + 0xf C++
...
The Sender::SenderImpl::~SenderImpl() contains
{
IceUtil::RecMutex::Lock siLock(*this);
_adapter->remove(_sdiId);
}
The SenderImp class inherits from IceUtil::RecMutex, so when we lock our routines, we just use *this, as shown in the destructor.
So, as mentioned before, if I use the 1.1.0 ICE libraries, all is well. The only real IceUtil::Mutex variables that I can find are those used within the Ice code - as shown above in ice13d.d used in the Monitor.
Any more ideas?
Thanks,
John