Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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;
}
Example #4
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;
}
Example #5
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);
}