]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
[CLEANUP] stream_interface: use inline functions to manipulate targets
authorWilly Tarreau <w@1wt.eu>
Thu, 10 Mar 2011 13:03:36 +0000 (14:03 +0100)
committerWilly Tarreau <w@1wt.eu>
Thu, 10 Mar 2011 22:32:17 +0000 (23:32 +0100)
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
src/backend.c
src/checks.c
src/peers.c
src/proto_http.c
src/queue.c
src/session.c
src/stream_interface.c

index 0b90fcba26164f8218386a61b9165c043c3f18eb..5c198dc15f6ba5ddc3cb9d28f3cd5bf18d7d37cd 100644 (file)
@@ -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 */
 
 /*
index 2d6e6ea3f5c74f4627baacfec810e4ac1f37dbf3..8367328a2ce880ffe2855f9e4df4641d955f8f13 100644 (file)
@@ -39,6 +39,7 @@
 #include <proto/queue.h>
 #include <proto/server.h>
 #include <proto/session.h>
+#include <proto/stream_interface.h>
 #include <proto/stream_sock.h>
 #include <proto/task.h>
 
@@ -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;
                        }
                }
index 628f3e5728fbd713226353ac0356b8204f6e3d76..521de1d4d2dc73b144738497fbee162d539cd376 100644 (file)
@@ -45,6 +45,7 @@
 #include <proto/proto_tcp.h>
 #include <proto/proxy.h>
 #include <proto/server.h>
+#include <proto/stream_interface.h>
 #include <proto/task.h>
 
 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);
index 06ad244d0e32553e47f4881d6dbd0a2315afab8d..3e07a2739414a247433a815563edf1c72a77f6e3 100644 (file)
@@ -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 */
index 72f0a41294a4d97f8adf1c9145189955913bfaa8..5275f2fdc212f343b7cdf36b88051db2f152a9d9 100644 (file)
@@ -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;
 
index c66aa6bc6d9a119d46e612abe3f85638d06ed711..4994181eeb6043fcca6e60c2cb1def1cac00b9ad 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <proto/queue.h>
 #include <proto/server.h>
+#include <proto/stream_interface.h>
 #include <proto/task.h>
 
 
@@ -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++;
index b8ae690cbad2a3bf65391f762758492f77955b19..864b788c4c8effe51032335355e58636caeffbf3 100644 (file)
@@ -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);
                                                        }
                                                }
                                        }
index d4623086910c7ca55ea29cb9aae95030f434b4df..d4bf1b895bc139b6443a655a14780c7c02ac55fe 100644 (file)
@@ -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);
 }
 
 /*