static void segdev_callback(struct segdev *dev, xport portno) { struct xseg *xseg; struct segpriv *priv = dev->priv; struct xseg_private *xpriv; struct xseg_port *port; struct segdev_signal_desc *ssd; xseg = xsegments[portno]; if (!xseg) return; if (priv->segno >= nr_xsegments) return; xpriv = xseg->priv; port = xseg_get_port(xseg, portno); if (!port) return; ssd = xseg_get_signal_desc(xseg, port); if (!ssd || !ssd->waitcue){ return; } if (xpriv->wakeup) { xpriv->wakeup(portno); } return; }
static struct posixfd_signal_desc * __get_signal_desc(struct xseg *xseg, xport portno) { struct xseg_port *port = xseg_get_port(xseg, portno); if (!port) return NULL; struct posixfd_signal_desc *psd = xseg_get_signal_desc(xseg, port); if (!psd) return NULL; return psd; }
static int posix_cancel_wait(struct xseg *xseg, uint32_t portno) { struct xseg_port *port = xseg_get_port(xseg, portno); if (!port) return -1; struct posix_signal_desc *psd = xseg_get_signal_desc(xseg, port); if (!psd) return -1; psd->waitcue = 0; return 0; }
static int segdev_cancel_wait(struct xseg *xseg, uint32_t portno) { struct segdev_signal_desc *ssd; struct xseg_port *port = xseg_get_port(xseg, portno); if (!port) return -1; ssd = xseg_get_signal_desc(xseg, port); if (!ssd) return -1; /* true/false value */ ssd->waitcue = 0; return -0; }
static int posix_signal(struct xseg *xseg, uint32_t portno) { struct xseg_port *port = xseg_get_port(xseg, portno); if (!port) return -1; struct posix_signal_desc *psd = xseg_get_signal_desc(xseg, port); if (!psd) return -1; pid_t cue = (pid_t)psd->waitcue; if (!cue) //HACKY! return -2; /* FIXME: Make calls to xseg_signal() check for errors */ return syscall(SYS_tkill, cue, SIGIO); }