Congratulations, you have discovered a bug 
We have also recently discovered this bug, and it is fixed for 2.1.2. The bug only shows up if the server sends two callbacks at the same time, and one of them blocks (for example, because the first callback triggers the second callback and waits for its completion, i.e., nested callbacks).
Code:
namespace Glacier2
{
class AMI_Object_ice_invokeI : public AMI_Object_ice_invoke
{
public:
AMI_Object_ice_invokeI(const AMD_Object_ice_invokePtr& amdCB) :
_amdCB(amdCB)
{
assert(_amdCB);
}
virtual void
ice_response(bool ok, const std::vector<Byte>& outParams)
{
_amdCB->ice_response(ok, outParams);
}
virtual void
ice_exception(const Exception& ex)
{
_amdCB->ice_exception(ex);
}
private:
const AMD_Object_ice_invokePtr _amdCB;
};
}
// ...
void
Glacier2::Request::invoke()
{
if(_proxy->ice_isTwoway())
{
AMI_Object_ice_invokePtr cb = new AMI_Object_ice_invokeI(_amdCB);
if(_forwardContext)
{
_proxy->ice_invoke_async(cb, _current.operation, _current.mode, _inParams, _current.ctx);
}
else
{
_proxy->ice_invoke_async(cb, _current.operation, _current.mode, _inParams);
}
}
else
{
try
{
ByteSeq outParams;
if(_forwardContext)
{
_proxy->ice_invoke(_current.operation, _current.mode, _inParams, outParams, _current.ctx);
}
else
{
_proxy->ice_invoke(_current.operation, _current.mode, _inParams, outParams);
}
}
catch(const LocalException&)
{
}
}
}