コード例 #1
0
ファイル: TAsyncSignalHandler.cpp プロジェクト: Hsin/fbthrift
void TAsyncSignalHandler::registerSignalHandler(int signum) {
  pair<SignalEventMap::iterator, bool> ret =
    signalEvents_.insert(make_pair(signum, event()));
  if (!ret.second) {
    // This signal has already been registered
    throw TLibraryException("handler already registered for signal " +
                            boost::lexical_cast<string>(signum));
  }

  struct event* ev = &(ret.first->second);
  try {
    signal_set(ev, signum, libeventCallback, this);
    if (event_base_set(eventBase_->getLibeventBase(), ev) != 0 ) {
      throw TLibraryException("error initializing event handler for signal " +
                              boost::lexical_cast<string>(signum));
    }

    if (event_add(ev, nullptr) != 0) {
      throw TLibraryException("error adding event handler for signal " +
                              boost::lexical_cast<string>(signum));
    }
  } catch (...) {
    signalEvents_.erase(ret.first);
    throw;
  }
}
コード例 #2
0
ファイル: NetworkUtil.cpp プロジェクト: disigma/fbthrift
void getLocalAddresses(std::vector<folly::SocketAddress>* results) {
    struct ifaddrs* addrs = nullptr;
    if (getifaddrs(&addrs) != 0) {
        throw TLibraryException("getifaddrs() failed", errno);
    }

    try {
        for (struct ifaddrs* cur = addrs; cur != nullptr; cur = cur->ifa_next) {
            folly::SocketAddress addr;
            try {
                addr.setFromSockaddr(cur->ifa_addr);
            } catch (const std::exception& ex) {
                // Most likely an unsupported address family.  Just skip this address.
                continue;
            }

            results->push_back(addr);
        }
    } catch (...) {
        freeifaddrs(addrs);
        throw;
    }

    freeifaddrs(addrs);
}
コード例 #3
0
ファイル: TAsyncSignalHandler.cpp プロジェクト: Hsin/fbthrift
void TAsyncSignalHandler::unregisterSignalHandler(int signum) {
  SignalEventMap::iterator it = signalEvents_.find(signum);
  if (it == signalEvents_.end()) {
    throw TLibraryException("unable to unregister handler for signal " +
                            boost::lexical_cast<string>(signum) +
                            ": signal not registered");
  }

  event_del(&it->second);
  signalEvents_.erase(it);
}
コード例 #4
0
ファイル: PeekProcessor.cpp プロジェクト: Bklyn/fbthrift
void PeekProcessor::setTargetTransport(std::shared_ptr<TTransport> targetTransport) {
  targetTransport_ = targetTransport;
  if (std::dynamic_pointer_cast<TMemoryBuffer>(targetTransport_)) {
    memoryBuffer_ = std::dynamic_pointer_cast<TMemoryBuffer>(targetTransport);
  } else if (std::dynamic_pointer_cast<TPipedTransport>(targetTransport_)) {
    memoryBuffer_ = std::dynamic_pointer_cast<TMemoryBuffer>(std::dynamic_pointer_cast<TPipedTransport>(targetTransport_)->getTargetTransport());
  }

  if (!memoryBuffer_) {
    throw TLibraryException("Target transport must be a TMemoryBuffer or a TPipedTransport with TMemoryBuffer");
  }
}
コード例 #5
0
ファイル: PeekProcessor.cpp プロジェクト: Bklyn/fbthrift
bool PeekProcessor::process(std::shared_ptr<TProtocol> in,
                            std::shared_ptr<TProtocol> out,
                            TConnectionContext* connectionContext) {

  std::string fname;
  TMessageType mtype;
  int32_t seqid;
  in->readMessageBegin(fname, mtype, seqid);

  if (mtype != T_CALL) {
    throw TLibraryException("Unexpected message type");
  }

  // Peek at the name
  peekName(fname);

  TType ftype;
  int16_t fid;
  while (true) {
    in->readFieldBegin(fname, ftype, fid);
    if (ftype == T_STOP) {
      break;
    }

    // Peek at the variable
    peek(in, ftype, fid);
    in->readFieldEnd();
  }
  in->readMessageEnd();
  in->getTransport()->readEnd();

  //
  // All the data is now in memoryBuffer_ and ready to be processed
  //

  // Let's first take a peek at the full data in memory
  uint8_t* buffer;
  uint32_t size;
  memoryBuffer_->getBuffer(&buffer, &size);
  peekBuffer(buffer, size);

  // Done peeking at variables
  peekEnd();

  bool ret = actualProcessor_->process(pipedProtocol_, out, connectionContext);
  memoryBuffer_->resetBuffer();
  return ret;
}