Add PidFd::{kill, wait, try_wait} · model-checking/verify-rust-std@f7cf777 (original) (raw)

`@@ -6,14 +6,14 @@

`

6

6

``

7

7

`use crate::io::Result;

`

8

8

`use crate::os::unix::io::{AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, OwnedFd, RawFd};

`

9

``

`-

use crate::process;

`

``

9

`+

use crate::process::{self, ExitStatus};

`

10

10

`use crate::sealed::Sealed;

`

11

11

`#[cfg(not(doc))]

`

12

``

`-

use crate::sys::fd::FileDesc;

`

``

12

`+

use crate::sys::{fd::FileDesc, linux::pidfd::PidFd as InnerPidFd};

`

13

13

`use crate::sys_common::{AsInner, AsInnerMut, FromInner, IntoInner};

`

14

14

``

15

15

`#[cfg(doc)]

`

16

``

`-

struct FileDesc;

`

``

16

`+

struct InnerPidFd;

`

17

17

``

18

18

`/// This type represents a file descriptor that refers to a process.

`

19

19

`///

`

`@@ -47,63 +47,98 @@ struct FileDesc;

`

47

47

`` /// [take_pidfd]: ChildExt::take_pidfd

``

48

48

`` /// [pidfd_open(2)]: https://man7.org/linux/man-pages/man2/pidfd_open.2.html

``

49

49

`#[derive(Debug)]

`

``

50

`+

#[repr(transparent)]

`

50

51

`pub struct PidFd {

`

51

``

`-

inner: FileDesc,

`

``

52

`+

inner: InnerPidFd,

`

52

53

`}

`

53

54

``

54

``

`-

impl AsInner for PidFd {

`

``

55

`+

impl PidFd {

`

``

56

`+

/// Forces the child process to exit.

`

``

57

`+

///

`

``

58

`` +

/// Unlike [Child::kill] it is possible to attempt to kill

``

``

59

`+

/// reaped children since PidFd does not suffer from pid recycling

`

``

60

`+

/// races. But doing so will return an Error.

`

``

61

`+

///

`

``

62

`` +

/// [Child::kill]: process::Child::kill

``

``

63

`+

pub fn kill(&self) -> Result<()> {

`

``

64

`+

self.inner.kill()

`

``

65

`+

}

`

``

66

+

``

67

`+

/// Waits for the child to exit completely, returning the status that it exited with.

`

``

68

`+

///

`

``

69

`` +

/// Unlike [Child::wait] it does not ensure that the stdin handle is closed.

``

``

70

`` +

/// Additionally it will not return an ExitStatus if the child

``

``

71

`+

/// has already been reaped. Instead an error will be returned.

`

``

72

`+

///

`

``

73

`` +

/// [Child::wait]: process::Child::wait

``

``

74

`+

pub fn wait(&self) -> Result {

`

``

75

`+

self.inner.wait().map(FromInner::from_inner)

`

``

76

`+

}

`

``

77

+

``

78

`+

/// Attempts to collect the exit status of the child if it has already exited.

`

``

79

`+

///

`

``

80

`` +

/// Unlike [Child::try_wait] this method will return an Error

``

``

81

`+

/// if the child has already been reaped.

`

``

82

`+

///

`

``

83

`` +

/// [Child::try_wait]: process::Child::try_wait

``

``

84

`+

pub fn try_wait(&self) -> Result<Option> {

`

``

85

`+

Ok(self.inner.try_wait()?.map(FromInner::from_inner))

`

``

86

`+

}

`

``

87

`+

}

`

``

88

+

``

89

`+

impl AsInner for PidFd {

`

55

90

`#[inline]

`

56

``

`-

fn as_inner(&self) -> &FileDesc {

`

``

91

`+

fn as_inner(&self) -> &InnerPidFd {

`

57

92

`&self.inner

`

58

93

`}

`

59

94

`}

`

60

95

``

61

``

`-

impl FromInner for PidFd {

`

62

``

`-

fn from_inner(inner: FileDesc) -> PidFd {

`

``

96

`+

impl FromInner for PidFd {

`

``

97

`+

fn from_inner(inner: InnerPidFd) -> PidFd {

`

63

98

`PidFd { inner }

`

64

99

`}

`

65

100

`}

`

66

101

``

67

``

`-

impl IntoInner for PidFd {

`

68

``

`-

fn into_inner(self) -> FileDesc {

`

``

102

`+

impl IntoInner for PidFd {

`

``

103

`+

fn into_inner(self) -> InnerPidFd {

`

69

104

`self.inner

`

70

105

`}

`

71

106

`}

`

72

107

``

73

108

`impl AsRawFd for PidFd {

`

74

109

`#[inline]

`

75

110

`fn as_raw_fd(&self) -> RawFd {

`

76

``

`-

self.as_inner().as_raw_fd()

`

``

111

`+

self.as_inner().as_inner().as_raw_fd()

`

77

112

`}

`

78

113

`}

`

79

114

``

80

115

`impl FromRawFd for PidFd {

`

81

116

`unsafe fn from_raw_fd(fd: RawFd) -> Self {

`

82

``

`-

Self::from_inner(FileDesc::from_raw_fd(fd))

`

``

117

`+

Self::from_inner(InnerPidFd::from_raw_fd(fd))

`

83

118

`}

`

84

119

`}

`

85

120

``

86

121

`impl IntoRawFd for PidFd {

`

87

122

`fn into_raw_fd(self) -> RawFd {

`

88

``

`-

self.into_inner().into_raw_fd()

`

``

123

`+

self.into_inner().into_inner().into_raw_fd()

`

89

124

`}

`

90

125

`}

`

91

126

``

92

127

`impl AsFd for PidFd {

`

93

128

`fn as_fd(&self) -> BorrowedFd<'_> {

`

94

``

`-

self.as_inner().as_fd()

`

``

129

`+

self.as_inner().as_inner().as_fd()

`

95

130

`}

`

96

131

`}

`

97

132

``

98

133

`impl From for PidFd {

`

99

134

`fn from(fd: OwnedFd) -> Self {

`

100

``

`-

Self::from_inner(FileDesc::from_inner(fd))

`

``

135

`+

Self::from_inner(InnerPidFd::from_inner(FileDesc::from_inner(fd)))

`

101

136

`}

`

102

137

`}

`

103

138

``

104

139

`impl From for OwnedFd {

`

105

140

`fn from(pid_fd: PidFd) -> Self {

`

106

``

`-

pid_fd.into_inner().into_inner()

`

``

141

`+

pid_fd.into_inner().into_inner().into_inner()

`

107

142

`}

`

108

143

`}

`

109

144

``