Exemplo n.º 1
0
// Form a trace of the async stack starting with the currently running
// generator, if any. For now we just toss in the function name and
// id, as well as the pseudo-frames for context breaks at explicit
// joins. Later we'll add more, like file and line, hopefully function
// args, wait handle status, etc.
static Array createAsyncStacktrace() {
  Array trace;
  auto currentWaitHandle = HHVM_FN(asio_get_running)();
  if (currentWaitHandle.isNull()) return trace;
  Array depStack =
    objToWaitableWaitHandle(currentWaitHandle)->t_getdependencystack();
  for (ArrayIter iter(depStack); iter; ++iter) {
    if (iter.secondRef().isNull()) {
      trace.append(Array(staticEmptyArray()));
    } else {
      auto wh = objToWaitableWaitHandle(iter.secondRef().toObject());
      auto parents = wh->t_getparents();
      Array ancestors;
      for (ArrayIter piter(parents); piter; ++piter) {
        // Note: the parent list contains no nulls.
        auto parent = objToWaitableWaitHandle(piter.secondRef().toObject());
        ancestors.append(parent->t_getname());
      }
      Array frameData;
      frameData.set(s_function, wh->t_getname(), true);
      frameData.set(s_id, wh->t_getid(), true);
      frameData.set(s_ancestors, ancestors, true);
      // Async function wait handles may have a source location to add.
      if (wh->getKind() == c_WaitHandle::Kind::AsyncFunction) {
        auto afwh = static_cast<c_AsyncFunctionWaitHandle*>(wh);
        addAsyncFunctionLocation(frameData, *afwh);
      }
      trace.append(frameData);
    }
  }
  return trace;
}
Exemplo n.º 2
0
// Form a trace of the async stack starting with the currently running
// generator, if any. For now we just toss in the function name and
// id, as well as the pseudo-frames for context breaks at explicit
// joins. Later we'll add more, like file and line, hopefully function
// args, wait handle status, etc.
Array createAsyncStacktrace() {
  Array trace;
  auto currentWaitHandle = f_asio_get_running();
  if (currentWaitHandle.isNull()) return trace;
  Array depStack =
    objToWaitableWaitHandle(currentWaitHandle)->t_getdependencystack();
  for (ArrayIter iter(depStack); iter; ++iter) {
    if (iter.secondRef().isNull()) {
      trace.append(ArrayInit(0).toVariant());
    } else {
      auto wh = objToWaitableWaitHandle(iter.secondRef().toObject());
      auto parents = wh->t_getparents();
      Array ancestors;
      for (ArrayIter piter(parents); piter; ++piter) {
        // Note: the parent list contains no nulls.
        auto parent = objToWaitableWaitHandle(piter.secondRef().toObject());
        ancestors.append(parent->t_getname());
      }
      Array frameData;
      frameData.set(s_function, wh->t_getname(), true);
      frameData.set(s_id, wh->t_getid(), true);
      frameData.set(s_ancestors, ancestors, true);
      // Continuation wait handles may have a source location to add.
      auto contWh = dynamic_cast<c_AsyncFunctionWaitHandle*>(wh);
      if (contWh != nullptr) addContinuationLocation(frameData, *contWh);
      trace.append(frameData);
    }
  }
  return trace;
}
Exemplo n.º 3
0
static void
GetRemoteAddress (struct display *d, int fd)
{
    char    buf[512];
    int	    len = sizeof (buf);
#ifdef STREAMSCONN
    struct netbuf	netb;
#endif

    if (d->peer)
	free ((char *) d->peer);
#ifdef STREAMSCONN
    netb.maxlen = sizeof(buf);
    netb.buf = buf;
    t_getname(fd, &netb, REMOTENAME);
    len = 8;
    /* lucky for us, t_getname returns something that looks like a sockaddr */
#else
    getpeername (fd, (struct sockaddr *) buf, (void *)&len);
#endif
    d->peerlen = 0;
    if (len)
    {
	d->peer = (XdmcpNetaddr) malloc (len);
	if (d->peer)
	{
	    memmove( (char *) d->peer, buf, len);
	    d->peerlen = len;
	}
    }
    Debug ("Got remote address %s %d\n", d->name, d->peerlen);
}
Exemplo n.º 4
0
static int
TRANS(TLIGetPeerAddr)(XtransConnInfo ciptr)

{
    Xtransaddr		sockname;
    struct netbuf	netbuf;

    prmsg(3,"TLIGetPeerAddr(%x)\n", ciptr);

    netbuf.buf=(char *)&sockname;
    netbuf.len=sizeof(sockname);
    netbuf.maxlen=sizeof(sockname);

    if( t_getname(ciptr->fd,&netbuf,REMOTENAME) < 0 )
    {
	prmsg(1,"TLIGetPeerAddr: t_getname(REMOTENAME) failed: %d\n",
	      errno);
	return -1;
    }

    prmsg(4,"TLIGetPeerAddr: got family %d len %d\n",
	  ((struct sockaddr *) &sockname)->sa_family ,netbuf.len);

    /*
     * Everything looks good: fill in the XtransConnInfo structure.
     */

    if( ciptr->peeraddr )
	free(ciptr->peeraddr);

    if( (ciptr->peeraddr = malloc(netbuf.len)) == NULL )
    {
	prmsg(1,
	      "TLIGetPeerAddr: Can't allocate space for the addr\n");
	return -1;
    }

    ciptr->peeraddrlen=netbuf.len;
    memcpy(ciptr->peeraddr,&sockname,ciptr->peeraddrlen);

    return 0;
}
Exemplo n.º 5
0
int 
t_getsockname(long s, struct sockaddr * addr, int * addrlen)
{
   return(t_getname(s, addr, addrlen, PRU_SOCKADDR));
}
Exemplo n.º 6
0
int
t_getpeername(long s, struct sockaddr * addr, int * addrlen)
{
   return(t_getname(s, addr, addrlen, PRU_PEERADDR));
}