Skip to content

Commit d00dbf0

Browse files
use separate file with mmap
1 parent b1e5fd3 commit d00dbf0

6 files changed

Lines changed: 136 additions & 134 deletions

File tree

Cargo.lock

Lines changed: 13 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

embed.mjs

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ async function buildFileIndex(source, target, fileData, writeRaw) {
4444
};
4545

4646
const sourceData = await fs.readFile(source);
47-
const cacheBuffers = [];
47+
const packageIndexList = [];
48+
let offset = 0;
49+
const bytecodeData = [];
4850

4951
for (let [name, data] of fileData) {
5052
if (name.startsWith("llrt-chunk-")) {
@@ -54,31 +56,45 @@ async function buildFileIndex(source, target, fileData, writeRaw) {
5456
const nameBuffer = Buffer.from(name);
5557

5658
const bytecodeSizeBuffer = uint32Buffer(data.length);
57-
58-
cacheBuffers.push(
59-
Buffer.concat([nameLengthBuffer, nameBuffer, bytecodeSizeBuffer, data])
59+
const bytecodeOffsetBuffer = uint32Buffer(offset);
60+
61+
packageIndexList.push(
62+
Buffer.concat([
63+
nameLengthBuffer,
64+
nameBuffer,
65+
bytecodeOffsetBuffer,
66+
bytecodeSizeBuffer,
67+
])
6068
);
69+
70+
offset += data.length;
71+
bytecodeData.push(data);
6172
}
6273

74+
const allBytecodeData = Buffer.concat(bytecodeData);
75+
6376
const packageCount = fileData.length;
64-
const cachePosition = writeRaw ? 0 : sourceData.length;
77+
const bytecodePosition = writeRaw ? 0 : sourceData.length;
78+
const packageIndexPosition = bytecodePosition + allBytecodeData.length;
6579

6680
const metadataBuffer = Buffer.concat([
6781
uint32Buffer(packageCount),
68-
uint32Buffer(cachePosition),
82+
uint32Buffer(bytecodePosition),
83+
uint32Buffer(packageIndexPosition),
6984
Buffer.from("lrt"),
7085
]);
7186

72-
const cacheBuffer = Buffer.concat(cacheBuffers);
73-
74-
console.log("Embedded size:", cacheBuffer.length / 1024, "kB");
87+
const packageIndexBuffer = Buffer.concat(packageIndexList);
7588

7689
const finalBuffer = Buffer.concat([
7790
...(writeRaw ? [] : [sourceData]),
78-
cacheBuffer,
91+
allBytecodeData,
92+
packageIndexBuffer,
7993
metadataBuffer,
8094
]);
8195

96+
console.log("Embedded size:", allBytecodeData.length / 1024, "kB");
97+
8298
await fs.writeFile(target, finalBuffer);
8399
if (!writeRaw) {
84100
await fs.chmod(target, 0o755);

llrt/src/main.c

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,9 @@ typedef struct
128128
uint32_t srcSize;
129129
uint32_t dstSize;
130130
uint32_t id;
131-
uint32_t extraFd;
132131
uint32_t extraDataSize;
133-
const void *extraData;
132+
const void *extraSrc;
133+
const void *extraDst;
134134
const void *inputBuffer;
135135
const void *outputBuffer;
136136
} DecompressThreadArgs;
@@ -139,9 +139,10 @@ static void *decompressPartial(void *arg)
139139
{
140140
DecompressThreadArgs *args = (DecompressThreadArgs *)arg;
141141

142-
if (args->extraData != NULL)
142+
if (args->extraSrc != NULL)
143143
{
144-
write(args->extraFd, args->extraData, args->extraDataSize);
144+
memcpy((void *)args->extraDst, args->extraSrc, args->extraDataSize);
145+
munmap((void *)args->extraDst, args->extraDataSize);
145146
}
146147

147148
size_t srcSize = args->srcSize;
@@ -208,12 +209,12 @@ static void decompress(char **uncompressedData, uint32_t *uncompressedSize, int
208209
uint32_t inputOffset = 0;
209210
uint32_t outputOffset = 0;
210211
uint32_t extraDataSize = *(uint32_t *)extra;
212+
char *extraDataMap;
211213

212214
char *uncompressed;
213215
uint8_t *compressedData;
214216

215217
char *extraData = (char *)extra + sizeof(uint32_t);
216-
pthread_t writeFdThreadId;
217218

218219
logInfo("Extra data size %lu bytes \n", extraDataSize);
219220

@@ -235,6 +236,15 @@ static void decompress(char **uncompressedData, uint32_t *uncompressedSize, int
235236
err(1, "Failed to set file size");
236237
}
237238

239+
if (extraDataSize > 0)
240+
{
241+
if (ftruncate(extraFd, extraDataSize) == -1)
242+
{
243+
err(1, "Failed to set file size");
244+
}
245+
extraDataMap = (char *)mmap(NULL, extraDataSize, PROT_WRITE | PROT_READ, MAP_SHARED, extraFd, 0);
246+
}
247+
238248
uncompressed = mmap(NULL, *uncompressedSize, PROT_READ | PROT_WRITE, MAP_SHARED, outputFd, 0);
239249
if (uncompressed == MAP_FAILED || !uncompressed)
240250
{
@@ -251,8 +261,8 @@ static void decompress(char **uncompressedData, uint32_t *uncompressedSize, int
251261
args[i].id = i;
252262
if (i == 0 && extraDataSize > 0)
253263
{
254-
args[i].extraFd = extraFd;
255-
args[i].extraData = extraData;
264+
args[i].extraSrc = extraData;
265+
args[i].extraDst = extraDataMap;
256266
args[i].extraDataSize = extraDataSize;
257267
}
258268
inputOffset += inputSizes[i];
@@ -279,7 +289,7 @@ static void decompress(char **uncompressedData, uint32_t *uncompressedSize, int
279289
}
280290
}
281291

282-
*uncompressedData = uncompressed;
292+
*uncompressedData = uncompressed;
283293
}
284294

285295
int main(int argc, char *argv[])
@@ -319,11 +329,6 @@ int main(int argc, char *argv[])
319329
err(1, "Failed to unmap memory");
320330
}
321331

322-
if ()
323-
{
324-
err(1, "Failed to unmap memory");
325-
}
326-
327332
double t2 = microSeconds();
328333
logInfo("Extraction + write time: %10.4f ms\n", (t2 - t0) / 1000.0);
329334

@@ -351,13 +356,13 @@ int main(int argc, char *argv[])
351356
char mimallocReserveMemoryMb[16];
352357
sprintf(mimallocReserveMemoryMb, "%iMiB", (int)(memorySize * memoryFactor));
353358

354-
char outputFdStr[10];
355-
sprintf(outputFdStr, "%i", extraFd);
359+
char extraFdStr[14];
360+
sprintf(extraFdStr, "%i", extraFd);
356361

357362
setenv("_START_TIME", startTimeStr, false);
358363
setenv("MIMALLOC_RESERVE_OS_MEMORY", mimallocReserveMemoryMb, false);
359364
setenv("MIMALLOC_LIMIT_OS_ALLOC", "1", false);
360-
setenv("LLRT_MEM_FD", outputFdStr, false);
365+
setenv("LLRT_MEM_FD", extraFdStr, false);
361366

362367
logInfo("Starting app\n");
363368

llrt_core/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ flate2 = { version = "1.0.30", features = [
8080
brotlic = "0.8.2"
8181
rustls-pemfile = "2.1.2"
8282
url = "=2.5.1"
83+
memmap2 = "0.9.4"
8384

8485
[build-dependencies]
8586
rquickjs = { version = "0.6.2", features = [

llrt_core/build.rs

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@ async fn main() -> StdResult<(), Box<dyn Error>> {
3838
set_nightly_cfg();
3939

4040
rerun_if_changed!(BUNDLE_JS_DIR);
41-
rerun_if_changed!("Cargo.toml");
42-
rerun_if_changed!("patches");
4341

4442
cargo_patch::patch()?;
4543

@@ -68,7 +66,9 @@ async fn main() -> StdResult<(), Box<dyn Error>> {
6866

6967
#[cfg(feature = "lambda")]
7068
{
69+
info!("Path is: {:?}", path);
7170
if path == PathBuf::new().join("@llrt").join("test.js") {
71+
info!("SKIPPING TEST!!!");
7272
continue;
7373
}
7474
}
@@ -113,6 +113,7 @@ async fn main() -> StdResult<(), Box<dyn Error>> {
113113
total_bytes += bytes.len();
114114

115115
fs::create_dir_all(lrt_path.parent().unwrap())?;
116+
println!("Writing: {:?}", lrt_path);
116117
if cfg!(feature = "uncompressed") {
117118
let uncompressed = add_bytecode_header(bytes, None);
118119
fs::write(&lrt_path, uncompressed)?;
@@ -121,27 +122,11 @@ async fn main() -> StdResult<(), Box<dyn Error>> {
121122
}
122123

123124
info!("Done!");
124-
125-
// ph_map.entry(
126-
// module_name,
127-
// &format!(
128-
// "include_bytes!(\"..{}{}\")",
129-
// MAIN_SEPARATOR_STR, &lrt_filename
130-
// ),
131-
// );
132125
}
133126

134127
StdResult::<_, Box<dyn Error>>::Ok(())
135128
})?;
136129

137-
// write!(
138-
// &mut sdk_bytecode_file,
139-
// "// @generated by build.rs\n\npub static BYTECODE_CACHE: phf::Map<&'static str, &[u8]> = {}",
140-
// ph_map.build()
141-
// )?;
142-
// writeln!(&mut sdk_bytecode_file, ";")?;
143-
// sdk_bytecode_file.flush()?;
144-
145130
info!(
146131
"\n===============================\nUncompressed bytecode size: {}\n===============================",
147132
human_file_size(total_bytes)

0 commit comments

Comments
 (0)