static ssize_t _sock_cq_write(struct sock_cq *cq, fi_addr_t addr, const void *buf, size_t len) { ssize_t ret; fastlock_acquire(&cq->lock); if (rbfdavail(&cq->cq_rbfd) < len) { ret = -FI_ENOSPC; SOCK_LOG_ERROR("Not enough space in CQ\n"); goto out; } rbwrite(&cq->addr_rb, &addr, sizeof(addr)); rbcommit(&cq->addr_rb); rbfdwrite(&cq->cq_rbfd, buf, len); rbfdcommit(&cq->cq_rbfd); ret = len; if (cq->signal) sock_wait_signal(cq->waitset); out: fastlock_release(&cq->lock); return ret; }
static ssize_t _sock_cq_write(struct sock_cq *cq, fi_addr_t addr, const void *buf, size_t len) { ssize_t ret; struct sock_cq_overflow_entry_t *overflow_entry; fastlock_acquire(&cq->lock); if (ofi_rbfdavail(&cq->cq_rbfd) < len) { SOCK_LOG_ERROR("Not enough space in CQ\n"); overflow_entry = calloc(1, sizeof(*overflow_entry) + len); if (!overflow_entry) { ret = -FI_ENOSPC; goto out; } memcpy(&overflow_entry->cq_entry[0], buf, len); overflow_entry->len = len; overflow_entry->addr = addr; dlist_insert_tail(&overflow_entry->entry, &cq->overflow_list); ret = len; goto out; } ofi_rbwrite(&cq->addr_rb, &addr, sizeof(addr)); ofi_rbcommit(&cq->addr_rb); ofi_rbfdwrite(&cq->cq_rbfd, buf, len); if (cq->domain->progress_mode == FI_PROGRESS_MANUAL) ofi_rbcommit(&cq->cq_rbfd.rb); else ofi_rbfdcommit(&cq->cq_rbfd); ret = len; if (cq->signal) sock_wait_signal(cq->waitset); out: fastlock_release(&cq->lock); return ret; }