diff options
| author | Garrett D'Amore <garrett@damore.org> | 2017-09-25 12:49:10 -0700 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2017-09-27 14:38:12 -0700 |
| commit | 64db0f085be0c9efc6dca8d9e72d3e5a47cb792e (patch) | |
| tree | 475520498d8ebe9e47e9785d8f9d209c87582400 /src/protocol/reqrep | |
| parent | 86a96e5bf1b207a8b1aa925e1d9f73ce834505b8 (diff) | |
| download | nng-64db0f085be0c9efc6dca8d9e72d3e5a47cb792e.tar.gz nng-64db0f085be0c9efc6dca8d9e72d3e5a47cb792e.tar.bz2 nng-64db0f085be0c9efc6dca8d9e72d3e5a47cb792e.zip | |
Refactor option handling APIs.
This makes the APIs use string keys, and largely eliminates the use of
integer option IDs altogether. The underlying registration for options
is also now a bit richer, letting protcols and transports declare the
actual options they use, rather than calling down into each entry point
carte blanche and relying on ENOTSUP.
This code may not be as fast as the integers was, but it is more intuitive,
easier to extend, and is not on any hot code paths. (If you're diddling
options on a hot code path you're doing something wrong.)
Diffstat (limited to 'src/protocol/reqrep')
| -rw-r--r-- | src/protocol/reqrep/rep.c | 56 | ||||
| -rw-r--r-- | src/protocol/reqrep/req.c | 88 |
2 files changed, 94 insertions, 50 deletions
diff --git a/src/protocol/reqrep/rep.c b/src/protocol/reqrep/rep.c index 6641c58f..cd9411d9 100644 --- a/src/protocol/reqrep/rep.c +++ b/src/protocol/reqrep/rep.c @@ -343,32 +343,36 @@ rep_pipe_putq_cb(void *arg) } static int -rep_sock_setopt(void *arg, int opt, const void *buf, size_t sz) +rep_sock_setopt_raw(void *arg, const void *buf, size_t sz) { - rep_sock *s = arg; - int rv = NNG_ENOTSUP; - - if (opt == nng_optid_maxttl) { - rv = nni_setopt_int(&s->ttl, buf, sz, 1, 255); - } else if (opt == nng_optid_raw) { - rv = nni_setopt_int(&s->raw, buf, sz, 0, 1); + rep_sock *s = arg; + int rv; + rv = nni_setopt_int(&s->raw, buf, sz, 0, 1); + if (rv == 0) { nni_sock_senderr(s->sock, s->raw ? 0 : NNG_ESTATE); } return (rv); } static int -rep_sock_getopt(void *arg, int opt, void *buf, size_t *szp) +rep_sock_getopt_raw(void *arg, void *buf, size_t *szp) { - rep_sock *s = arg; - int rv = NNG_ENOTSUP; + rep_sock *s = arg; + return (nni_getopt_int(s->raw, buf, szp)); +} - if (opt == nng_optid_maxttl) { - rv = nni_getopt_int(s->ttl, buf, szp); - } else if (opt == nng_optid_raw) { - rv = nni_getopt_int(s->raw, buf, szp); - } - return (rv); +static int +rep_sock_setopt_maxttl(void *arg, const void *buf, size_t sz) +{ + rep_sock *s = arg; + return (nni_setopt_int(&s->ttl, buf, sz, 1, 255)); +} + +static int +rep_sock_getopt_maxttl(void *arg, void *buf, size_t *szp) +{ + rep_sock *s = arg; + return (nni_getopt_int(s->ttl, buf, szp)); } static nni_msg * @@ -445,13 +449,27 @@ static nni_proto_pipe_ops rep_pipe_ops = { .pipe_stop = rep_pipe_stop, }; +static nni_proto_sock_option rep_sock_options[] = { + { + .pso_name = NNG_OPT_RAW, + .pso_getopt = rep_sock_getopt_raw, + .pso_setopt = rep_sock_setopt_raw, + }, + { + .pso_name = NNG_OPT_MAXTTL, + .pso_getopt = rep_sock_getopt_maxttl, + .pso_setopt = rep_sock_setopt_maxttl, + }, + // terminate list + { NULL, NULL, NULL }, +}; + static nni_proto_sock_ops rep_sock_ops = { .sock_init = rep_sock_init, .sock_fini = rep_sock_fini, .sock_open = rep_sock_open, .sock_close = rep_sock_close, - .sock_setopt = rep_sock_setopt, - .sock_getopt = rep_sock_getopt, + .sock_options = rep_sock_options, .sock_rfilter = rep_sock_rfilter, .sock_sfilter = rep_sock_sfilter, }; diff --git a/src/protocol/reqrep/req.c b/src/protocol/reqrep/req.c index c2008a9a..7d47b0b3 100644 --- a/src/protocol/reqrep/req.c +++ b/src/protocol/reqrep/req.c @@ -15,8 +15,9 @@ #include "core/nng_impl.h" // Request protocol. The REQ protocol is the "request" side of a -// request-reply pair. This is useful for building RPC clients, for -// example. +// request-reply pair. This is useful for building RPC clients, for example. + +const char *nng_opt_req_resendtime = NNG_OPT_REQ_RESENDTIME; typedef struct req_pipe req_pipe; typedef struct req_sock req_sock; @@ -245,44 +246,50 @@ req_pipe_stop(void *arg) } static int -req_sock_setopt(void *arg, int opt, const void *buf, size_t sz) +req_sock_setopt_raw(void *arg, const void *buf, size_t sz) { - req_sock *s = arg; - int rv = NNG_ENOTSUP; - - if (opt == nng_optid_req_resendtime) { - rv = nni_setopt_usec(&s->retry, buf, sz); - - } else if (opt == nng_optid_raw) { - rv = nni_setopt_int(&s->raw, buf, sz, 0, 1); - if (rv == 0) { - nni_sock_recverr(s->sock, s->raw ? 0 : NNG_ESTATE); - } - - } else if (opt == nng_optid_maxttl) { - rv = nni_setopt_int(&s->ttl, buf, sz, 1, 255); + req_sock *s = arg; + int rv; + rv = nni_setopt_int(&s->raw, buf, sz, 0, 1); + if (rv == 0) { + nni_sock_recverr(s->sock, s->raw ? 0 : NNG_ESTATE); } - return (rv); } static int -req_sock_getopt(void *arg, int opt, void *buf, size_t *szp) +req_sock_getopt_raw(void *arg, void *buf, size_t *szp) { - req_sock *s = arg; - int rv = NNG_ENOTSUP; + req_sock *s = arg; + return (nni_getopt_int(s->raw, buf, szp)); +} - if (opt == nng_optid_req_resendtime) { - rv = nni_getopt_usec(s->retry, buf, szp); +static int +req_sock_setopt_maxttl(void *arg, const void *buf, size_t sz) +{ + req_sock *s = arg; + return (nni_setopt_int(&s->ttl, buf, sz, 1, 255)); +} - } else if (opt == nng_optid_raw) { - rv = nni_getopt_int(s->raw, buf, szp); +static int +req_sock_getopt_maxttl(void *arg, void *buf, size_t *szp) +{ + req_sock *s = arg; + return (nni_getopt_int(s->ttl, buf, szp)); +} - } else if (opt == nng_optid_maxttl) { - rv = nni_getopt_int(s->ttl, buf, szp); - } +static int +req_sock_setopt_resendtime(void *arg, const void *buf, size_t sz) +{ + req_sock *s = arg; + return (nni_setopt_usec(&s->retry, buf, sz)); +} - return (rv); +static int +req_sock_getopt_resendtime(void *arg, void *buf, size_t *szp) +{ + req_sock *s = arg; + return (nni_getopt_usec(s->retry, buf, szp)); } // Raw and cooked mode differ in the way they send messages out. @@ -597,13 +604,32 @@ static nni_proto_pipe_ops req_pipe_ops = { .pipe_stop = req_pipe_stop, }; +static nni_proto_sock_option req_sock_options[] = { + { + .pso_name = NNG_OPT_RAW, + .pso_getopt = req_sock_getopt_raw, + .pso_setopt = req_sock_setopt_raw, + }, + { + .pso_name = NNG_OPT_MAXTTL, + .pso_getopt = req_sock_getopt_maxttl, + .pso_setopt = req_sock_setopt_maxttl, + }, + { + .pso_name = NNG_OPT_REQ_RESENDTIME, + .pso_getopt = req_sock_getopt_resendtime, + .pso_setopt = req_sock_setopt_resendtime, + }, + // terminate list + { NULL, NULL, NULL }, +}; + static nni_proto_sock_ops req_sock_ops = { .sock_init = req_sock_init, .sock_fini = req_sock_fini, .sock_open = req_sock_open, .sock_close = req_sock_close, - .sock_setopt = req_sock_setopt, - .sock_getopt = req_sock_getopt, + .sock_options = req_sock_options, .sock_rfilter = req_sock_rfilter, .sock_sfilter = req_sock_sfilter, }; |
