/
githubmirror
/
deno
Обзор
Документация
Войти
/
githubmirror
/
deno
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
runtime/ops/runtime.rs
117 строк
3 KB
em
refactor: replace winapi usages with windows-sys (#34732)
02 июн 2026, 20:28
Не верифицирован
02 июн 2026, 20:28
bf0b47a
Код
Авторство
О чём код?
// Copyright 2018-2026 the Deno authors. MIT license. use deno_core::ModuleSpecifier; use deno_core::OpState; use deno_core::op2; deno_core::extension!( deno_runtime, ops = [op_main_module, op_ppid, op_internal_log], options = { main_module: ModuleSpecifier }, state = |state, options| { state.put::<ModuleSpecifier>(options.main_module); }, ); #[op2] #[string] fn op_main_module(state: &mut OpState) -> String { let main_url = state.borrow::<ModuleSpecifier>(); main_url.to_string() } /// This is an op instead of being done at initialization time because /// it's expensive to retrieve the ppid on Windows. #[op2(fast)] #[number] pub fn op_ppid() -> i64 { #[cfg(windows)] { // Adopted from rustup: // https://github.com/rust-lang/rustup/blob/1.21.1/src/cli/self_update.rs#L1036 // Copyright Diggory Blake, the Mozilla Corporation, and rustup contributors. // Licensed under either of // - Apache License, Version 2.0 // - MIT license use std::mem; use windows_sys::Win32::Foundation::CloseHandle; use windows_sys::Win32::Foundation::INVALID_HANDLE_VALUE; use windows_sys::Win32::System::Diagnostics::ToolHelp::CreateToolhelp32Snapshot; use windows_sys::Win32::System::Diagnostics::ToolHelp::PROCESSENTRY32; use windows_sys::Win32::System::Diagnostics::ToolHelp::Process32First; use windows_sys::Win32::System::Diagnostics::ToolHelp::Process32Next; use windows_sys::Win32::System::Diagnostics::ToolHelp::TH32CS_SNAPPROCESS; use windows_sys::Win32::System::Threading::GetCurrentProcessId; // SAFETY: Win32 calls unsafe { // Take a snapshot of system processes, one of which is ours // and contains our parent's pid let snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if snapshot == INVALID_HANDLE_VALUE { return -1; } let mut entry: PROCESSENTRY32 = mem::zeroed(); entry.dwSize = mem::size_of::<PROCESSENTRY32>() as u32; // Iterate over system processes looking for ours let success = Process32First(snapshot, &mut entry); if success == 0 { CloseHandle(snapshot); return -1; } let this_pid = GetCurrentProcessId(); while entry.th32ProcessID != this_pid { let success = Process32Next(snapshot, &mut entry); if success == 0 { CloseHandle(snapshot); return -1; } } CloseHandle(snapshot); // FIXME: Using the process ID exposes a race condition // wherein the parent process already exited and the OS // reassigned its ID. let parent_id = entry.th32ParentProcessID; parent_id.into() } } #[cfg(not(windows))] { use std::os::unix::process::parent_id; parent_id().into() } } #[allow(clippy::match_single_binding, reason = "needed for temporary lifetime")] #[op2(fast)] fn op_internal_log( #[string] url: &str, #[smi] level: u32, #[string] message: &str, ) { let level = match level { 1 => log::Level::Error, 2 => log::Level::Warn, 3 => log::Level::Info, 4 => log::Level::Debug, 5 => log::Level::Trace, _ => unreachable!(), }; let target = url.replace('/', "::"); match format_args!("{message}") { args => { let record = log::Record::builder() .file(Some(url)) .module_path(Some(url)) .target(&target) .level(level) .args(args) .build(); log::logger().log(&record); } } }