mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-06 12:36:58 +00:00
Add optional call limit
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5712 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
BIN
asterisk.8.gz
BIN
asterisk.8.gz
Binary file not shown.
12
asterisk.c
12
asterisk.c
@@ -87,6 +87,7 @@ int option_timestamp = 0;
|
|||||||
int option_overrideconfig = 0;
|
int option_overrideconfig = 0;
|
||||||
int option_reconnect = 0;
|
int option_reconnect = 0;
|
||||||
int option_transcode_slin = 1;
|
int option_transcode_slin = 1;
|
||||||
|
int option_maxcalls = 0;
|
||||||
int fully_booted = 0;
|
int fully_booted = 0;
|
||||||
char record_cache_dir[AST_CACHE_DIR_LEN] = AST_TMP_DIR;
|
char record_cache_dir[AST_CACHE_DIR_LEN] = AST_TMP_DIR;
|
||||||
char debug_filename[AST_FILENAME_MAX] = "";
|
char debug_filename[AST_FILENAME_MAX] = "";
|
||||||
@@ -1658,6 +1659,11 @@ static void ast_readconfig(void) {
|
|||||||
/* Build transcode paths via SLINEAR, instead of directly */
|
/* Build transcode paths via SLINEAR, instead of directly */
|
||||||
} else if (!strcasecmp(v->name, "transcode_via_sln")) {
|
} else if (!strcasecmp(v->name, "transcode_via_sln")) {
|
||||||
option_transcode_slin = ast_true(v->value);
|
option_transcode_slin = ast_true(v->value);
|
||||||
|
} else if (!strcasecmp(v->name, "maxcalls")) {
|
||||||
|
if ((sscanf(v->value, "%d", &option_maxcalls) != 1) ||
|
||||||
|
(option_maxcalls < 0)) {
|
||||||
|
option_maxcalls = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
v = v->next;
|
v = v->next;
|
||||||
}
|
}
|
||||||
@@ -1711,7 +1717,7 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
/* Check for options */
|
/* Check for options */
|
||||||
while((c=getopt(argc, argv, "tThfdvVqprRgcinx:U:G:C:")) != -1) {
|
while((c=getopt(argc, argv, "tThfdvVqprRgcinx:U:G:C:M:")) != -1) {
|
||||||
switch(c) {
|
switch(c) {
|
||||||
case 'd':
|
case 'd':
|
||||||
option_debug++;
|
option_debug++;
|
||||||
@@ -1743,6 +1749,10 @@ int main(int argc, char *argv[])
|
|||||||
option_verbose++;
|
option_verbose++;
|
||||||
option_nofork++;
|
option_nofork++;
|
||||||
break;
|
break;
|
||||||
|
case 'M':
|
||||||
|
if ((sscanf(optarg, "%d", &option_maxcalls) != 1) || (option_maxcalls < 0))
|
||||||
|
option_maxcalls = 0;
|
||||||
|
break;
|
||||||
case 'q':
|
case 'q':
|
||||||
option_quiet++;
|
option_quiet++;
|
||||||
break;
|
break;
|
||||||
|
@@ -26,6 +26,7 @@
|
|||||||
<arg><option>-U </option><replaceable class="parameter">user</replaceable></arg>
|
<arg><option>-U </option><replaceable class="parameter">user</replaceable></arg>
|
||||||
<arg><option>-G </option><replaceable class="parameter">group</replaceable></arg>
|
<arg><option>-G </option><replaceable class="parameter">group</replaceable></arg>
|
||||||
<arg><option>-x </option><replaceable class="parameter">command</replaceable></arg>
|
<arg><option>-x </option><replaceable class="parameter">command</replaceable></arg>
|
||||||
|
<arg><option>-M </option><replaceable class="parameter">value</replaceable></arg>
|
||||||
</cmdsynopsis>
|
</cmdsynopsis>
|
||||||
<cmdsynopsis>
|
<cmdsynopsis>
|
||||||
|
|
||||||
@@ -141,6 +142,16 @@
|
|||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>-M <replaceable class="parameter">value</replaceable></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Limits the maximum number of calls to the specified value. This can
|
||||||
|
be useful to prevent a system from being brought down by terminating
|
||||||
|
too many simultaneous calls.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term>-n</term>
|
<term>-n</term>
|
||||||
<listitem>
|
<listitem>
|
||||||
|
7
cli.c
7
cli.c
@@ -429,8 +429,13 @@ static int handle_chanlist(int fd, int argc, char *argv[])
|
|||||||
ast_mutex_unlock(&c->lock);
|
ast_mutex_unlock(&c->lock);
|
||||||
c = ast_channel_walk_locked(c);
|
c = ast_channel_walk_locked(c);
|
||||||
}
|
}
|
||||||
if(!concise)
|
if(!concise) {
|
||||||
ast_cli(fd, "%d active channel(s)\n", numchans);
|
ast_cli(fd, "%d active channel(s)\n", numchans);
|
||||||
|
if (option_maxcalls)
|
||||||
|
ast_cli(fd, "%d of %d max active call(s) (%5.2f%% of capacity)\n", ast_active_calls(), option_maxcalls, ((float)ast_active_calls() / (float)option_maxcalls) * 100.0);
|
||||||
|
else
|
||||||
|
ast_cli(fd, "%d active call(s)\n", ast_active_calls());
|
||||||
|
}
|
||||||
return RESULT_SUCCESS;
|
return RESULT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -33,6 +33,7 @@ extern int option_exec_includes;
|
|||||||
extern int option_cache_record_files;
|
extern int option_cache_record_files;
|
||||||
extern int option_timestamp;
|
extern int option_timestamp;
|
||||||
extern int option_transcode_slin;
|
extern int option_transcode_slin;
|
||||||
|
extern int option_maxcalls;
|
||||||
extern char defaultlanguage[];
|
extern char defaultlanguage[];
|
||||||
extern time_t ast_startuptime;
|
extern time_t ast_startuptime;
|
||||||
extern time_t ast_lastreloadtime;
|
extern time_t ast_lastreloadtime;
|
||||||
|
@@ -602,6 +602,9 @@ int ast_async_goto_if_exists(struct ast_channel *chan, char* context, char *exte
|
|||||||
struct ast_custom_function* ast_custom_function_find(char *name);
|
struct ast_custom_function* ast_custom_function_find(char *name);
|
||||||
int ast_custom_function_unregister(struct ast_custom_function *acf);
|
int ast_custom_function_unregister(struct ast_custom_function *acf);
|
||||||
int ast_custom_function_register(struct ast_custom_function *acf);
|
int ast_custom_function_register(struct ast_custom_function *acf);
|
||||||
|
|
||||||
|
/* Number of active calls */
|
||||||
|
int ast_active_calls(void);
|
||||||
|
|
||||||
/*! executes a read operation on a function */
|
/*! executes a read operation on a function */
|
||||||
/*!
|
/*!
|
||||||
|
33
pbx.c
33
pbx.c
@@ -213,6 +213,9 @@ static struct varshead globals;
|
|||||||
|
|
||||||
static int autofallthrough = 0;
|
static int autofallthrough = 0;
|
||||||
|
|
||||||
|
AST_MUTEX_DEFINE_STATIC(maxcalllock);
|
||||||
|
static int countcalls = 0;
|
||||||
|
|
||||||
AST_MUTEX_DEFINE_STATIC(acflock); /* Lock for the custom function list */
|
AST_MUTEX_DEFINE_STATIC(acflock); /* Lock for the custom function list */
|
||||||
static struct ast_custom_function *acf_root = NULL;
|
static struct ast_custom_function *acf_root = NULL;
|
||||||
|
|
||||||
@@ -2232,7 +2235,7 @@ int ast_exec_extension(struct ast_channel *c, const char *context, const char *e
|
|||||||
return pbx_extension_helper(c, NULL, context, exten, priority, NULL, callerid, HELPER_EXEC);
|
return pbx_extension_helper(c, NULL, context, exten, priority, NULL, callerid, HELPER_EXEC);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ast_pbx_run(struct ast_channel *c)
|
static int __ast_pbx_run(struct ast_channel *c)
|
||||||
{
|
{
|
||||||
int firstpass = 1;
|
int firstpass = 1;
|
||||||
char digit;
|
char digit;
|
||||||
@@ -2497,6 +2500,34 @@ int ast_pbx_start(struct ast_channel *c)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ast_pbx_run(struct ast_channel *c)
|
||||||
|
{
|
||||||
|
int res = 0;
|
||||||
|
ast_mutex_lock(&maxcalllock);
|
||||||
|
if (option_maxcalls) {
|
||||||
|
if (countcalls >= option_maxcalls) {
|
||||||
|
ast_log(LOG_NOTICE, "Maximum call limit of %d calls exceeded by '%s'!\n", option_maxcalls, c->name);
|
||||||
|
res = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!res)
|
||||||
|
countcalls++;
|
||||||
|
ast_mutex_unlock(&maxcalllock);
|
||||||
|
if (!res) {
|
||||||
|
res = __ast_pbx_run(c);
|
||||||
|
ast_mutex_lock(&maxcalllock);
|
||||||
|
if (countcalls > 0)
|
||||||
|
countcalls--;
|
||||||
|
ast_mutex_unlock(&maxcalllock);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ast_active_calls(void)
|
||||||
|
{
|
||||||
|
return countcalls;
|
||||||
|
}
|
||||||
|
|
||||||
int pbx_set_autofallthrough(int newval)
|
int pbx_set_autofallthrough(int newval)
|
||||||
{
|
{
|
||||||
int oldval;
|
int oldval;
|
||||||
|
Reference in New Issue
Block a user