Beispiel #1
0
        public RPCExecManager.RPCWait AddCalBack(RPCExecManager.FRPCReturnCallBack cb)
        {
            lock (WaitCallBacks)
            {
                var serialId = CurSerialId++;
                RPCExecManager.RPCWait wait;
                if (WaitCallBacks.TryGetValue(serialId, out wait))
                {
                    if (wait.RetCallBack != null && wait.RetCallBack.Method != null)
                    {
                        System.Diagnostics.Debug.WriteLine($"RPCExecManager A CallBack has Timeout:{wait.RetCallBack.Method.DeclaringType.FullName}.{wait.RetCallBack.Method.Name}");
                    }
                    wait.RetCallBack(PkgReader.NullReader, true);
                    wait.RetCallBack = cb;
                }
                else
                {
                    var tempTask = RPCWaitAllocator.QueryObject();
                    tempTask.Wait();
                    wait             = tempTask.Result;
                    wait.SerialId    = serialId;
                    wait.RetCallBack = cb;
                    wait.CallTime    = Support.Time.GetTickCount();
                    WaitCallBacks.Add(wait.SerialId, wait);
                }

                return(wait);
            }
        }
Beispiel #2
0
        private RPCExecManager.RPCWait WaitDoCallImpl(long timeOut, RPCExecManager.FRPCReturnCallBack cb, ERouteTarget route = ERouteTarget.Self, Net.NetConnection conn = null, RPCRouter router = null)
        {
            var Index = this.GetMethodBinder().Index;
            var pkg   = new PkgWriter(this.GetPkgSize());

            if (Index >= RPCExecManager.MaxRPC)
            {
                System.Diagnostics.Debug.WriteLine($"RPC Index is invalid:{this.GetType().FullName}");
                return(null);
            }
            pkg.Write((byte)route);
            if (router != null)
            {
                router.RouteInfo.Save(pkg, route);
            }

            RPCExecManager.RPCWait waiter = null;
            if (cb != null)
            {
                waiter        = RPCExecManager.Insance.AddCalBack(cb);
                this.SerialId = waiter.SerialId;
                pkg.Waiter    = waiter;
                if (timeOut < 0)
                {
                    timeOut = long.MaxValue;
                }
                waiter.Timout = timeOut;
                Index        |= RPCExecManager.WaitFlag;
                pkg.SetHasReturn(true);
                pkg.Write(Index);
                pkg.Write(this.SerialId);
            }
            else
            {
                pkg.SetHasReturn(false);
                pkg.Write(Index);
            }
            WriteObject(pkg);

            if (conn != null)
            {
                pkg.SendBuffer(conn);
            }

            return(waiter);
        }
Beispiel #3
0
        private RPCExecManager.RPCWait WaitDoCallImpl_Hash(long timeOut, RPCExecManager.FRPCReturnCallBack cb, ERouteTarget route = ERouteTarget.Self, Net.NetConnection conn = null, RPCRouter router = null)
        {
            var hash = this.GetMethodBinder().MethordHash;
            var pkg  = new PkgWriter(this.GetPkgSize());

            pkg.SetHashIndex(true);
            pkg.Write((byte)route);
            if (router != null)
            {
                router.RouteInfo.Save(pkg, route);
            }
            RPCExecManager.RPCWait waiter = null;
            if (cb != null)
            {
                pkg.SetHasReturn(true);
                waiter        = RPCExecManager.Insance.AddCalBack(cb);
                this.SerialId = waiter.SerialId;
                pkg.Waiter    = waiter;
                if (timeOut < 0)
                {
                    timeOut = long.MaxValue;
                }
                waiter.Timout = timeOut;
                pkg.Write(hash);
                pkg.Write(this.SerialId);
            }
            else
            {
                pkg.SetHasReturn(false);
                pkg.Write(hash);
            }
            WriteObject(pkg);

            if (conn != null)
            {
                pkg.SendBuffer(conn);
            }

            pkg.Dispose();

            return(waiter);
        }
Beispiel #4
0
        public RPCExecManager.RPCWait S2S_Call <T>(long timeOut, ERouteTarget target = ERouteTarget.Data, FRPCTypeReturnCallBack <T> cb = null) where T : RPCReturnValue, new()
        {
            AssertReturnType(this.GetType(), typeof(T));
            if (cb == null)
            {
                return(WaitDoCallImpl(timeOut, null, ERouteTarget.Self, RPCExecManager.Insance.GetServerConnect(target)));
            }

            RPCExecManager.FRPCReturnCallBack fn = (PkgReader data, bool isTimeOut) =>
            {
                if (isTimeOut)
                {
                    cb(null, true);
                    return;
                }
                T retValue = new T();
                retValue.ReadObject(data);
                cb(retValue, false);
            };
            return(WaitDoCallImpl(timeOut, fn, ERouteTarget.Self, RPCExecManager.Insance.GetServerConnect(target)));
        }
Beispiel #5
0
 public RPCExecManager.RPCWait WaitHashCall <T>(long timeOut, FRPCTypeReturnCallBack <T> cb,
                                                ERouteTarget route     = ERouteTarget.Self,
                                                Net.NetConnection conn = null,
                                                RPCRouter router       = null) where T : RPCReturnValue, new()
 {
     AssertReturnType(this.GetType(), typeof(T));
     if (cb == null)
     {
         return(WaitDoCallImpl_Hash(timeOut, null, route, conn, router));
     }
     RPCExecManager.FRPCReturnCallBack fn = (PkgReader data, bool isTimeOut) =>
     {
         if (isTimeOut)
         {
             cb(null, true);
             return;
         }
         T retValue = new T();
         retValue.ReadObject(data);
         cb(retValue, false);
     };
     return(WaitDoCallImpl_Hash(timeOut, fn, route, conn, router));
 }