Belle II Software  release-08-01-10
FileDescriptor.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 #include "daq/slc/system/FileDescriptor.h"
9 
10 #include <daq/slc/base/IOException.h>
11 
12 #include <unistd.h>
13 #include <sys/select.h>
14 #include <stdio.h>
15 
16 using namespace Belle2;
17 
18 FileDescriptor::FileDescriptor()
19 {
20  m_fd = -1;
21 }
22 
23 FileDescriptor::FileDescriptor(int fd)
24 {
25  m_fd = fd;
26 }
27 
28 FileDescriptor::~FileDescriptor()
29 {
30 
31 }
32 
33 int FileDescriptor::get_fd() const
34 {
35  return m_fd;
36 }
37 
38 bool FileDescriptor::select(int sec, int usec)
39 {
40  if (m_fd <= 0) {
41  return false;
42  }
43  fd_set fds;
44  FD_ZERO(&fds);
45  FD_SET(m_fd, &fds);
46  int ret;
47  if (sec >= 0 && usec >= 0) {
48  timeval t = {sec, usec};
49  ret = ::select(FD_SETSIZE, &fds, NULL, NULL, &t);
50  } else {
51  ret = ::select(FD_SETSIZE, &fds, NULL, NULL, NULL);
52  }
53  if (ret < 0) {
54  perror("select");
55  throw (IOException("Failed to select"));
56  }
57  if (FD_ISSET(m_fd, &fds)) {
58  return true;
59  } else {
60  return false;
61  }
62 }
63 
64 bool FileDescriptor::select2(int sec, int usec)
65 {
66  if (m_fd <= 0) {
67  return false;
68  }
69  fd_set fds;
70  FD_ZERO(&fds);
71  FD_SET(m_fd, &fds);
72  int ret;
73  if (sec >= 0 && usec >= 0) {
74  timeval t = {sec, usec};
75  ret = ::select(FD_SETSIZE, NULL, &fds, NULL, &t);
76  } else {
77  ret = ::select(FD_SETSIZE, NULL, &fds, NULL, NULL);
78  }
79  if (ret < 0) {
80  perror("select");
81  throw (IOException("Failed to select"));
82  }
83  if (FD_ISSET(m_fd, &fds)) {
84  return true;
85  } else {
86  return false;
87  }
88 }
89 
90 bool FileDescriptor::close()
91 {
92  if (m_fd > 0) {
93  if (::close(m_fd) != 0) {
94  return false;
95  }
96  }
97  m_fd = -1;
98  return true;
99 }
Abstract base class for different kinds of events.