zero copy blob
This commit is contained in:
59
net/socket.c
59
net/socket.c
@@ -333,19 +333,15 @@ JSC_CCALL(socket_recv,
|
||||
flags = js2number(js, argv[2]);
|
||||
}
|
||||
|
||||
void *buf = malloc(len);
|
||||
if (!buf) {
|
||||
return JS_RaiseDisrupt(js, "malloc failed");
|
||||
}
|
||||
|
||||
ssize_t received = recv(sockfd, buf, len, flags);
|
||||
if (received < 0) {
|
||||
free(buf);
|
||||
void *out;
|
||||
ret = js_new_blob_alloc(js, len, &out);
|
||||
if (JS_IsException(ret)) return ret;
|
||||
|
||||
ssize_t received = recv(sockfd, out, len, flags);
|
||||
if (received < 0)
|
||||
return JS_RaiseDisrupt(js, "recv failed: %s", strerror(errno));
|
||||
}
|
||||
|
||||
ret = js_new_blob_stoned_copy(js, buf, received);
|
||||
free(buf);
|
||||
|
||||
js_blob_stone(ret, received);
|
||||
return ret;
|
||||
)
|
||||
|
||||
@@ -421,25 +417,20 @@ JSC_CCALL(socket_recvfrom,
|
||||
flags = js2number(js, argv[2]);
|
||||
}
|
||||
|
||||
void *buf = malloc(len);
|
||||
if (!buf) {
|
||||
return JS_RaiseDisrupt(js, "malloc failed");
|
||||
}
|
||||
|
||||
void *out;
|
||||
JSValue blob = js_new_blob_alloc(js, len, &out);
|
||||
if (JS_IsException(blob)) return blob;
|
||||
|
||||
struct sockaddr_storage from_addr;
|
||||
socklen_t from_len = sizeof from_addr;
|
||||
|
||||
ssize_t received = recvfrom(sockfd, buf, len, flags,
|
||||
|
||||
ssize_t received = recvfrom(sockfd, out, len, flags,
|
||||
(struct sockaddr *)&from_addr, &from_len);
|
||||
if (received < 0) {
|
||||
free(buf);
|
||||
if (received < 0)
|
||||
return JS_RaiseDisrupt(js, "recvfrom failed: %s", strerror(errno));
|
||||
}
|
||||
|
||||
ret = JS_NewObject(js);
|
||||
JS_SetPropertyStr(js, ret, "data", js_new_blob_stoned_copy(js, buf, received));
|
||||
free(buf);
|
||||
|
||||
|
||||
js_blob_stone(blob, received);
|
||||
|
||||
// Get source address info
|
||||
char ipstr[INET6_ADDRSTRLEN];
|
||||
int port;
|
||||
@@ -452,11 +443,15 @@ JSC_CCALL(socket_recvfrom,
|
||||
inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
|
||||
port = ntohs(s->sin6_port);
|
||||
}
|
||||
|
||||
JSValue addr_info = JS_NewObject(js);
|
||||
JS_SetPropertyStr(js, addr_info, "address", JS_NewString(js, ipstr));
|
||||
JS_SetPropertyStr(js, addr_info, "port", JS_NewInt32(js, port));
|
||||
JS_SetPropertyStr(js, ret, "address", addr_info);
|
||||
|
||||
JS_FRAME(js);
|
||||
JS_ROOT(ret_r, JS_NewObject(js));
|
||||
JS_SetPropertyStr(js, ret_r.val, "data", blob);
|
||||
JS_ROOT(addr_info, JS_NewObject(js));
|
||||
JS_SetPropertyStr(js, addr_info.val, "address", JS_NewString(js, ipstr));
|
||||
JS_SetPropertyStr(js, addr_info.val, "port", JS_NewInt32(js, port));
|
||||
JS_SetPropertyStr(js, ret_r.val, "address", addr_info.val);
|
||||
JS_RETURN(ret_r.val);
|
||||
)
|
||||
|
||||
JSC_CCALL(socket_shutdown,
|
||||
|
||||
Reference in New Issue
Block a user