From 9e000c6ec8820c2eb1c289c03fac35b1bbda1503 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 10 Mar 2011 14:03:36 +0100 Subject: [PATCH] [CLEANUP] stream_interface: use inline functions to manipulate targets The connection target involves a type and a union of pointers, let's make the code cleaner using simple wrappers. --- include/proto/stream_interface.h | 41 ++++++++++++++++++++++++++++++++ src/backend.c | 21 +++++++--------- src/checks.c | 4 ++-- src/peers.c | 9 +++---- src/proto_http.c | 12 ++++------ src/queue.c | 4 ++-- src/session.c | 12 ++++------ src/stream_interface.c | 12 ++++------ 8 files changed, 68 insertions(+), 47 deletions(-) diff --git a/include/proto/stream_interface.h b/include/proto/stream_interface.h index 0b90fcba2..5c198dc15 100644 --- a/include/proto/stream_interface.h +++ b/include/proto/stream_interface.h @@ -47,6 +47,47 @@ struct task *stream_int_register_handler_task(struct stream_interface *si, struct task *(*fct)(struct task *)); void stream_int_unregister_handler(struct stream_interface *si); +static inline void clear_target(struct target *dest) +{ + dest->type = TARG_TYPE_NONE; + dest->ptr.v = NULL; +} + +static inline void set_target_server(struct target *dest, struct server *s) +{ + dest->type = TARG_TYPE_SERVER; + dest->ptr.s = s; +} + +static inline void set_target_proxy(struct target *dest, struct proxy *p) +{ + dest->type = TARG_TYPE_PROXY; + dest->ptr.p = p; +} + +static inline void set_target_applet(struct target *dest, struct si_applet *a) +{ + dest->type = TARG_TYPE_APPLET; + dest->ptr.a = a; +} + +static inline void set_target_task(struct target *dest, struct task *t) +{ + dest->type = TARG_TYPE_TASK; + dest->ptr.t = t; +} + +static inline struct target *copy_target(struct target *dest, struct target *src) +{ + *dest = *src; + return dest; +} + +static inline int target_match(struct target *a, struct target *b) +{ + return a->type == b->type && a->ptr.v == b->ptr.v; +} + #endif /* _PROTO_STREAM_INTERFACE_H */ /* diff --git a/src/backend.c b/src/backend.c index 2d6e6ea3f..8367328a2 100644 --- a/src/backend.c +++ b/src/backend.c @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -493,8 +494,7 @@ int assign_server(struct session *s) */ s->srv = NULL; - s->target.type = TARG_TYPE_NONE; - s->target.ptr.v = NULL; + clear_target(&s->target); if (s->be->lbprm.algo & BE_LB_KIND) { int len; @@ -617,17 +617,14 @@ int assign_server(struct session *s) s->srv->counters.cum_lbconn++; } - s->target.type = TARG_TYPE_SERVER; - s->target.ptr.s = s->srv; + set_target_server(&s->target, s->srv); } else if ((s->be->options2 & PR_O2_DISPATCH) || (s->be->options & PR_O_TRANSP)) { - s->target.type = TARG_TYPE_PROXY; - s->target.ptr.p = s->be; + set_target_proxy(&s->target, s->be); } else if ((s->be->options & PR_O_HTTP_PROXY) && s->req->cons->addr.s.to.sin_addr.s_addr) { /* in proxy mode, we need a valid destination address */ - s->target.type = TARG_TYPE_PROXY; - s->target.ptr.p = s->be; + set_target_proxy(&s->target, s->be); } else { err = SRV_STATUS_NOSRV; @@ -951,7 +948,7 @@ int connect_server(struct session *s) */ stream_sock_prepare_interface(s->req->cons); s->req->cons->connect = tcpv4_connect_server; - s->req->cons->target = s->target; + copy_target(&s->req->cons->target, &s->target); assign_tproxy_address(s); @@ -1107,16 +1104,14 @@ int tcp_persist_rdp_cookie(struct session *s, struct buffer *req, int an_bit) if (*p != '.') goto no_cookie; - s->target.type = TARG_TYPE_NONE; - s->target.ptr.v = NULL; + clear_target(&s->target); while (srv) { if (memcmp(&addr, &(srv->addr), sizeof(addr)) == 0) { if ((srv->state & SRV_RUNNING) || (px->options & PR_O_PERSIST)) { /* we found the server and it is usable */ s->flags |= SN_DIRECT | SN_ASSIGNED; s->srv = srv; - s->target.type = TARG_TYPE_SERVER; - s->target.ptr.s = s->srv; + set_target_server(&s->target, srv); break; } } diff --git a/src/checks.c b/src/checks.c index 628f3e572..521de1d4d 100644 --- a/src/checks.c +++ b/src/checks.c @@ -45,6 +45,7 @@ #include #include #include +#include #include static int httpchk_expect(struct server *s, int done); @@ -349,8 +350,7 @@ static int check_for_pending(struct server *s) if (!p) break; p->sess->srv = s; - p->sess->target.ptr.s = s; - p->sess->target.type = TARG_TYPE_SERVER; + set_target_server(&p->sess->target, s); sess = p->sess; pendconn_free(p); task_wakeup(sess->task, TASK_WOKEN_RES); diff --git a/src/peers.c b/src/peers.c index 06ad244d0..3e07a2739 100644 --- a/src/peers.c +++ b/src/peers.c @@ -1157,8 +1157,7 @@ struct session *peer_session_create(struct peer *peer, struct peer_session *ps) s->si[0].err_type = SI_ET_NONE; s->si[0].err_loc = NULL; s->si[0].connect = NULL; - s->si[0].target.ptr.v = NULL; - s->si[0].target.type = TARG_TYPE_NONE; + clear_target(&s->si[0].target); s->si[0].exp = TICK_ETERNITY; s->si[0].flags = SI_FL_NONE; if (s->fe->options2 & PR_O2_INDEPSTR) @@ -1176,8 +1175,7 @@ struct session *peer_session_create(struct peer *peer, struct peer_session *ps) s->si[1].err_type = SI_ET_NONE; s->si[1].err_loc = NULL; s->si[1].connect = tcpv4_connect_server; - s->si[1].target.ptr.p = s->be; - s->si[1].target.type = TARG_TYPE_PROXY; + set_target_proxy(&s->si[1].target, s->be); s->si[1].exp = TICK_ETERNITY; s->si[1].flags = SI_FL_NONE; if (s->be->options2 & PR_O2_INDEPSTR) @@ -1187,8 +1185,7 @@ struct session *peer_session_create(struct peer *peer, struct peer_session *ps) s->si[1].release = NULL; s->srv = s->srv_conn = NULL; - s->target.type = TARG_TYPE_NONE; - s->target.ptr.v = NULL; + clear_target(&s->target); s->pend_pos = NULL; /* init store persistence */ diff --git a/src/proto_http.c b/src/proto_http.c index 72f0a4129..5275f2fdc 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -3949,8 +3949,7 @@ void http_end_txn_clean_session(struct session *s) if (unlikely(s->srv_conn)) sess_change_server(s, NULL); s->srv = NULL; - s->target.type = TARG_TYPE_NONE; - s->target.ptr.v = NULL; + clear_target(&s->target); s->req->cons->state = s->req->cons->prev_state = SI_ST_INI; s->req->cons->fd = -1; /* just to help with debugging */ @@ -5964,8 +5963,7 @@ void manage_client_side_appsession(struct session *t, const char *buf, int len) txn->flags |= (srv->state & SRV_RUNNING) ? TX_CK_VALID : TX_CK_DOWN; t->flags |= SN_DIRECT | SN_ASSIGNED; t->srv = srv; - t->target.type = TARG_TYPE_SERVER; - t->target.ptr.s = srv; + set_target_server(&t->target, srv); break; } else { @@ -6376,8 +6374,7 @@ void manage_client_side_cookies(struct session *t, struct buffer *req) txn->flags |= (srv->state & SRV_RUNNING) ? TX_CK_VALID : TX_CK_DOWN; t->flags |= SN_DIRECT | SN_ASSIGNED; t->srv = srv; - t->target.type = TARG_TYPE_SERVER; - t->target.ptr.s = srv; + set_target_server(&t->target, srv); break; } else { /* we found a server, but it's down, @@ -7542,8 +7539,7 @@ void http_reset_txn(struct session *s) s->be = s->fe; s->logs.logwait = s->fe->to_log; s->srv = s->srv_conn = NULL; - s->target.type = TARG_TYPE_NONE; - s->target.ptr.v = NULL; + clear_target(&s->target); /* re-init store persistence */ s->store_count = 0; diff --git a/src/queue.c b/src/queue.c index c66aa6bc6..4994181ee 100644 --- a/src/queue.c +++ b/src/queue.c @@ -16,6 +16,7 @@ #include #include +#include #include @@ -122,8 +123,7 @@ struct session *pendconn_get_next_sess(struct server *srv, struct proxy *px) /* we want to note that the session has now been assigned a server */ sess->flags |= SN_ASSIGNED; - sess->target.type = TARG_TYPE_SERVER; - sess->target.ptr.s = srv; + set_target_server(&sess->target, srv); sess->srv = srv; sess->srv_conn = srv; srv->served++; diff --git a/src/session.c b/src/session.c index b8ae690cb..864b788c4 100644 --- a/src/session.c +++ b/src/session.c @@ -168,8 +168,7 @@ int session_accept(struct listener *l, int cfd, struct sockaddr_storage *addr) s->si[0].err_loc = NULL; s->si[0].connect = NULL; s->si[0].release = NULL; - s->si[0].target.type = TARG_TYPE_NONE; - s->si[0].target.ptr.v = NULL; + clear_target(&s->si[0].target); s->si[0].exp = TICK_ETERNITY; s->si[0].flags = SI_FL_NONE; @@ -192,8 +191,7 @@ int session_accept(struct listener *l, int cfd, struct sockaddr_storage *addr) s->si[1].err_loc = NULL; s->si[1].connect = NULL; s->si[1].release = NULL; - s->si[1].target.type = TARG_TYPE_NONE; - s->si[1].target.ptr.v = NULL; + clear_target(&s->si[1].target); s->si[1].shutr = stream_int_shutr; s->si[1].shutw = stream_int_shutw; s->si[1].exp = TICK_ETERNITY; @@ -203,8 +201,7 @@ int session_accept(struct listener *l, int cfd, struct sockaddr_storage *addr) s->si[1].flags |= SI_FL_INDEP_STR; s->srv = s->srv_conn = NULL; - s->target.type = TARG_TYPE_NONE; - s->target.ptr.v = NULL; + clear_target(&s->target); s->pend_pos = NULL; /* init store persistence */ @@ -1067,8 +1064,7 @@ int process_sticking_rules(struct session *s, struct buffer *req, int an_bit) (s->flags & SN_FORCE_PRST)) { s->flags |= SN_DIRECT | SN_ASSIGNED; s->srv = srv; - s->target.type = TARG_TYPE_SERVER; - s->target.ptr.s = srv; + set_target_server(&s->target, srv); } } } diff --git a/src/stream_interface.c b/src/stream_interface.c index d46230869..d4bf1b895 100644 --- a/src/stream_interface.c +++ b/src/stream_interface.c @@ -314,8 +314,7 @@ struct task *stream_int_register_handler(struct stream_interface *si, struct si_ si->chk_rcv = stream_int_chk_rcv; si->chk_snd = stream_int_chk_snd; si->connect = NULL; - si->target.type = TARG_TYPE_APPLET; - si->target.ptr.a = app; + set_target_applet(&si->target, app); si->applet.state = 0; si->release = NULL; si->flags |= SI_FL_WAIT_DATA; @@ -342,8 +341,7 @@ struct task *stream_int_register_handler_task(struct stream_interface *si, si->chk_rcv = stream_int_chk_rcv; si->chk_snd = stream_int_chk_snd; si->connect = NULL; - si->target.type = TARG_TYPE_NONE; - si->target.ptr.v = NULL; + clear_target(&si->target); si->release = NULL; si->flags |= SI_FL_WAIT_DATA; @@ -352,8 +350,7 @@ struct task *stream_int_register_handler_task(struct stream_interface *si, if (!t) return t; - si->target.type = TARG_TYPE_TASK; - si->target.ptr.t = t; + set_target_task(&si->target, t); t->process = fct; t->context = si; @@ -375,8 +372,7 @@ void stream_int_unregister_handler(struct stream_interface *si) } si->release = NULL; si->owner = NULL; - si->target.type = TARG_TYPE_NONE; - si->target.ptr.v = NULL; + clear_target(&si->target); } /*