public IMessage SyncProcessMessage(IMessage msg)
        {
            IMethodCallMessage mcm = (IMethodCallMessage)msg;
            int  timeout           = -1;
            bool timedOut          = false;

            RemotingService.CallbackData data = RemotingService.GetCallbackData(mcm.Uri, mcm.MethodName);
            if (data != null)
            {
                timeout = data.Timeout;
                if (data.Calling != null)
                {
                    IMessage r = data.Calling(data.Target, mcm);
                    if (r != null)
                    {
                        return(r);
                    }
                }
            }

            IMessage res = null;

            if (timeout != -1)
            {
                ManualResetEvent ev = new ManualResetEvent(false);
                ThreadPool.QueueUserWorkItem(delegate {
                    res = ((IMessageSink)nextSink).SyncProcessMessage(msg);
                    ev.Set();
                });
                if (!ev.WaitOne(timeout, false))
                {
                    timedOut = true;
                    res      = new ReturnMessage(null, null, 0, mcm.LogicalCallContext, mcm);
                }
            }
            else
            {
                res = ((IMessageSink)nextSink).SyncProcessMessage(msg);
            }

            if (data != null && data.Called != null)
            {
                IMessage cr = data.Called(data.Target, mcm, res as IMethodReturnMessage, timedOut);
                if (cr != null)
                {
                    res = cr;
                }
            }

            return(res);
        }