Exemple #1
0
static ssize_t psmx_eq_readfrom(struct fid_eq *eq, void *buf, size_t len,
                                void *src_addr, size_t *addrlen)
{
    struct psmx_fid_eq *fid_eq;
    struct psmx_event *event;

    fid_eq = container_of(eq, struct psmx_fid_eq, eq);
    assert(fid_eq->domain);

    psmx_eq_poll_mq(fid_eq, fid_eq->domain);

    if (fid_eq->pending_error)
        return -FI_EAVAIL;

    if (len < fid_eq->entry_size)
        return -FI_ETOOSMALL;

    if (!buf)
        return -EINVAL;

    event = psmx_eq_dequeue_event(fid_eq);
    if (event) {
        if (!event->error) {
            memcpy(buf, (void *)&event->eqe, fid_eq->entry_size);
            psmx_eq_get_event_src_addr(fid_eq, event, src_addr, addrlen);
            free(event);
            return fid_eq->entry_size;
        }
        else {
            fid_eq->pending_error = event;
            return -FI_EAVAIL;
        }
    }

    return 0;
}
Exemple #2
0
static inline int psmx_ep_progress(struct psmx_fid_ep *fid_ep)
{
	return psmx_eq_poll_mq(NULL, fid_ep->domain);
}