@ebowwa/bun-native-page 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -0
- package/dist/allocator.d.ts +103 -0
- package/dist/allocator.d.ts.map +1 -0
- package/dist/allocator.js +272 -0
- package/dist/allocator.js.map +1 -0
- package/dist/allocator.ts +334 -0
- package/dist/errors.d.ts +24 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +44 -0
- package/dist/errors.js.map +1 -0
- package/dist/errors.ts +51 -0
- package/dist/ffi.d.ts +104 -0
- package/dist/ffi.d.ts.map +1 -0
- package/dist/ffi.js +102 -0
- package/dist/ffi.js.map +1 -0
- package/dist/ffi.ts +119 -0
- package/dist/index.d.ts +89 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +294 -0
- package/dist/index.js.map +1 -0
- package/dist/index.ts +433 -0
- package/dist/oom.d.ts +36 -0
- package/dist/oom.d.ts.map +1 -0
- package/dist/oom.js +73 -0
- package/dist/oom.js.map +1 -0
- package/dist/oom.ts +96 -0
- package/native/darwin-arm64/libpage_native.dylib +0 -0
- package/package.json +69 -0
package/dist/ffi.ts
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bun FFI bindings to page_native library
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { dlopen, suffix, ptr, toArrayBuffer } from 'bun:ffi';
|
|
6
|
+
|
|
7
|
+
// Platform detection
|
|
8
|
+
const platform = process.platform;
|
|
9
|
+
const arch = process.arch;
|
|
10
|
+
|
|
11
|
+
// Resolve native library path
|
|
12
|
+
function getNativePath(): string {
|
|
13
|
+
const platformMap: Record<string, string> = {
|
|
14
|
+
'darwin-arm64': 'darwin-arm64',
|
|
15
|
+
'darwin-x64': 'darwin-x64',
|
|
16
|
+
'linux-x64': 'linux-x64',
|
|
17
|
+
'linux-x86': 'linux-x86',
|
|
18
|
+
'linux-arm64': 'linux-arm64',
|
|
19
|
+
'linux-arm': 'linux-arm',
|
|
20
|
+
'win32-x64': 'windows-x64',
|
|
21
|
+
'win32-x86': 'windows-x86',
|
|
22
|
+
'win32-arm64': 'windows-arm64',
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const key = `${platform}-${arch}`;
|
|
26
|
+
const platformDir = platformMap[key];
|
|
27
|
+
|
|
28
|
+
if (!platformDir) {
|
|
29
|
+
throw new Error(`Unsupported platform: ${key}`);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const libName = platform === 'win32' ? 'page_native.dll' : `libpage_native.dylib`;
|
|
33
|
+
return import.meta.dir + `/../native/${platformDir}/${libName}`;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// FFI symbol definitions
|
|
37
|
+
const symbols = {
|
|
38
|
+
// Page size
|
|
39
|
+
page_get_size: { returns: 'usize' },
|
|
40
|
+
page_is_4k: { returns: 'i32' },
|
|
41
|
+
page_is_16k: { returns: 'i32' },
|
|
42
|
+
page_get_huge_page_size: { returns: 'usize' },
|
|
43
|
+
page_get_platform: { returns: 'i32' },
|
|
44
|
+
page_align_size: { args: ['usize'], returns: 'usize' },
|
|
45
|
+
page_truncate_size: { args: ['usize'], returns: 'usize' },
|
|
46
|
+
page_is_aligned: { args: ['usize'], returns: 'i32' },
|
|
47
|
+
|
|
48
|
+
// Allocation
|
|
49
|
+
page_alloc: { args: ['usize'], returns: 'pointer' },
|
|
50
|
+
page_alloc_ptr: { args: ['pointer'], returns: 'pointer' },
|
|
51
|
+
page_alloc_size: { args: ['pointer'], returns: 'usize' },
|
|
52
|
+
page_free: { args: ['pointer'], returns: 'void' },
|
|
53
|
+
|
|
54
|
+
// mmap
|
|
55
|
+
page_mmap_anonymous: { args: ['usize', 'i32'], returns: 'pointer' },
|
|
56
|
+
page_mmap_file: { args: ['i32', 'usize', 'i64', 'i32'], returns: 'pointer' },
|
|
57
|
+
page_mmap_huge: { args: ['usize'], returns: 'pointer' },
|
|
58
|
+
page_mmap_ptr: { args: ['pointer'], returns: 'pointer' },
|
|
59
|
+
page_mmap_size: { args: ['pointer'], returns: 'usize' },
|
|
60
|
+
page_munmap: { args: ['pointer'], returns: 'i32' },
|
|
61
|
+
page_madvise: { args: ['ptr', 'usize', 'i32'], returns: 'i32' },
|
|
62
|
+
page_mprotect: { args: ['ptr', 'usize', 'i32'], returns: 'i32' },
|
|
63
|
+
page_mlock: { args: ['ptr', 'usize'], returns: 'i32' },
|
|
64
|
+
page_munlock: { args: ['ptr', 'usize'], returns: 'i32' },
|
|
65
|
+
|
|
66
|
+
// Utility
|
|
67
|
+
page_zero: { args: ['ptr', 'usize'], returns: 'void' },
|
|
68
|
+
page_copy: { args: ['ptr', 'ptr', 'usize'], returns: 'void' },
|
|
69
|
+
} as const;
|
|
70
|
+
|
|
71
|
+
// Load the library
|
|
72
|
+
let lib: ReturnType<typeof dlopen<typeof symbols>>;
|
|
73
|
+
|
|
74
|
+
try {
|
|
75
|
+
lib = dlopen(getNativePath(), symbols);
|
|
76
|
+
} catch (e) {
|
|
77
|
+
throw new Error(
|
|
78
|
+
`Failed to load page_native library for ${platform}-${arch}. ` +
|
|
79
|
+
`Make sure the native library is built for your platform. ` +
|
|
80
|
+
`Error: ${e}`
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Export the FFI functions
|
|
85
|
+
export const ffi = {
|
|
86
|
+
// Page size
|
|
87
|
+
getSize: lib.symbols.page_get_size,
|
|
88
|
+
is4k: lib.symbols.page_is_4k,
|
|
89
|
+
is16k: lib.symbols.page_is_16k,
|
|
90
|
+
getHugePageSize: lib.symbols.page_get_huge_page_size,
|
|
91
|
+
getPlatform: lib.symbols.page_get_platform,
|
|
92
|
+
alignSize: lib.symbols.page_align_size,
|
|
93
|
+
truncateSize: lib.symbols.page_truncate_size,
|
|
94
|
+
isAligned: lib.symbols.page_is_aligned,
|
|
95
|
+
|
|
96
|
+
// Allocation
|
|
97
|
+
alloc: lib.symbols.page_alloc,
|
|
98
|
+
allocPtr: lib.symbols.page_alloc_ptr,
|
|
99
|
+
allocSize: lib.symbols.page_alloc_size,
|
|
100
|
+
free: lib.symbols.page_free,
|
|
101
|
+
|
|
102
|
+
// mmap
|
|
103
|
+
mmapAnonymous: lib.symbols.page_mmap_anonymous,
|
|
104
|
+
mmapFile: lib.symbols.page_mmap_file,
|
|
105
|
+
mmapHuge: lib.symbols.page_mmap_huge,
|
|
106
|
+
mmapPtr: lib.symbols.page_mmap_ptr,
|
|
107
|
+
mmapSize: lib.symbols.page_mmap_size,
|
|
108
|
+
munmap: lib.symbols.page_munmap,
|
|
109
|
+
madvise: lib.symbols.page_madvise,
|
|
110
|
+
mprotect: lib.symbols.page_mprotect,
|
|
111
|
+
mlock: lib.symbols.page_mlock,
|
|
112
|
+
munlock: lib.symbols.page_munlock,
|
|
113
|
+
|
|
114
|
+
// Utility
|
|
115
|
+
zero: lib.symbols.page_zero,
|
|
116
|
+
copy: lib.symbols.page_copy,
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
export { ptr, toArrayBuffer };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ebowwa/bun-native-page
|
|
3
|
+
*
|
|
4
|
+
* Cross-platform page-size aware memory operations for Bun
|
|
5
|
+
*/
|
|
6
|
+
export * from './errors.js';
|
|
7
|
+
export * from './oom.js';
|
|
8
|
+
export * from './allocator.js';
|
|
9
|
+
import { OOMOptions } from './oom.js';
|
|
10
|
+
export interface PageSizeInfo {
|
|
11
|
+
/** System page size in bytes */
|
|
12
|
+
readonly size: number;
|
|
13
|
+
/** true if page size is 4096 bytes */
|
|
14
|
+
readonly is4k: boolean;
|
|
15
|
+
/** true if page size is 16384 bytes */
|
|
16
|
+
readonly is16k: boolean;
|
|
17
|
+
/** true if page size is 65536 bytes */
|
|
18
|
+
readonly is64k: boolean;
|
|
19
|
+
/** Huge page size in bytes (Linux only, 0 if unavailable) */
|
|
20
|
+
readonly hugePageSize: number;
|
|
21
|
+
/** Platform identifier */
|
|
22
|
+
readonly platform: PlatformName;
|
|
23
|
+
}
|
|
24
|
+
export type PlatformName = 'darwin-arm64' | 'darwin-x64' | 'linux-x64' | 'linux-x86' | 'linux-arm64' | 'linux-arm' | 'windows-x64' | 'windows-x86' | 'windows-arm64' | 'unknown';
|
|
25
|
+
export type MemoryProtection = 'none' | 'read' | 'write' | 'exec' | 'read-write' | 'read-exec' | 'write-exec' | 'all';
|
|
26
|
+
export type MemoryAdvice = 'normal' | 'random' | 'sequential' | 'willneed' | 'dontneed' | 'free' | 'hugepage' | 'nohugepage';
|
|
27
|
+
export interface AllocatedBuffer {
|
|
28
|
+
/** Pointer to allocated memory */
|
|
29
|
+
readonly ptr: bigint;
|
|
30
|
+
/** Requested size */
|
|
31
|
+
readonly size: number;
|
|
32
|
+
/** Actual allocated size (may be larger due to alignment) */
|
|
33
|
+
readonly allocatedSize: number;
|
|
34
|
+
/** ArrayBuffer view of the memory */
|
|
35
|
+
readonly buffer: ArrayBuffer;
|
|
36
|
+
/** Free the allocation */
|
|
37
|
+
free(): void;
|
|
38
|
+
}
|
|
39
|
+
export interface MappedRegion {
|
|
40
|
+
/** Pointer to mapped memory */
|
|
41
|
+
readonly ptr: bigint;
|
|
42
|
+
/** Mapped size */
|
|
43
|
+
readonly size: number;
|
|
44
|
+
/** ArrayBuffer view */
|
|
45
|
+
readonly buffer: ArrayBuffer;
|
|
46
|
+
/** Unmap the region */
|
|
47
|
+
unmap(): void;
|
|
48
|
+
/** Change memory protection */
|
|
49
|
+
protect(prot: MemoryProtection): void;
|
|
50
|
+
/** Advise kernel about usage pattern */
|
|
51
|
+
advise(advice: MemoryAdvice): void;
|
|
52
|
+
/** Lock pages in memory (prevent swap) */
|
|
53
|
+
lock(): void;
|
|
54
|
+
/** Unlock pages */
|
|
55
|
+
unlock(): void;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get system page size information
|
|
59
|
+
*/
|
|
60
|
+
export declare function getPageSize(): PageSizeInfo;
|
|
61
|
+
/**
|
|
62
|
+
* Round size up to nearest page boundary
|
|
63
|
+
*/
|
|
64
|
+
export declare function alignToPage(size: number): number;
|
|
65
|
+
/**
|
|
66
|
+
* Round size down to nearest page boundary
|
|
67
|
+
*/
|
|
68
|
+
export declare function truncateToPage(size: number): number;
|
|
69
|
+
/**
|
|
70
|
+
* Check if a pointer is page-aligned
|
|
71
|
+
*/
|
|
72
|
+
export declare function isPageAligned(ptr: bigint | number): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Allocate page-aligned memory
|
|
75
|
+
*/
|
|
76
|
+
export declare function allocPageAligned(size: number, options?: OOMOptions): AllocatedBuffer | null;
|
|
77
|
+
/**
|
|
78
|
+
* Map anonymous memory (no file backing)
|
|
79
|
+
*/
|
|
80
|
+
export declare function mmapAnonymous(size: number, prot?: MemoryProtection): MappedRegion;
|
|
81
|
+
/**
|
|
82
|
+
* Map a file into memory
|
|
83
|
+
*/
|
|
84
|
+
export declare function mmapFile(fd: number, size: number, offset?: number, prot?: MemoryProtection): MappedRegion;
|
|
85
|
+
/**
|
|
86
|
+
* Map huge pages (Linux only, falls back to regular pages on other platforms)
|
|
87
|
+
*/
|
|
88
|
+
export declare function mmapHuge(size: number): MappedRegion | null;
|
|
89
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ebowwa/bun-native-page
|
|
3
|
+
*
|
|
4
|
+
* Cross-platform page-size aware memory operations for Bun
|
|
5
|
+
*/
|
|
6
|
+
export * from './errors.js';
|
|
7
|
+
export * from './oom.js';
|
|
8
|
+
export * from './allocator.js';
|
|
9
|
+
import { ffi, toArrayBuffer } from './ffi.js';
|
|
10
|
+
import { PageSizeError, MapError, ProtectionError, LockError } from './errors.js';
|
|
11
|
+
import { handleOOM } from './oom.js';
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// Constants
|
|
14
|
+
// ============================================================================
|
|
15
|
+
const PROTECTION_MAP = {
|
|
16
|
+
'none': 0,
|
|
17
|
+
'read': 1,
|
|
18
|
+
'write': 2,
|
|
19
|
+
'exec': 4,
|
|
20
|
+
'read-write': 3,
|
|
21
|
+
'read-exec': 5,
|
|
22
|
+
'write-exec': 6,
|
|
23
|
+
'all': 7,
|
|
24
|
+
};
|
|
25
|
+
const ADVICE_MAP = {
|
|
26
|
+
'normal': 0,
|
|
27
|
+
'random': 1,
|
|
28
|
+
'sequential': 2,
|
|
29
|
+
'willneed': 3,
|
|
30
|
+
'dontneed': 4,
|
|
31
|
+
'free': 5,
|
|
32
|
+
'hugepage': 6,
|
|
33
|
+
'nohugepage': 7,
|
|
34
|
+
};
|
|
35
|
+
const PLATFORM_NAMES = {
|
|
36
|
+
0: 'darwin-arm64',
|
|
37
|
+
1: 'darwin-x64',
|
|
38
|
+
2: 'linux-x64',
|
|
39
|
+
3: 'linux-x86',
|
|
40
|
+
4: 'linux-arm64',
|
|
41
|
+
5: 'linux-arm',
|
|
42
|
+
6: 'windows-x64',
|
|
43
|
+
7: 'windows-x86',
|
|
44
|
+
8: 'windows-arm64',
|
|
45
|
+
99: 'unknown',
|
|
46
|
+
};
|
|
47
|
+
// Cached page size info
|
|
48
|
+
let cachedPageSizeInfo = null;
|
|
49
|
+
// ============================================================================
|
|
50
|
+
// Page Size API
|
|
51
|
+
// ============================================================================
|
|
52
|
+
/**
|
|
53
|
+
* Get system page size information
|
|
54
|
+
*/
|
|
55
|
+
export function getPageSize() {
|
|
56
|
+
if (cachedPageSizeInfo) {
|
|
57
|
+
return cachedPageSizeInfo;
|
|
58
|
+
}
|
|
59
|
+
const size = Number(ffi.getSize());
|
|
60
|
+
const hugePageSize = Number(ffi.getHugePageSize());
|
|
61
|
+
const platformId = Number(ffi.getPlatform());
|
|
62
|
+
cachedPageSizeInfo = {
|
|
63
|
+
size,
|
|
64
|
+
is4k: size === 4096,
|
|
65
|
+
is16k: size === 16384,
|
|
66
|
+
is64k: size === 65536,
|
|
67
|
+
hugePageSize,
|
|
68
|
+
platform: PLATFORM_NAMES[platformId] ?? 'unknown',
|
|
69
|
+
};
|
|
70
|
+
return cachedPageSizeInfo;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Round size up to nearest page boundary
|
|
74
|
+
*/
|
|
75
|
+
export function alignToPage(size) {
|
|
76
|
+
return Number(ffi.alignSize(BigInt(size)));
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Round size down to nearest page boundary
|
|
80
|
+
*/
|
|
81
|
+
export function truncateToPage(size) {
|
|
82
|
+
return Number(ffi.truncateSize(BigInt(size)));
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Check if a pointer is page-aligned
|
|
86
|
+
*/
|
|
87
|
+
export function isPageAligned(ptr) {
|
|
88
|
+
const result = ffi.isAligned(BigInt(ptr));
|
|
89
|
+
return result !== 0;
|
|
90
|
+
}
|
|
91
|
+
// ============================================================================
|
|
92
|
+
// Allocation API
|
|
93
|
+
// ============================================================================
|
|
94
|
+
/**
|
|
95
|
+
* Allocate page-aligned memory
|
|
96
|
+
*/
|
|
97
|
+
export function allocPageAligned(size, options) {
|
|
98
|
+
if (size <= 0) {
|
|
99
|
+
throw new PageSizeError('Size must be positive');
|
|
100
|
+
}
|
|
101
|
+
if (size > Number.MAX_SAFE_INTEGER) {
|
|
102
|
+
throw new PageSizeError('Size exceeds safe integer range');
|
|
103
|
+
}
|
|
104
|
+
const allocHandle = ffi.alloc(BigInt(size));
|
|
105
|
+
if (allocHandle === null || allocHandle === 0n) {
|
|
106
|
+
return handleOOM(size, options);
|
|
107
|
+
}
|
|
108
|
+
const actualPtr = ffi.allocPtr(allocHandle);
|
|
109
|
+
const actualSize = Number(ffi.allocSize(allocHandle));
|
|
110
|
+
if (actualPtr === null || actualPtr === 0n) {
|
|
111
|
+
ffi.free(allocHandle);
|
|
112
|
+
return handleOOM(size, options);
|
|
113
|
+
}
|
|
114
|
+
let freed = false;
|
|
115
|
+
return {
|
|
116
|
+
ptr: BigInt(actualPtr),
|
|
117
|
+
size,
|
|
118
|
+
allocatedSize: actualSize,
|
|
119
|
+
get buffer() {
|
|
120
|
+
if (freed) {
|
|
121
|
+
throw new PageSizeError('Cannot access freed buffer');
|
|
122
|
+
}
|
|
123
|
+
return toArrayBuffer(actualPtr, 0, actualSize);
|
|
124
|
+
},
|
|
125
|
+
free() {
|
|
126
|
+
if (!freed) {
|
|
127
|
+
freed = true;
|
|
128
|
+
ffi.free(allocHandle);
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
// ============================================================================
|
|
134
|
+
// mmap API
|
|
135
|
+
// ============================================================================
|
|
136
|
+
/**
|
|
137
|
+
* Map anonymous memory (no file backing)
|
|
138
|
+
*/
|
|
139
|
+
export function mmapAnonymous(size, prot = 'read-write') {
|
|
140
|
+
if (size <= 0) {
|
|
141
|
+
throw new PageSizeError('Size must be positive');
|
|
142
|
+
}
|
|
143
|
+
const protValue = PROTECTION_MAP[prot];
|
|
144
|
+
const regionHandle = ffi.mmapAnonymous(BigInt(size), protValue);
|
|
145
|
+
if (regionHandle === null || regionHandle === 0n) {
|
|
146
|
+
throw new MapError(size, 'mmap failed');
|
|
147
|
+
}
|
|
148
|
+
const actualPtr = ffi.mmapPtr(regionHandle);
|
|
149
|
+
const actualSize = Number(ffi.mmapSize(regionHandle));
|
|
150
|
+
if (actualPtr === null || actualPtr === 0n) {
|
|
151
|
+
throw new MapError(size, 'mmap returned null pointer');
|
|
152
|
+
}
|
|
153
|
+
let unmapped = false;
|
|
154
|
+
return {
|
|
155
|
+
ptr: BigInt(actualPtr),
|
|
156
|
+
size: actualSize,
|
|
157
|
+
get buffer() {
|
|
158
|
+
if (unmapped) {
|
|
159
|
+
throw new PageSizeError('Cannot access unmapped region');
|
|
160
|
+
}
|
|
161
|
+
return toArrayBuffer(actualPtr, 0, actualSize);
|
|
162
|
+
},
|
|
163
|
+
unmap() {
|
|
164
|
+
if (!unmapped) {
|
|
165
|
+
unmapped = true;
|
|
166
|
+
const result = ffi.munmap(regionHandle);
|
|
167
|
+
if (result !== 0) {
|
|
168
|
+
throw new PageSizeError('munmap failed');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
protect(prot) {
|
|
173
|
+
const protValue = PROTECTION_MAP[prot];
|
|
174
|
+
const result = ffi.mprotect(actualPtr, BigInt(actualSize), protValue);
|
|
175
|
+
if (result !== 0) {
|
|
176
|
+
throw new ProtectionError(`mprotect failed with code ${result}`);
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
advise(advice) {
|
|
180
|
+
const adviceValue = ADVICE_MAP[advice];
|
|
181
|
+
ffi.madvise(actualPtr, BigInt(actualSize), adviceValue);
|
|
182
|
+
},
|
|
183
|
+
lock() {
|
|
184
|
+
const result = ffi.mlock(actualPtr, BigInt(actualSize));
|
|
185
|
+
if (result !== 0) {
|
|
186
|
+
throw new LockError(`mlock failed with code ${result}`);
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
unlock() {
|
|
190
|
+
const result = ffi.munlock(actualPtr, BigInt(actualSize));
|
|
191
|
+
if (result !== 0) {
|
|
192
|
+
throw new LockError(`munlock failed with code ${result}`);
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Map a file into memory
|
|
199
|
+
*/
|
|
200
|
+
export function mmapFile(fd, size, offset = 0, prot = 'read-write') {
|
|
201
|
+
if (size <= 0) {
|
|
202
|
+
throw new PageSizeError('Size must be positive');
|
|
203
|
+
}
|
|
204
|
+
const protValue = PROTECTION_MAP[prot];
|
|
205
|
+
const regionHandle = ffi.mmapFile(fd, BigInt(size), BigInt(offset), protValue);
|
|
206
|
+
if (regionHandle === null || regionHandle === 0n) {
|
|
207
|
+
throw new MapError(size, 'mmap file failed');
|
|
208
|
+
}
|
|
209
|
+
const actualPtr = ffi.mmapPtr(regionHandle);
|
|
210
|
+
const actualSize = Number(ffi.mmapSize(regionHandle));
|
|
211
|
+
if (actualPtr === null || actualPtr === 0n) {
|
|
212
|
+
throw new MapError(size, 'mmap file returned null pointer');
|
|
213
|
+
}
|
|
214
|
+
let unmapped = false;
|
|
215
|
+
return {
|
|
216
|
+
ptr: BigInt(actualPtr),
|
|
217
|
+
size: actualSize,
|
|
218
|
+
get buffer() {
|
|
219
|
+
if (unmapped) {
|
|
220
|
+
throw new PageSizeError('Cannot access unmapped region');
|
|
221
|
+
}
|
|
222
|
+
return toArrayBuffer(actualPtr, 0, actualSize);
|
|
223
|
+
},
|
|
224
|
+
unmap() {
|
|
225
|
+
if (!unmapped) {
|
|
226
|
+
unmapped = true;
|
|
227
|
+
ffi.munmap(regionHandle);
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
protect(prot) {
|
|
231
|
+
const protValue = PROTECTION_MAP[prot];
|
|
232
|
+
ffi.mprotect(actualPtr, BigInt(actualSize), protValue);
|
|
233
|
+
},
|
|
234
|
+
advise(advice) {
|
|
235
|
+
const adviceValue = ADVICE_MAP[advice];
|
|
236
|
+
ffi.madvise(actualPtr, BigInt(actualSize), adviceValue);
|
|
237
|
+
},
|
|
238
|
+
lock() {
|
|
239
|
+
ffi.mlock(actualPtr, BigInt(actualSize));
|
|
240
|
+
},
|
|
241
|
+
unlock() {
|
|
242
|
+
ffi.munlock(actualPtr, BigInt(actualSize));
|
|
243
|
+
},
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Map huge pages (Linux only, falls back to regular pages on other platforms)
|
|
248
|
+
*/
|
|
249
|
+
export function mmapHuge(size) {
|
|
250
|
+
if (size <= 0) {
|
|
251
|
+
throw new PageSizeError('Size must be positive');
|
|
252
|
+
}
|
|
253
|
+
const regionHandle = ffi.mmapHuge(BigInt(size));
|
|
254
|
+
if (regionHandle === null || regionHandle === 0n) {
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
const actualPtr = ffi.mmapPtr(regionHandle);
|
|
258
|
+
const actualSize = Number(ffi.mmapSize(regionHandle));
|
|
259
|
+
if (actualPtr === null || actualPtr === 0n) {
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
let unmapped = false;
|
|
263
|
+
return {
|
|
264
|
+
ptr: BigInt(actualPtr),
|
|
265
|
+
size: actualSize,
|
|
266
|
+
get buffer() {
|
|
267
|
+
if (unmapped) {
|
|
268
|
+
throw new PageSizeError('Cannot access unmapped region');
|
|
269
|
+
}
|
|
270
|
+
return toArrayBuffer(actualPtr, 0, actualSize);
|
|
271
|
+
},
|
|
272
|
+
unmap() {
|
|
273
|
+
if (!unmapped) {
|
|
274
|
+
unmapped = true;
|
|
275
|
+
ffi.munmap(regionHandle);
|
|
276
|
+
}
|
|
277
|
+
},
|
|
278
|
+
protect(prot) {
|
|
279
|
+
const protValue = PROTECTION_MAP[prot];
|
|
280
|
+
ffi.mprotect(actualPtr, BigInt(actualSize), protValue);
|
|
281
|
+
},
|
|
282
|
+
advise(advice) {
|
|
283
|
+
const adviceValue = ADVICE_MAP[advice];
|
|
284
|
+
ffi.madvise(actualPtr, BigInt(actualSize), adviceValue);
|
|
285
|
+
},
|
|
286
|
+
lock() {
|
|
287
|
+
ffi.mlock(actualPtr, BigInt(actualSize));
|
|
288
|
+
},
|
|
289
|
+
unlock() {
|
|
290
|
+
ffi.munlock(actualPtr, BigInt(actualSize));
|
|
291
|
+
},
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
|