zero copy blob

This commit is contained in:
2026-02-20 14:06:42 -06:00
parent c5ad4f0a99
commit ebfc89e072
11 changed files with 160 additions and 153 deletions

View File

@@ -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,