Commit Graph

56 Commits

Author SHA1 Message Date
klensy
f212ba6d6d use c literals in library 2023-05-31 19:41:51 +03:00
Chris Denton
db8dfbdb75 Windows: map a few more error codes to ErrorKind
NotFound errors:

* `ERROR_INVALID_DRIVE`: The system cannot find the drive specified
* `ERROR_BAD_NETPATH`: The network path was not found
* `ERROR_BAD_NET_NAME`: The network name cannot be found.

InvalidFilename:

* `ERROR_BAD_PATHNAME`: The specified path is invalid.
2023-04-16 23:42:59 +01:00
joboet
a9e5c1a309 std: unify id-based thread parking implementations 2022-12-29 17:45:07 +01:00
Chris Denton
5857c3045a Use stdio in UWP apps
This has been supported since Windows 10.0.16299. See https://learn.microsoft.com/en-us/uwp/win32-and-com/win32-apis#apis-from-api-ms-win-core-console-l1-1-0dll
2022-10-27 17:21:30 +01:00
bors
8c6ce6b91b Auto merge of #97802 - Enselic:add-no_ignore_sigkill-feature, r=joshtriplett
Support `#[unix_sigpipe = "inherit|sig_dfl"]` on `fn main()` to prevent ignoring `SIGPIPE`

When enabled, programs don't have to explicitly handle `ErrorKind::BrokenPipe` any longer. Currently, the program

```rust
fn main() { loop { println!("hello world"); } }
```

will print an error if used with a short-lived pipe, e.g.

    % ./main | head -n 1
    hello world
    thread 'main' panicked at 'failed printing to stdout: Broken pipe (os error 32)', library/std/src/io/stdio.rs:1016:9
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

by enabling `#[unix_sigpipe = "sig_dfl"]` like this

```rust
#![feature(unix_sigpipe)]
#[unix_sigpipe = "sig_dfl"]
fn main() { loop { println!("hello world"); } }
```

there is no error, because `SIGPIPE` will not be ignored and thus the program will be killed appropriately:

    % ./main | head -n 1
    hello world

The current libstd behaviour of ignoring `SIGPIPE` before `fn main()` can be explicitly requested by using `#[unix_sigpipe = "sig_ign"]`.

With `#[unix_sigpipe = "inherit"]`, no change at all is made to `SIGPIPE`, which typically means the behaviour will be the same as `#[unix_sigpipe = "sig_dfl"]`.

See https://github.com/rust-lang/rust/issues/62569 and referenced issues for discussions regarding the `SIGPIPE` problem itself

See the [this](https://rust-lang.zulipchat.com/#narrow/stream/219381-t-libs/topic/Proposal.3A.20First.20step.20towards.20solving.20the.20SIGPIPE.20problem) Zulip topic for more discussions, including about this PR.

Tracking issue: https://github.com/rust-lang/rust/issues/97889
2022-09-02 21:08:08 +00:00
Thom Chiovoloni
5c3490c901 Replace AlignedAs with a more specific Align8 type 2022-08-30 01:15:59 -07:00
Thom Chiovoloni
1b8025a24c Fix some possible UB in std::sys::windows 2022-08-29 15:59:34 -07:00
Martin Nordholts
ddee45e1d7 Support #[unix_sigpipe = "inherit|sig_dfl|sig_ign"] on fn main()
This makes it possible to instruct libstd to never touch the signal
handler for `SIGPIPE`, which makes programs pipeable by default (e.g.
with `./your-program | head -n 1`) without `ErrorKind::BrokenPipe`
errors.
2022-08-28 19:46:45 +02:00
Thom Chiovoloni
d4cba61099 Fix comment typo 2022-08-19 08:45:21 -07:00
Thom Chiovoloni
f50f8782fe Avoid zeroing a 1kb stack buffer on every call to std::sys::windows::fill_utf16_buf 2022-08-18 15:04:28 -07:00
Wesley Wiser
820ffc8d7a Call the OS function to set the main thread's name on program init
Normally, `Thread::spawn` takes care of setting the thread's name, if
one was provided, but since the main thread wasn't created by calling
`Thread::spawn`, we need to call that function in `std::rt::init`.

This is mainly useful for system tools like debuggers and profilers
which might show the thread name to a user. Prior to these changes, gdb
and WinDbg would show all thread names except the main thread's name to
a user. I've validated that this patch resolves the issue for both
debuggers.
2022-05-27 10:39:54 -04:00
bors
64c5deb0e3 Auto merge of #96314 - AronParker:issue-96297-fix, r=thomcc
Reduce allocations for path conversions on Windows

Previously, UTF-8 to UTF-16 Path conversions on Windows unnecessarily allocate twice, as described in #96297. This commit fixes that issue.
2022-04-23 04:17:50 +00:00
Aron Parker
6cfdeaf1a1 Remove redundant type annotation 2022-04-22 11:42:53 +02:00
Aron Parker
9a9d5534f0 Reduce allocations for path conversions on Windows
Previously, UTF-8 to UTF-16 Path conversions on Windows unnecessarily allocate twice, as described in #96297. This commit fixes that issue.
2022-04-22 11:02:04 +02:00
dylni
e87082293e Improve Windows path prefix parsing 2022-04-17 01:23:46 -04:00
Vadim Petrochenkov
6eaec56ef7 library: Remove definitions and reexports of strlen from libstd 2022-04-14 21:57:01 +03:00
Ralf Jung
9c977530b5 fix some unused constant warning on some Windows targets 2022-04-08 08:36:56 -04:00
Aria Beingessner
c7de289e1c Make the stdlib largely conform to strict provenance.
Some things like the unwinders and system APIs are not fully conformant,
this only covers a lot of low-hanging fruit.
2022-03-29 20:18:21 -04:00
Mara Bos
733153f2e5 Move std::sys::{mutex, condvar, rwlock} to std::sys::locks. 2022-03-22 18:19:47 +01:00
Chris Denton
57442beb18 Use unreachable! for an unreachable code path 2022-03-09 01:05:47 +00:00
Yuki Okushi
a898b31662 Rename to InvalidFilename 2022-02-10 23:49:27 +09:00
Yuki Okushi
cc9407924d Map ERROR_INVALID_NAME to FilenameInvalid 2022-02-10 23:42:27 +09:00
Yuki Okushi
755e475c8b Rename FilenameTooLong to FilenameInvalid 2022-02-10 23:42:26 +09:00
Yuki Okushi
1115f15e1c windows: Map ERROR_INVALID_NAME as InvalidInput 2022-02-10 23:42:23 +09:00
Thom Chiovoloni
554918e311 Hide Repr details from io::Error, and rework io::Error::new_const. 2022-02-04 18:47:29 -08:00
Ralf Jung
53d2401f3f make Windows abort_internal Miri-compatible 2022-01-25 12:44:40 -05:00
Amanieu d'Antras
44a3a66ee8 Stabilize asm! and global_asm!
They are also removed from the prelude as per the decision in
https://github.com/rust-lang/rust/issues/87228.

stdarch and compiler-builtins are updated to work with the new, stable
asm! and global_asm! macros.
2021-12-12 11:20:03 +00:00
Ian Jackson
622a45d1b8 ErrorKind: Windows: Fix tidy
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
2021-06-18 19:30:55 +01:00
Ian Jackson
58d0cec678 ErrorKind: Windows: Fix botched rebase
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
2021-06-18 19:18:10 +01:00
Ian Jackson
1ec9454403 ErrorKind: Provide many more ErrorKinds, motivated by Unix errnos
Rationale for the mappings etc. is extensively discussed in the MR
  https://github.com/rust-lang/rust/pull/79965

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
2021-06-18 18:51:53 +01:00
Ian Jackson
d59d52e455 ErrorKind: Reformat the mapping table (windows)
use ErrorKind::*;

I don't feel confident enough about Windows things to reorder this
alphabetically

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
2021-06-18 17:53:19 +01:00
Mara Bos
a0d11a4fab Rename ErrorKind::Unknown to Uncategorized. 2021-06-15 14:30:13 +02:00
Mara Bos
0b37bb2bc2 Redefine ErrorKind::Other and stop using it in std. 2021-06-15 14:22:49 +02:00
Chris Denton
fc40aa059b Use the proper import library names 2021-05-06 04:04:19 +01:00
Christiaan Dirkx
ffc20e48de Move std::sys::windows::ext to std::os::windows 2021-05-03 16:56:20 +02:00
Kornel
19568f9a83 Use ErrorKind::OutOfMemory in unix, windows, and wasi 2021-05-02 11:40:32 +01:00
Christiaan Dirkx
e1b1081d2f Document that init and cleanup are not guaranteed to run 2021-04-22 18:00:18 +02:00
Christiaan Dirkx
11445c10ab Move most init to sys::init 2021-04-22 18:00:12 +02:00
Christiaan Dirkx
5b30662741 Rework at_exit to cleanup 2021-04-22 10:34:48 +02:00
Christiaan Dirkx
af0dec2795 Rename NotSupported to Unsupported 2021-04-18 09:29:23 +02:00
Christiaan Dirkx
9f589b023f Update decode_error_kind to decode os errors to NotSupported 2021-04-18 09:29:22 +02:00
Mara Bos
7b71719faf Use io::Error::new_const everywhere to avoid allocations. 2021-03-21 20:22:38 +01:00
bors
fa41639427 Auto merge of #77618 - fusion-engineering-forks:windows-parker, r=Amanieu
Add fast futex-based thread parker for Windows.

This adds a fast futex-based thread parker for Windows. It either uses WaitOnAddress+WakeByAddressSingle or NT Keyed Events (NtWaitForKeyedEvent+NtReleaseKeyedEvent), depending on which is available. Together, this makes this thread parker work for Windows XP and up. Before this change, park()/unpark() did not work on Windows XP: it needs condition variables, which only exist since Windows Vista.

---

Unfortunately, NT Keyed Events are an undocumented Windows API. However:
- This API is relatively simple with obvious behaviour, and there are several (unofficial) articles documenting the details. [1]
- parking_lot has been using this API for years (on Windows versions before Windows 8). [2] Many big projects extensively use parking_lot, such as servo and the Rust compiler itself.
- It is the underlying API used by Windows SRW locks and Windows critical sections. [3] [4]
- The source code of the implementations of Wine, ReactOs, and Windows XP are available and match the expected behaviour.
- The main risk with an undocumented API is that it might change in the future. But since we only use it for older versions of Windows, that's not a problem.
- Even if these functions do not block or wake as we expect (which is unlikely, see all previous points), this implementation would still be memory safe. The NT Keyed Events API is only used to sleep/block in the right place.

[1]\: http://www.locklessinc.com/articles/keyed_events/
[2]\: https://github.com/Amanieu/parking_lot/commit/43abbc964e
[3]\: https://docs.microsoft.com/en-us/archive/msdn-magazine/2012/november/windows-with-c-the-evolution-of-synchronization-in-windows-and-c
[4]\: Windows Internals, Part 1, ISBN 9780735671300

---

The choice of fallback API is inspired by parking_lot(_core), but the implementation of this thread parker is different. While parking_lot has no use for a fast path (park() directly returning if unpark() was already called), this implementation has a fast path that returns without even checking which waiting/waking API to use, as the same atomic variable with compatible states is used in all cases.
2020-12-14 16:41:14 +00:00
bjorn3
6f3872a14c Make the libstd build script smaller
Remove all rustc-link-lib from the std build script. Also remove use of
feature = "restricted-std" where not necessary.
2020-11-15 16:17:21 +01:00
Mateusz Mikuła
0c97c24a6c Remove some dead code in windows-gnu std 2020-10-09 13:23:50 +02:00
Mara Bos
e9904342eb Add fast futex-based thread parker for Windows. 2020-10-06 00:34:59 +02:00
Ryan Levick
d931e97402 Explicitly look for 'thumb-mode' before using __fastfail on 'arm' 2020-08-29 12:30:49 +02:00
Ryan Levick
9e2228d2d0 Back to opcode for 32 bit ARM __fastfail 2020-08-28 17:40:56 +02:00
Ryan Levick
8bcc4d6178 Switch to asm! macro and use brk instruction on ARM 2020-08-28 11:22:21 +02:00
Ryan Levick
970e7793bf Add __fastfail for Windows on arm/aarch64 2020-08-27 19:11:48 +02:00