1 /*
2  * include/proto/session.h
3  * This file defines everything related to sessions.
4  *
5  * Copyright (C) 2000-2015 Willy Tarreau - w@1wt.eu
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation, version 2.1
10  * exclusively.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
20  */
21 
22 #ifndef _PROTO_SESSION_H
23 #define _PROTO_SESSION_H
24 
25 #include <common/config.h>
26 #include <common/buffer.h>
27 #include <common/debug.h>
28 #include <common/memory.h>
29 
30 #include <types/global.h>
31 #include <types/session.h>
32 
33 #include <proto/stick_table.h>
34 
35 extern struct pool_head *pool_head_session;
36 struct session *session_new(struct proxy *fe, struct listener *li, enum obj_type *origin);
37 void session_free(struct session *sess);
38 int init_session();
39 int session_accept_fd(struct listener *l, int cfd, struct sockaddr_storage *addr);
40 
41 /* Remove the refcount from the session to the tracked counters, and clear the
42  * pointer to ensure this is only performed once. The caller is responsible for
43  * ensuring that the pointer is valid first.
44  */
session_store_counters(struct session * sess)45 static inline void session_store_counters(struct session *sess)
46 {
47 	void *ptr;
48 	int i;
49 	struct stksess *ts;
50 
51 	for (i = 0; i < MAX_SESS_STKCTR; i++) {
52 		struct stkctr *stkctr = &sess->stkctr[i];
53 
54 		ts = stkctr_entry(stkctr);
55 		if (!ts)
56 			continue;
57 
58 		ptr = stktable_data_ptr(stkctr->table, ts, STKTABLE_DT_CONN_CUR);
59 		if (ptr) {
60 			HA_RWLOCK_WRLOCK(STK_SESS_LOCK, &ts->lock);
61 
62 			if (stktable_data_cast(ptr, conn_cur) > 0)
63 				stktable_data_cast(ptr, conn_cur)--;
64 
65 			HA_RWLOCK_WRUNLOCK(STK_SESS_LOCK, &ts->lock);
66 
67 			/* If data was modified, we need to touch to re-schedule sync */
68 			stktable_touch_local(stkctr->table, ts, 0);
69 		}
70 
71 		stkctr_set_entry(stkctr, NULL);
72 		stksess_kill_if_expired(stkctr->table, ts, 1);
73 	}
74 }
75 
76 
77 #endif /* _PROTO_SESSION_H */
78 
79 /*
80  * Local variables:
81  *  c-indent-level: 8
82  *  c-basic-offset: 8
83  * End:
84  */
85