Пример #1
0
gboolean
RpcChannel_Start(RpcChannel *chan)
{
   gboolean ok;
   const RpcChannelFuncs *funcs;

   if (chan == NULL || chan->funcs == NULL || chan->funcs->start == NULL) {
      return FALSE;
   }

   if (chan->outStarted) {
      /* Already started. Make sure both channels are in sync and return. */
      ASSERT(chan->in == NULL || chan->inStarted);
      return TRUE;
   }

   if (chan->in != NULL && !chan->inStarted) {
      ok = RpcIn_start(chan->in, RPCIN_MAX_DELAY, RpcChannel_Error, chan);
      chan->inStarted = ok;
   }

   funcs = chan->funcs;
   ok = funcs->start(chan);

   if (!ok && funcs->onStartErr != NULL) {
      Debug(LGPFX "Fallback to backdoor ...\n");
      funcs->onStartErr(chan);
      ok = BackdoorChannel_Fallback(chan);
   }

   return ok;
}
Пример #2
0
static gboolean
RpcInStart(RpcChannel *chan)
{
   gboolean ret = TRUE;
   BackdoorChannel *bdoor = chan->_private;

   if (bdoor->outStarted) {
      /* Already started. Make sure both channels are in sync and return. */
      ASSERT(bdoor->in == NULL || bdoor->inStarted);
      return ret;
   } else {
      ASSERT(bdoor->in == NULL || !bdoor->inStarted);
   }

   if (bdoor->in != NULL) {
      ret = RpcIn_start(bdoor->in, RPCIN_MAX_DELAY, RpcChannel_Error, chan);
   }
   if (ret) {
      ret = RpcOut_start(bdoor->out);
      if (!ret) {
         RpcIn_stop(bdoor->in);
      }
   }
   bdoor->inStarted = (bdoor->in != NULL);
   bdoor->outStarted = TRUE;
   return ret;
}