int nvlist_send(int sock, const nvlist_t *nvl) { size_t datasize, nfds; int *fds; void *data; int64_t fdidx; int ret; if (nvlist_error(nvl) != 0) { ERRNO_SET(nvlist_error(nvl)); return (-1); } fds = nvlist_descriptors(nvl, &nfds); if (fds == NULL) return (-1); ret = -1; data = NULL; fdidx = 0; data = nvlist_xpack(nvl, &fdidx, &datasize); if (data == NULL) goto out; if (buf_send(sock, data, datasize) == -1) goto out; if (nfds > 0) { if (fd_send(sock, fds, nfds) == -1) goto out; } ret = 0; out: ERRNO_SAVE(); nv_free(fds); nv_free(data); ERRNO_RESTORE(); return (ret); }
int nvlist_send(int sock, const nvlist_t *nvl) { size_t datasize, nfds; int *fds; void *data; int64_t fdidx; int serrno, ret; if (nvlist_error(nvl) != 0) { errno = nvlist_error(nvl); return (-1); } fds = nvlist_descriptors(nvl, &nfds); if (fds == NULL) return (-1); ret = -1; data = NULL; fdidx = 0; data = nvlist_xpack(nvl, &fdidx, &datasize); if (data == NULL) goto out; if (buf_send(sock, data, datasize) == -1) goto out; if (nfds > 0) { if (fd_send(sock, fds, nfds) == -1) goto out; } ret = 0; out: serrno = errno; free(fds); free(data); errno = serrno; return (ret); }
int main(void *arg) { struct test17_buf_st *st = NULL; unsigned long long tsc, tsc2; int count; (void)arg; st = (struct test17_buf_st*) shm_acquire("test17_shm"); __asm__ __volatile__("rdtsc":"=A"(tsc)); tsc2 = tsc + 1000000000; assert(tsc < tsc2); do { int j; for (j=0; j<256; j++) { buf_send((char)j, st); } count++; __asm__ __volatile__("rdtsc":"=A"(tsc)); } while (tsc < tsc2); shm_release("test17_shm"); return count; }
++iov; if (0 == --count) break; } if (0 == count) break; iov->iov_len -= rv; iov->iov_base = ((char*)iov->iov_base) + rv; } return (ST_SUCCESS); } status_t msg_send (int fd, msg_t * msg) { mr_rarray_t rarray = SERIALIZE (msg_t, msg); if (NULL == rarray.data.ptr) return (ST_FAILURE); struct iovec iov[] = { { .iov_len = sizeof (rarray.MR_SIZE), .iov_base = &rarray.MR_SIZE, }, { .iov_len = rarray.MR_SIZE, .iov_base = rarray.data.ptr, }, }; status_t status = buf_send (fd, iov, sizeof (iov) / sizeof (iov[0])); MR_FREE (rarray.data.ptr); return (status); }