Skip to content

Commit 423c058

Browse files
committed
Open fifo twice to have independent file descriptor
So that setting `O_NONBLOCK` would not affect other. Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
1 parent 588029f commit 423c058

File tree

3 files changed

+13
-18
lines changed

3 files changed

+13
-18
lines changed

src/error.rs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,6 @@ pub enum FromEnvErrorKind {
3636
NotAPipe,
3737
/// Jobserver inheritance is not supported on this platform.
3838
Unsupported,
39-
/// Cannot clone the jobserver fifo fd
40-
CannotClone,
4139
}
4240

4341
impl FromEnvError {
@@ -52,7 +50,6 @@ impl FromEnvError {
5250
FromEnvErrorInner::NegativeFd(..) => FromEnvErrorKind::NegativeFd,
5351
FromEnvErrorInner::NotAPipe(..) => FromEnvErrorKind::NotAPipe,
5452
FromEnvErrorInner::Unsupported => FromEnvErrorKind::Unsupported,
55-
FromEnvErrorInner::CannotClone(..) => FromEnvErrorKind::CannotClone,
5653
}
5754
}
5855
}
@@ -69,17 +66,16 @@ impl std::fmt::Display for FromEnvError {
6966
FromEnvErrorInner::NotAPipe(fd, None) => write!(f, "file descriptor {fd} from the jobserver environment variable value is not a pipe"),
7067
FromEnvErrorInner::NotAPipe(fd, Some(err)) => write!(f, "file descriptor {fd} from the jobserver environment variable value is not a pipe: {err}"),
7168
FromEnvErrorInner::Unsupported => write!(f, "jobserver inheritance is not supported on this platform"),
72-
FromEnvErrorInner::CannotClone(fd, err) => write!(f, "file descriptor {fd} created fromjobserver environment variable value cannot be cloned: {err}"),
7369
}
7470
}
7571
}
7672
impl std::error::Error for FromEnvError {
7773
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
7874
match &self.inner {
7975
FromEnvErrorInner::CannotOpenPath(_, err) => Some(err),
80-
FromEnvErrorInner::NotAPipe(_, Some(err))
81-
| FromEnvErrorInner::CannotOpenFd(_, err)
82-
| FromEnvErrorInner::CannotClone(_, err) => Some(err),
76+
FromEnvErrorInner::NotAPipe(_, Some(err)) | FromEnvErrorInner::CannotOpenFd(_, err) => {
77+
Some(err)
78+
}
8379
_ => None,
8480
}
8581
}
@@ -96,5 +92,4 @@ pub(crate) enum FromEnvErrorInner {
9692
NegativeFd(RawFd),
9793
NotAPipe(RawFd, Option<std::io::Error>),
9894
Unsupported,
99-
CannotClone(RawFd, std::io::Error),
10095
}

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -644,7 +644,7 @@ mod test {
644644
client.try_acquire().unwrap().unwrap();
645645
}
646646

647-
#[cfg(any(not(unix), linux))]
647+
#[cfg(any(windows, target_os = "linux"))]
648648
#[test]
649649
fn test_try_acquire() {
650650
let client = Client::new(0).unwrap();

src/unix.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -114,17 +114,17 @@ impl Client {
114114
})?;
115115
let path = Path::new(path_str);
116116

117-
let file = OpenOptions::new()
118-
.read(true)
119-
.write(true)
120-
.open(path)
121-
.map_err(|err| FromEnvErrorInner::CannotOpenPath(path_str.to_string(), err))?;
117+
let open_file = || {
118+
OpenOptions::new()
119+
.read(true)
120+
.write(true)
121+
.open(path)
122+
.map_err(|err| FromEnvErrorInner::CannotOpenPath(path_str.to_string(), err))
123+
};
122124

123125
Ok(Some(Client {
124-
read: file
125-
.try_clone()
126-
.map_err(|err| FromEnvErrorInner::CannotClone(file.as_raw_fd(), err))?,
127-
write: file,
126+
read: open_file()?,
127+
write: open_file()?,
128128
creation_arg: ClientCreationArg::Fifo(path.into()),
129129
is_non_blocking: Some(AtomicBool::new(false)),
130130
}))

0 commit comments

Comments
 (0)