// 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; }
// 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; }
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); }
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; }
int t_getsockname(long s, struct sockaddr * addr, int * addrlen) { return(t_getname(s, addr, addrlen, PRU_SOCKADDR)); }
int t_getpeername(long s, struct sockaddr * addr, int * addrlen) { return(t_getname(s, addr, addrlen, PRU_PEERADDR)); }