forked from OpenSIPS/opensips
-
Notifications
You must be signed in to change notification settings - Fork 0
/
async.h
134 lines (102 loc) · 3.96 KB
/
async.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
* Copyright (C) 2014 OpenSIPS Solutions
*
* This file is part of opensips, a free SIP server.
*
* opensips is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* opensips is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*
* history:
* ---------
* 2014-10-15 created (bogdan)
*/
#ifndef _ASYNC_H_
#define _ASYNC_H_
#include "route_struct.h"
#include "parser/msg_parser.h"
/* The possible values of the status of async operatations (as reported by
* module functions, at start and resume)
* NOTE: all values in this enum must be negative
*/
enum async_ret_code {
ASYNC_NO_IO = -8 ,
ASYNC_SYNC,
ASYNC_NO_FD,
ASYNC_CONTINUE,
ASYNC_CHANGE_FD,
ASYNC_DONE_CLOSE_FD,
ASYNC_DONE_NO_IO, /* don't do any I/O related changes */
ASYNC_DONE,
};
/* async context, basic structure to be reused by the more complex
* async implementations */
typedef struct _async_ctx {
/* the resume function to be called when data to read is available */
void *resume_f;
/* parameter registered to the resume function */
void *resume_param;
} async_ctx;
extern int async_status;
/******** functions related to script async ops *******/
/* function to handle script function in async mode.
Input: the sip message, the function/action (MODULE_T) and the ID of
the resume route (where to continue after the I/O is done).
Output: 0 if the async call was successfully done and script execution
must be terminated.
-1 some error happened and the async call did not happened.
*/
typedef int (async_script_start_function)
(struct sip_msg *msg, struct action* a , int resume_route);
typedef int (async_script_resume_function)
(int *fd, void *param);
/* internal used functions to start (from script) and
* to continue (from reactor) async I/O ops */
extern async_script_start_function *async_script_start_f;
extern async_script_resume_function *async_script_resume_f;
/* Registers the start and resume functions for the script async ops */
int register_async_script_handlers(async_script_start_function *f1,
async_script_resume_function *f2);
/* async related functions to be used by the
* functions exported by modules
*
* NOTE: This function may be triggered even without any pending data!
*/
typedef enum async_ret_code (async_resume_module)
(int fd, struct sip_msg *msg, void *param);
/******** functions related to generic fd async ops *******/
/* async resume function triggered by
* an IO event on a a registered FD */
typedef int (async_resume_fd)
(int fd, void *param);
/* Registers the fd into the reactor for READ monitoring; The f function
* (together with the param parameter) will be triggered for each READ event
* on the fd.
* The return code of the f resume function dictates when the fd will be
* removed from the reactor (see async_ret_code).
* Returns : 0 - on successful FD registration
* -1 - failure to register the FD
* Function to be used by modules seeking to launch async I/O ops
*/
int register_async_fd(int fd, async_resume_fd *f, void *param);
/* Resume function for the registered async fd. This is internally called
* by the reactor via the handle_io() routine
Function only for internal usage.
*/
int async_fd_resume(int *fd, void *param);
/******** functions related to async launch *******/
int async_script_launch(struct sip_msg *msg, struct action* a,
int report_route);
int async_launch_resume(int *fd, void *param);
#endif