template <class C, typename... Args>
class CtFun : public Ct<C> {
private:
- using fn = Ct<C> *(C::*)(Args...);
- fn _f;
+ using fn_t = Ct<C> *(C::*)(Args...);
+ fn_t _f;
std::tuple<Args...> _params;
template <std::size_t... Is>
}
public:
- CtFun(fn f) : _f(f) {}
+ CtFun(fn_t f) : _f(f) {}
inline void setParams(Args... args) { _params = std::make_tuple(args...); }
inline Ct<C> *call(C *foo) const override {
}
};
+
+template <class C> using CONTINUATION_TYPE = CtFun<C>;
+template <class C> using CONTINUATION_TX_TYPE = CtFun<C, int>;
+template <class C> using CONTINUATION_RX_TYPE = CtFun<C, char*, int>;
+
#define CONTINUATION_DECL(C, F, ...) \
CtFun<C, ##__VA_ARGS__> F##_cont { (&C::F) };
-#define CONTINUATION_PARAM(V, C, ...) CtFun<C, ##__VA_ARGS__> &V##_cont
-
#define CONTINUATION(F) F##_cont
#define CONTINUE(F, ...) (F##_cont.setParams(__VA_ARGS__), &F##_cont)
}
}
-CtPtr ProtocolV1::read(CONTINUATION_PARAM(next, ProtocolV1, char *, int),
+CtPtr ProtocolV1::read(CONTINUATION_RX_TYPE<ProtocolV1> &next,
int len, char *buffer) {
if (!buffer) {
buffer = temp_buffer;
}
ssize_t r = connection->read(len, buffer,
- [&CONTINUATION(next), this](char *buffer, int r) {
- CONTINUATION(next).setParams(buffer, r);
- CONTINUATION_RUN(CONTINUATION(next));
+ [&next, this](char *buffer, int r) {
+ next.setParams(buffer, r);
+ CONTINUATION_RUN(next);
});
if (r <= 0) {
- return CONTINUE(next, buffer, r);
+ next.setParams(buffer, r);
+ return &next;
}
return nullptr;
}
-CtPtr ProtocolV1::write(CONTINUATION_PARAM(next, ProtocolV1, int),
+CtPtr ProtocolV1::write(CONTINUATION_TX_TYPE<ProtocolV1> &next,
bufferlist &buffer) {
- ssize_t r = connection->write(buffer, [&CONTINUATION(next), this](int r) {
- CONTINUATION(next).setParams(r);
- CONTINUATION_RUN(CONTINUATION(next));
+ ssize_t r = connection->write(buffer, [&next, this](int r) {
+ next.setParams(r);
+ CONTINUATION_RUN(next);
});
if (r <= 0) {
- return CONTINUE(next, r);
+ next.setParams(r);
+ return &next;
}
return nullptr;
State state;
void run_continuation(CtPtr pcontinuation);
- CtPtr read(CONTINUATION_PARAM(next, ProtocolV1, char *, int), int len,
+ CtPtr read(CONTINUATION_RX_TYPE<ProtocolV1> &next, int len,
char *buffer = nullptr);
- CtPtr write(CONTINUATION_PARAM(next, ProtocolV1, int), bufferlist &bl);
+ CtPtr write(CONTINUATION_TX_TYPE<ProtocolV1> &next,bufferlist &bl);
inline CtPtr _fault() { // helper fault method that stops continuation
fault();
return nullptr;
}
}
-CtPtr ProtocolV2::read(CONTINUATION_PARAM(next, ProtocolV2, char *, int),
+CtPtr ProtocolV2::read(CONTINUATION_RX_TYPE<ProtocolV2> &next,
int len, char *buffer) {
if (!buffer) {
buffer = temp_buffer;
}
- ssize_t r = connection->read(len, buffer,
- [&CONTINUATION(next), this](char *buffer, int r) {
- CONTINUATION(next).setParams(buffer, r);
- run_continuation(CONTINUATION(next));
+ [&next, this](char *buffer, int r) {
+ next.setParams(buffer, r);
+ run_continuation(next);
});
if (r <= 0) {
- return CONTINUE(next, buffer, r);
+ next.setParams(buffer, r);
+ return &next;
}
return nullptr;
template <class F>
CtPtr ProtocolV2::write(const std::string &desc,
- CONTINUATION_PARAM(next, ProtocolV2),
+ CONTINUATION_TYPE<ProtocolV2> &next,
F &frame) {
ceph::bufferlist bl = frame.get_buffer(session_stream_handlers);
- return write(desc, CONTINUATION(next), bl);
+ return write(desc, next, bl);
}
CtPtr ProtocolV2::write(const std::string &desc,
- CONTINUATION_PARAM(next, ProtocolV2),
+ CONTINUATION_TYPE<ProtocolV2> &next,
bufferlist &buffer) {
ssize_t r =
- connection->write(buffer, [&CONTINUATION(next), desc, this](int r) {
+ connection->write(buffer, [&next, desc, this](int r) {
if (r < 0) {
ldout(cct, 1) << __func__ << " " << desc << " write failed r=" << r
<< " (" << cpp_strerror(r) << ")" << dendl;
connection->inject_delay();
_fault();
}
- run_continuation(CONTINUATION(next));
+ run_continuation(next);
});
if (r <= 0) {
<< " (" << cpp_strerror(r) << ")" << dendl;
return _fault();
}
- return CONTINUE(next);
+ next.setParams();
+ return &next;
}
return nullptr;
void run_continuation(Ct<ProtocolV2> *pcontinuation);
void run_continuation(Ct<ProtocolV2> &continuation);
- Ct<ProtocolV2> *read(CONTINUATION_PARAM(next, ProtocolV2, char *, int),
+ Ct<ProtocolV2> *read(CONTINUATION_RX_TYPE<ProtocolV2> &next,
int len, char *buffer = nullptr);
template <class F>
Ct<ProtocolV2> *write(const std::string &desc,
- CONTINUATION_PARAM(next, ProtocolV2), F &frame);
+ CONTINUATION_TYPE<ProtocolV2> &next,
+ F &frame);
Ct<ProtocolV2> *write(const std::string &desc,
- CONTINUATION_PARAM(next, ProtocolV2),
+ CONTINUATION_TYPE<ProtocolV2> &next,
bufferlist &buffer);
void requeue_sent();