Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
fd.cpp
Go to the documentation of this file.
1 #include <xstream/config.h>
2 #include <xstream/posix.h>
3 #include <xstream/fd.h>
4 
5 #include <algorithm>
6 #include <streambuf>
7 
8 #include "debug.h"
9 
10 #if HAVE_FD
11 
12 namespace xstream
13 {
14  namespace fd
15  {
16 /*
17  streambuf::streambuf(xstream::posix::fd _fd):fd(_fd)
18  {
19  LOG("fd::streambuf (posix::fd)");
20  }
21 */
22  static const int eof = std::streambuf::traits_type::eof();
23  static const size_t buflen = 4000 * 1024;
24 
25  streambuf::streambuf(int f, bool c)
26  : xstream::posix::fd(f, c), rbuf(buflen), wbuf(buflen)
27  {
28  LOG("fd::streambuf (int fd)");
29 
30  //next read/write calls will call uflow overflow
31  }
32 
33  void streambuf::flush_write() {
34  LOG("fd::streambuf::flush");
35  write(wbuf.buf, taken());
36  reset_write();
37  }
38 
39  int streambuf::sync() {
40  LOG("fd::streambuf::sync");
41 
42  //write remaining data
43  flush_write();
44 
45  //physical sync data
46  xstream::posix::fd::sync();
47  //if there's an error an exception is thrown
48  //and it doesn't get here
49  return 0;
50  }
51 
52  int streambuf::overflow(int c) {
53  LOG("fd::streambuf::overflow (" << c << ")");
54 
55  if (eof == c) {
56  return eof;
57  }
58 
59  flush_write();
60  *pptr() = static_cast < char >(c);
61  pbump (1);
62  return c;
63  }
64 
65  std::streamsize streambuf::xsputn(const char* buffer, std::streamsize n)
66  {
67  flush_write();
68  std::streamsize count = write(buffer, n);
69  return count;
70  }
71 
72  int streambuf::underflow() {
73  LOG("fd::streambuf::underflow");
74 
75  std::streamsize nread = read(rbuf.buf,rbuf.size);
76 
77  setg(rbuf.buf, rbuf.buf, rbuf.buf + nread);
78 
79  if (0 == nread) {
80  return eof;
81  } else {
82  return static_cast<int>(*rbuf.buf);
83  }
84  }
85 
86  std::streamsize streambuf::xsgetn(char *buffer, std::streamsize n) {
87  LOG("fd::streambuf::xsgetn " << n);
88  std::streamsize av = available();
89 
90  std::streamsize nread=0;
91 
92  char* beg = gptr();
93  char* end = egptr();
94 
95  bool need_read=true;
96 
97  if (av >= n) {
98  end = beg + n;
99  need_read = false;
100  }
101 
102  //copy buffered data to suplied buffer
103  std::copy(beg, end, buffer);
104  nread = end - beg;
105  setg(rbuf.buf, end, rbuf.buf + rbuf.size);
106 
107  if (need_read) {
108  nread += read(buffer + av, n - av);
109  }
110  LOG("\tread " << nread);
111  return nread;
112  }
113 
114  void streambuf::reset_write()
115  {
116  setp(wbuf.buf, wbuf.buf + wbuf.size);
117  }
118 
119  streambuf::~streambuf() {
120  LOG("fd::~streambuf");
121 
122  if (taken() > 0) {
123  sync();
124  }
125  }
126  } //namespace fd
127 } //namespace xstream
128 
129 #endif
debugging/logging support
#define c
TF1 * f
Definition: FitGains.C:21
streambuf(int fd, bool close=true)
construct specifying the file descriptor
static const int eof
Definition: base64.cpp:14
C++ streambuf to work with file descriptors.
POSIX helper objects and functions.
#define LOG(s)
Definition: debug.h:30