memory access syncing protection added
[sip-router] / modules / tm / h_table.h
1 /*
2  * $Id$
3  */
4
5
6 #ifndef _H_TABLE_H
7 #define _H_TABLE_H
8
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <pthread.h>
12 #include <arpa/inet.h>
13
14 #include "../../msg_parser.h"
15 #include "../../types.h"
16 #include "config.h"
17
18 struct s_table;
19 struct entry;
20 struct cell;
21 struct timer;
22
23 #include "sh_malloc.h"
24
25 #include "timer.h"
26 #include "lock.h"
27 #include "sip_msg.h"
28
29
30 #define T_UNDEFINED     ( (struct cell*) -1 )
31 #define T_NULL          ( (struct cell*) 0 )
32
33
34
35 typedef struct retrans_buff
36 {
37         char               *retr_buffer;
38         int                  bufflen;
39
40         struct sockaddr_in to;
41         size_t tolen;
42
43         /* a message can be linked just to retransmission and FR list */
44         struct timer_link retr_timer;
45         struct timer_link fr_timer;
46
47         /*the cell that containes this retrans_buff*/
48         struct cell* my_T;
49
50         enum lists retr_list;
51         /* set to status code if the buffer is a reply, 0 if request */
52         int reply;
53
54 }retrans_buff_type;
55
56
57 /* transaction context */
58
59 typedef struct cell
60 {
61         /* linking data */
62         struct cell*     next_cell;
63         struct cell*     prev_cell;
64
65         /* indicates which process is currently processing this transaction */
66         process_bm_t    ref_bitmap;
67         /* tells in which hash table entry the cell lives */
68         unsigned int  hash_index;
69         /* sequence number within hash collision slot */
70         unsigned int  label;
71
72         /* bindings to wait and delete timer */
73         struct timer_link wait_tl;
74         struct timer_link dele_tl;
75
76         /*the transaction that is canceled (usefull only for CANCEL req)*/
77         struct cell *T_canceled;
78
79         /* useful data */
80         /* UA Server */
81         struct sip_msg          *inbound_request;
82         struct retrans_buff     outbound_response;
83         unsigned int            status;
84         str*                            tag;
85         unsigned int            inbound_request_isACKed;
86         int                                     relaied_reply_branch;
87         int                                     nr_of_outgoings;
88         /* UA Clients */
89         struct retrans_buff     *outbound_request[ MAX_FORK ];
90         struct sip_msg          *inbound_response[ MAX_FORK ];
91         /* unsigned int         outbound_request_isACKed[MAX_FORK]; */
92         struct retrans_buff     *outbound_ack[ MAX_FORK ];
93
94         /* protection against concurrent reply processing */
95         ser_lock_t      reply_mutex;
96         /* protection against concurrent ACK processing */
97         ser_lock_t      ack_mutex;
98
99         /* this is where destination is stored for picked branch;
100            good if a need to forward ACK later on
101         */
102         struct sockaddr_in ack_to;
103
104 #ifdef  EXTRA_DEBUG
105         /* scheduled for deletion ? */
106         short damocles;
107 #endif
108 }cell_type;
109
110
111
112 /* double-linked list of cells with hash synonyms */
113 typedef struct entry
114 {
115    struct cell*       first_cell;
116    struct cell*       last_cell;
117    /* currently highest sequence number in a synonym list */
118    unsigned int    next_label;
119    /* sync mutex */
120    ser_lock_t                 mutex;
121 }entry_type;
122
123
124
125 /* transaction table */
126 struct s_table
127 {
128    /* table of hash entries; each of them is a list of synonyms  */
129    struct entry   entrys[ TABLE_ENTRIES ];
130    /* table of timer lists */
131    struct timer   timers[ NR_OF_TIMER_LISTS ];
132 };
133
134
135 struct s_table* init_hash_table();
136 void free_hash_table( struct s_table* hash_table );
137 void free_cell( struct cell* dead_cell );
138 struct cell*  build_cell( struct sip_msg* p_msg );
139 void remove_from_hash_table( struct s_table *hash_table, struct cell * p_cell );
140 void insert_into_hash_table( struct s_table *hash_table, struct cell * p_cell );
141 void insert_into_hash_table_unsafe( struct s_table *hash_table, struct cell * p_cell );
142
143 #endif