ssize_t sock_comm_recv_buffer(struct sock_conn *conn) { int ret; size_t endlen; endlen = conn->inbuf.size - (conn->inbuf.wpos & conn->inbuf.size_mask); ret = sock_comm_recv_socket(conn,(char*) conn->inbuf.buf + (conn->inbuf.wpos & conn->inbuf.size_mask), endlen); if (ret <= 0) return 0; conn->inbuf.wpos += ret; rbcommit(&conn->inbuf); if (ret != endlen) return ret; ret = sock_comm_recv_socket(conn, conn->inbuf.buf, rbavail(&conn->inbuf)); if (ret <= 0) return 0; conn->inbuf.wpos += ret; rbcommit(&conn->inbuf); return 0; }
ssize_t sock_comm_recv(struct sock_conn *conn, void *buf, size_t len) { int ret = 0; ssize_t used, read_len; used = rbused(&conn->inbuf); if (used == 0) { ret = sock_comm_recv_socket(conn, buf, len); sock_comm_recv_buffer(conn); return ret; } read_len = MIN(len, used); rbread(&conn->inbuf, buf, read_len); if (len > used) { ret = sock_comm_recv_socket(conn, (char*) buf + used, len - used); if (ret <= 0) ret = 0; sock_comm_recv_buffer(conn); } SOCK_LOG_INFO("read from buffer: %lu\n", ret + read_len); return ret + read_len; }
ssize_t sock_comm_recv(struct sock_pe_entry *pe_entry, void *buf, size_t len) { ssize_t read_len; if (ofi_rbempty(&pe_entry->comm_buf)) { if (len <= pe_entry->cache_sz) { sock_comm_recv_buffer(pe_entry); } else { return sock_comm_recv_socket(pe_entry->conn, buf, len); } } read_len = MIN(len, ofi_rbused(&pe_entry->comm_buf)); ofi_rbread(&pe_entry->comm_buf, buf, read_len); SOCK_LOG_DBG("read from buffer: %lu\n", read_len); return read_len; }
static void sock_comm_recv_buffer(struct sock_pe_entry *pe_entry) { int ret; size_t max_read, avail; avail = ofi_rbavail(&pe_entry->comm_buf); assert(avail == pe_entry->comm_buf.size); pe_entry->comm_buf.rcnt = pe_entry->comm_buf.wcnt = pe_entry->comm_buf.wpos = 0; max_read = pe_entry->rem ? pe_entry->rem : pe_entry->total_len - pe_entry->done_len; ret = sock_comm_recv_socket(pe_entry->conn, (char *) pe_entry->comm_buf.buf, MIN(max_read, avail)); pe_entry->comm_buf.wpos += ret; ofi_rbcommit(&pe_entry->comm_buf); }