mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-03 03:02:15 +00:00
Further fixes to improper usage of scheduler
When ASTERISK-25449 was closed, a number of scheduler issues mentioned in the comments were missed. These have since beed raised in ASTERISK-25476 and elsewhere. This patch attempts to collect all of the scheduler issues discovered so far and address them sensibly. ASTERISK-25476 #close Change-Id: I87a77d581e2e0d91d33b4b2fbff80f64a566d05b
This commit is contained in:
@@ -20829,7 +20829,7 @@ static char *sip_unregister(struct ast_cli_entry *e, int cmd, struct ast_cli_arg
|
||||
return CLI_SHOWUSAGE;
|
||||
|
||||
if ((peer = sip_find_peer(a->argv[2], NULL, load_realtime, FINDPEERS, TRUE, 0))) {
|
||||
if (peer->expire > 0) {
|
||||
if (peer->expire > -1) {
|
||||
AST_SCHED_DEL_UNREF(sched, peer->expire,
|
||||
sip_unref_peer(peer, "remove register expire ref"));
|
||||
expire_register(sip_ref_peer(peer, "ref for expire_register"));
|
||||
@@ -21408,7 +21408,7 @@ static char *complete_sip_registered_peer(const char *word, int state, int flags
|
||||
while ((peer = ao2_t_iterator_next(&i, "iterate thru peers table"))) {
|
||||
if (!strncasecmp(word, peer->name, wordlen) &&
|
||||
(!flags2 || ast_test_flag(&peer->flags[1], flags2)) &&
|
||||
++which > state && peer->expire > 0)
|
||||
++which > state && peer->expire > -1)
|
||||
result = ast_strdup(peer->name);
|
||||
if (result) {
|
||||
sip_unref_peer(peer, "toss iterator peer ptr before break");
|
||||
@@ -30264,13 +30264,11 @@ static struct ast_variable *add_var(const char *buf, struct ast_variable *list)
|
||||
/*! \brief Set peer defaults before configuring specific configurations */
|
||||
static void set_peer_defaults(struct sip_peer *peer)
|
||||
{
|
||||
if (peer->expire == 0) {
|
||||
if (peer->expire < 0) {
|
||||
/* Don't reset expire or port time during reload
|
||||
if we have an active registration
|
||||
*/
|
||||
peer->expire = -1;
|
||||
peer->pokeexpire = -1;
|
||||
peer->keepalivesend = -1;
|
||||
peer_sched_cleanup(peer);
|
||||
set_socket_transport(&peer->socket, AST_TRANSPORT_UDP);
|
||||
}
|
||||
peer->type = SIP_TYPE_PEER;
|
||||
@@ -30355,6 +30353,10 @@ static struct sip_peer *temp_peer(const char *name)
|
||||
}
|
||||
|
||||
ast_atomic_fetchadd_int(&apeerobjs, 1);
|
||||
peer->expire = -1;
|
||||
peer->pokeexpire = -1;
|
||||
peer->keepalivesend = -1;
|
||||
|
||||
set_peer_defaults(peer);
|
||||
|
||||
ast_copy_string(peer->name, name, sizeof(peer->name));
|
||||
@@ -30475,6 +30477,10 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
|
||||
ast_debug(3, "-REALTIME- peer built. Name: %s. Peer objects: %d\n", name, rpeerobjs);
|
||||
} else
|
||||
ast_atomic_fetchadd_int(&speerobjs, 1);
|
||||
|
||||
peer->expire = -1;
|
||||
peer->pokeexpire = -1;
|
||||
peer->keepalivesend = -1;
|
||||
}
|
||||
|
||||
/* Note that our peer HAS had its reference count increased */
|
||||
|
Reference in New Issue
Block a user