Tamer
C++ language extensions for event-driven programming
Loading...
Searching...
No Matches
fdh.hh
1#ifndef TAMER_FDH_HH
2#define TAMER_FDH_HH 1
3#include <tamer/tamer.hh>
4#include <tamer/lock.hh>
5#include <tamer/ref.hh>
6#include <tamer/fd.hh>
7#include <tamer/fdhmsg.hh>
8#include <sys/types.h>
9#include <sys/stat.h>
10#include <limits.h>
11#include <stdio.h>
12#include <list>
13namespace tamer {
14
15class fdhelper { public:
16
17 fdhelper()
18 : _p(new fdhimp) {
19 }
20
21 void open(const std::string &fname, int flags, mode_t mode,
22 const event<int> &fd) {
23 _p->open(fname, flags, mode, fd);
24 }
25 void fstat(int fd, struct stat &stat_out, const event<int> &done) {
26 _p->fstat(fd, stat_out, done);
27 }
28 void read(int fd, void *buf, size_t size, size_t &nread, const event<int> &done) {
29 _p->read(fd, buf, size, nread, done);
30 }
31 void write(int fd, const void *buf, size_t size, size_t &nwritten, const event<int> &done) {
32 _p->write(fd, buf, size, nwritten, done);
33 }
34
35 private:
36
37 struct fdh {
38 union {
39 fdh_msg msg;
40 char buf[PATH_MAX + FDH_MSG_SIZE];
41 } _u;
42 pid_t _pid;
43 fd _fd;
44
45 fdh();
46 bool ok() const {
47 return _pid > 0 && _fd;
48 }
49
50 inline void send(int fd, size_t size, const event<int> &done) {
51 _fd.sendmsg(_u.buf, size, fd, done);
52 }
53 void recv(int *fd, size_t size, event<int> done);
54
55 class closure__recv__PikQi_; void recv(closure__recv__PikQi_ &);
56 };
57
58 struct fdhimp : public enable_ref_ptr {
59 int _min;
60 int _count;
61 int _max;
62
63 std::list<fdh *> _helpers;
64 std::list<fdh *> _ready;
65 std::list<event<> > _waiting;
66
67 fdhimp();
68 ~fdhimp();
69
70 void get(event<fdh *> done);
71 void put(fdh *h) {
72 _ready.push_back(h);
73 if (_waiting.size()) {
74 _waiting.front().trigger();
75 _waiting.pop_front();
76 }
77 }
78
79 void open(std::string fname, int flags, mode_t mode, event<int> fd);
80 void fstat(int fd, struct stat &stat_out, event<int> done);
81 void read(int fd, void *buf, size_t size, size_t &nread, event<int> done);
82 void write(int fd, const void *buf, size_t size, size_t &nwritten, event<int> done);
83
84 class closure__get__QP3fdh_; void get(closure__get__QP3fdh_ &);
85 class closure__open__Ssi6mode_tQi_; void open(closure__open__Ssi6mode_tQi_ &);
86 class closure__fstat__iR4statQi_; void fstat(closure__fstat__iR4statQi_ &);
87 class closure__read__iPvkRkQi_; void read(closure__read__iPvkRkQi_ &);
88 class closure__write__iPKvkRkQi_; void write(closure__write__iPKvkRkQi_ &);
89 };
90
91 ref_ptr<fdhimp> _p;
92
93};
94
95}
96#endif /* TAMER_FDH_HH */
Event-based file descriptor wrapper class.
Classes for event-based synchronization.
Namespace containing public Tamer classes and functions for the Tamer core.
Definition adapter.hh:17
The main Tamer header file.