--- a/toolkit/modules/subprocess/subprocess_shared_win.js
+++ b/toolkit/modules/subprocess/subprocess_shared_win.js
@@ -18,16 +18,19 @@ var win32 = {
WINAPI: ctypes.winapi_abi,
VOID: ctypes.void_t,
BYTE: ctypes.uint8_t,
WORD: ctypes.uint16_t,
DWORD: ctypes.uint32_t,
LONG: ctypes.long,
+ LONGLONG: ctypes.int64_t,
+ LARGE_INTEGER: ctypes.int64_t,
+ ULONGLONG: ctypes.uint64_t,
UINT: ctypes.unsigned_int,
UCHAR: ctypes.unsigned_char,
BOOL: ctypes.bool,
HANDLE: ctypes.voidptr_t,
PVOID: ctypes.voidptr_t,
@@ -90,27 +93,64 @@ Object.assign(win32, {
PIPE_WAIT: 0x00,
PIPE_NOWAIT: 0x01,
STILL_ACTIVE: 259,
PROC_THREAD_ATTRIBUTE_HANDLE_LIST: 0x00020002,
+ JobObjectBasicLimitInformation: 2,
+ JobObjectExtendedLimitInformation: 9,
+
+ JOB_OBJECT_LIMIT_BREAKAWAY_OK: 0x00000800,
+
// These constants are 32-bit unsigned integers, but Windows defines
// them as negative integers cast to an unsigned type.
STD_INPUT_HANDLE: -10 + 0x100000000,
STD_OUTPUT_HANDLE: -11 + 0x100000000,
STD_ERROR_HANDLE: -12 + 0x100000000,
WAIT_TIMEOUT: 0x00000102,
WAIT_FAILED: 0xffffffff,
});
Object.assign(win32, {
+ JOBOBJECT_BASIC_LIMIT_INFORMATION: new ctypes.StructType("JOBOBJECT_BASIC_LIMIT_INFORMATION", [
+ {"PerProcessUserTimeLimit": win32.LARGE_INTEGER},
+ {"PerJobUserTimeLimit": win32.LARGE_INTEGER},
+ {"LimitFlags": win32.DWORD},
+ {"MinimumWorkingSetSize": win32.SIZE_T},
+ {"MaximumWorkingSetSize": win32.SIZE_T},
+ {"ActiveProcessLimit": win32.DWORD},
+ {"Affinity": win32.ULONG_PTR},
+ {"PriorityClass": win32.DWORD},
+ {"SchedulingClass": win32.DWORD},
+ ]),
+
+ IO_COUNTERS: new ctypes.StructType("IO_COUNTERS", [
+ {"ReadOperationCount": win32.ULONGLONG},
+ {"WriteOperationCount": win32.ULONGLONG},
+ {"OtherOperationCount": win32.ULONGLONG},
+ {"ReadTransferCount": win32.ULONGLONG},
+ {"WriteTransferCount": win32.ULONGLONG},
+ {"OtherTransferCount": win32.ULONGLONG},
+ ]),
+});
+
+Object.assign(win32, {
+ JOBOBJECT_EXTENDED_LIMIT_INFORMATION: new ctypes.StructType("JOBOBJECT_EXTENDED_LIMIT_INFORMATION", [
+ {"BasicLimitInformation": win32.JOBOBJECT_BASIC_LIMIT_INFORMATION},
+ {"IoInfo": win32.IO_COUNTERS},
+ {"ProcessMemoryLimit": win32.SIZE_T},
+ {"JobMemoryLimit": win32.SIZE_T},
+ {"PeakProcessMemoryUsed": win32.SIZE_T},
+ {"PeakJobMemoryUsed": win32.SIZE_T},
+ ]),
+
OVERLAPPED: new ctypes.StructType("OVERLAPPED", [
{"Internal": win32.ULONG_PTR},
{"InternalHigh": win32.ULONG_PTR},
{"Offset": win32.DWORD},
{"OffsetHigh": win32.DWORD},
{"hEvent": win32.HANDLE},
]),
@@ -334,16 +374,25 @@ var libc = new Library("libc", LIBC_CHOI
],
ResumeThread: [
win32.WINAPI,
win32.DWORD,
win32.HANDLE, /* hThread */
],
+ SetInformationJobObject: [
+ win32.WINAPI,
+ win32.BOOL,
+ win32.HANDLE, /* hJob */
+ ctypes.int, /* JobObjectInfoClass */
+ win32.LPVOID, /* lpJobObjectInfo */
+ win32.DWORD, /* cbJobObjectInfoLengt */
+ ],
+
TerminateJobObject: [
win32.WINAPI,
win32.BOOL,
win32.HANDLE, /* hJob */
win32.UINT, /* uExitCode */
],
TerminateProcess: [