Navigation


source: freeDiameter/extensions/dbg_interactive/sessions.i @ 706:4ffbc9f1e922

Last change on this file since 706:4ffbc9f1e922 was 706:4ffbc9f1e922, checked in by Sebastien Decugis <sdecugis@nict.go.jp>, 11 years ago

Large UNTESTED commit with the following changes:

  • Improved DiameterIdentity? handling (esp. interationalization issues), and improve efficiency of some string operations in peers, sessions, and dictionary modules (closes #7)
  • Cleanup in the session module to free only unreferenced sessions (#16)
  • Removed fd_cpu_flush_cache(), replaced by more robust alternatives.
  • Improved peer state machine algorithm to counter SCTP multistream race condition.
File size: 5.9 KB
Line 
1/*********************************************************************************************************
2* Software License Agreement (BSD License)                                                               *
3* Author: Sebastien Decugis <sdecugis@nict.go.jp>                                                        *
4*                                                                                                        *
5* Copyright (c) 2010, WIDE Project and NICT                                                              *
6* All rights reserved.                                                                                   *
7*                                                                                                        *
8* Redistribution and use of this software in source and binary forms, with or without modification, are  *
9* permitted provided that the following conditions are met:                                              *
10*                                                                                                        *
11* * Redistributions of source code must retain the above                                                 *
12*   copyright notice, this list of conditions and the                                                    *
13*   following disclaimer.                                                                                *
14*                                                                                                        *
15* * Redistributions in binary form must reproduce the above                                              *
16*   copyright notice, this list of conditions and the                                                    *
17*   following disclaimer in the documentation and/or other                                               *
18*   materials provided with the distribution.                                                            *
19*                                                                                                        *
20* * Neither the name of the WIDE Project or NICT nor the                                                 *
21*   names of its contributors may be used to endorse or                                                  *
22*   promote products derived from this software without                                                  *
23*   specific prior written permission of WIDE Project and                                                *
24*   NICT.                                                                                                *
25*                                                                                                        *
26* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
27* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
28* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
29* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT     *
30* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS    *
31* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
32* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
33* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                                                             *
34*********************************************************************************************************/
35
36/* Do not include this directly, use dbg_interactive.i instead */
37
38/****** SESSIONS *********/
39
40%{
41/* call it (might be called from a different thread than the interpreter, when session times out) */
42static void call_the_python_cleanup_callback(session_state * state, os0_t sid, void * cb) {
43        PyObject *result;
44        if (!cb) {
45                fd_log_debug("Internal error: missing callback object!\n");
46                return;
47        }
48       
49        /* Call the function */
50        SWIG_PYTHON_THREAD_BEGIN_BLOCK;
51        result = PyEval_CallFunction((PyObject *)cb, "(Os)", state, sid);
52        Py_XDECREF(result);
53        SWIG_PYTHON_THREAD_END_BLOCK;
54        return;
55}
56%}
57
58struct session_handler {
59};
60
61%nodefaultctor session_handler;
62%extend session_handler {
63        session_handler(PyObject * PyCb) {
64                struct session_handler * hdl = NULL;
65                int ret;
66               
67                Py_XINCREF(PyCb);
68               
69                ret = fd_sess_handler_create_internal ( &hdl, call_the_python_cleanup_callback, PyCb );
70                if (ret != 0) {
71                        DI_ERROR(ret, NULL, NULL);
72                        return NULL;
73                }
74                return hdl;
75        }
76        ~session_handler() {
77                struct session_handler * hdl = self;
78                PyObject * cb = NULL;
79               
80                int ret = fd_sess_handler_destroy(&hdl, (void *)&cb);
81                if (ret != 0) {
82                        DI_ERROR(ret, NULL, NULL);
83                }
84                /* Now free the callback */
85                Py_XDECREF(cb);
86                return;
87        }
88        void dump() {
89                fd_sess_dump_hdl(0, $self);
90        }
91}
92
93
94struct session {
95};
96
97%extend session {
98        /* The first two versions create a new session string. The third one allow to use an existing string. */
99        session() {
100                int ret;
101                struct session * s = NULL;
102                ret = fd_sess_new(&s, fd_g_config->cnf_diamid, fd_g_config->cnf_diamid_len, (os0_t)"dbg_interactive", CONSTSTRLEN("dbg_interactive"));
103                if (ret != 0) {
104                        DI_ERROR(ret, NULL, NULL);
105                        return NULL;
106                }
107                return s;
108        }
109        session(char * diamid, char * STRING, size_t LENGTH) {
110                int ret;
111                struct session * s = NULL;
112                ret = fd_sess_new(&s, diamid, 0, (os0_t)STRING, LENGTH);
113                if (ret != 0) {
114                        DI_ERROR(ret, NULL, NULL);
115                        return NULL;
116                }
117                return s;
118        }
119        session(char * STRING, size_t LENGTH) {
120                int ret, n;
121                struct session * s = NULL;
122                ret = fd_sess_fromsid((os0_t)STRING, LENGTH, &s, &n);
123                if (ret != 0) {
124                        DI_ERROR(ret, NULL, NULL);
125                        return NULL;
126                }
127                /* When defining n as OUTPUT parameter, we get something strange... Use fd_sess_fromsid if you need it */
128                #if 0
129                if (n) {
130                        fd_log_debug("A new session has been created\n");
131                } else {
132                        fd_log_debug("A session with same id already existed\n");
133                }
134                #endif /* 0 */
135               
136                return s;
137        }
138        ~session() {
139                struct session * s = self;
140                int ret = fd_sess_reclaim(&s);
141                if (ret != 0) {
142                        DI_ERROR(ret, NULL, NULL);
143                }
144                return;
145        }
146       
147        %cstring_output_allocate_size(char ** outsid, size_t * sidlen, /* do not free */);
148        void getsid(char ** outsid, size_t * sidlen) {
149                int ret;
150                ret = fd_sess_getsid( $self, (void *)outsid, sidlen);
151                if (ret != 0) {
152                        DI_ERROR(ret, NULL, NULL);
153                        return;
154                }
155                return;
156        }
157        void settimeout(long seconds) {
158                struct timespec timeout;
159                int ret;
160                clock_gettime(CLOCK_REALTIME, &timeout);
161                timeout.tv_sec += seconds;
162                ret = fd_sess_settimeout( $self, &timeout );
163                if (ret != 0) {
164                        DI_ERROR(ret, NULL, NULL);
165                }
166        }
167        void dump() {
168                fd_sess_dump(0, $self);
169        }
170        void store(struct session_handler * handler, PyObject * DISOWN) {
171                int ret;
172                void * store = DISOWN;
173                Py_XINCREF(DISOWN);
174                ret = fd_sess_state_store_internal(handler, $self, (void *) &store);
175                if (ret != 0) {
176                        DI_ERROR(ret, NULL, NULL);
177                }
178        }
179        %newobject retrieve;
180        PyObject * retrieve(struct session_handler * handler) {
181                int ret;
182                PyObject * state = NULL;
183                ret = fd_sess_state_retrieve_internal(handler, $self, (void *) &state);
184                if (ret != 0) {
185                        DI_ERROR(ret, NULL, NULL);
186                        return NULL;
187                }
188                if (state == NULL) {
189                        Py_INCREF(Py_None);
190                        return Py_None;
191                }
192                return state;
193        }
194}       
195
Note: See TracBrowser for help on using the repository browser.