Jack2  1.9.9
JackALSARawMidiUtil.cpp
1 #include <cerrno>
2 #include <cstring>
3 #include <stdexcept>
4 
5 #include <fcntl.h>
6 #include <unistd.h>
7 
8 #include "JackALSARawMidiUtil.h"
9 
10 void
11 Jack::CreateNonBlockingPipe(int *fds)
12 {
13  if (pipe(fds) == -1) {
14  throw std::runtime_error(strerror(errno));
15  }
16  try {
17  SetNonBlocking(fds[0]);
18  SetNonBlocking(fds[1]);
19  } catch (...) {
20  close(fds[1]);
21  close(fds[0]);
22  throw;
23  }
24 }
25 
26 void
27 Jack::DestroyNonBlockingPipe(int *fds)
28 {
29  close(fds[1]);
30  close(fds[0]);
31 }
32 
33 void
34 Jack::SetNonBlocking(int fd)
35 {
36  int flags = fcntl(fd, F_GETFL);
37  if (flags == -1) {
38  throw std::runtime_error(strerror(errno));
39  }
40  if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) {
41  throw std::runtime_error(strerror(errno));
42  }
43 }