- 
                Notifications
    You must be signed in to change notification settings 
- Fork 45
          Adopt ~Copyable in Subprocess
          #38
        
          New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
  
    Adopt ~Copyable in Subprocess
  
  #38
              Conversation
821723e    to
    2754c5f      
    Compare
  
    2754c5f    to
    f126559      
    Compare
  
    | var result: Int32 = -1 | ||
| if let inputRead = inputPipe.readFileDescriptor { | ||
| result = posix_spawn_file_actions_adddup2(&fileActions, inputRead.platformDescriptor, 0) | ||
| if inputReadFileDescriptor != nil { | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Suggest using if let inputReadFileDescriptor { so you don't need the force unwrap below.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unfortunately this pattern, along with if let a = a is not compatible with ~Copyable types. Writing if let inputReadFileDescriptor would have consumed inputReadFileDescriptor so the line below would be double consume.
f126559    to
    2d28695      
    Compare
  
    2d28695    to
    7c35edb      
    Compare
  
    | Addressed review comments and removed  | 
| cleanupHandler: { error in | ||
| // Close the file descriptor | ||
| if self.closeWhenDone { | ||
| try? self.safelyClose() | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why ignore the error? That can't be quite right
| "FileDescriptor \(fileDescriptor.rawValue) is already closed" | ||
| ) | ||
| } | ||
| // Otherwise ignore the error | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this is a bad idea. Closing in deinit for file descriptors is bad enough (close may block too depending on the fd) but ignoring the errors isn't a thing we can do.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree with @weissi here FDs cannot be modeled with ~Copyable types at this point both due the async close nature and the errors on close. My recommendation is to use with-style methods which allow to solve both issues.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yup, agree with Franz. with* solves those issues correctly and also clearly for a reader of the code.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@weissi can you open up issues for your comments? This PR is merged and discussions here might be lost.
|  | ||
| internal var platformDescriptor: PlatformFileDescriptor { | ||
| deinit { | ||
| guard self.closeWhenDone else { | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks like we're hiding some lifecycle bugs here, no? We should know if we closed a file descriptor or not, right?
This PR introduces
~CopyableintoSubprocess, includingCreatedPipe,TrackedFileDescriptor, andTrackedDispatchIO.Resolves #37
Resolves #2
Additionally, we opted to slightly modify the API by moving the
.standardOutputand.standardErrorAsyncSequencefromExecutionto the closure parameter, alongsideExecution. This adjustment eliminated the necessity forAtomic(andAtomicBox) withinExecution.Furthermore, this change rendered
SequenceOutputinternal, as we now rely on overloads to infer the output and error types.This patch also drops support for
Swift 6.0because it can't properly support the~Copyablework. NowSwift 6.1is the minimal required Swift version to buildSubprocess