b29a8552208db8199dd3a5b77e33ea1196eaf88d
[sip-router] / modules / tm / t_cancel.h
1 /*
2  * $Id$
3  *
4  */
5
6 #ifndef _CANCEL_H
7 #define _CANCEL_H
8
9 /* a buffer is empty but cannot be used by anyone else;
10    particularly, we use this value in the buffer pointer
11    in local_buffer to tell "a process is already scheduled
12    to generate a CANCEL, other processes are not supposed to"
13    (which might happen if for example in a three-branch forking,
14    two 200 would enter separate processes and compete for
15    cancelling the third branch); note that to really avoid
16    race conditions, the value must be set in REPLY_LOCK
17 */
18
19 #define BUSY_BUFFER ((char *)-1)
20
21 void which_cancel( struct cell *t, branch_bm_t *cancel_bm );
22 void cancel_uacs( struct cell *t, branch_bm_t cancel_bm );
23 void cancel_branch( struct cell *t, int branch );
24
25 char *build_cancel(struct cell *Trans,unsigned int branch,
26         unsigned int *len );
27
28 inline short static should_cancel_branch( struct cell *t, int b )
29 {
30         int last_received;
31         short should;
32
33         last_received=t->uac[b].last_received;
34         /* cancel only if provisional received and noone else
35            attempted to cancel yet */
36         should=last_received>=100 && last_received<200
37                 && t->uac[b].local_cancel.buffer==0;
38         /* we'll cancel -- label it so that noone else
39                 (e.g. another 200 branch) will try to do the same */
40         if (should) t->uac[b].local_cancel.buffer=BUSY_BUFFER;
41         return should;
42 }
43
44
45 #endif