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
changes/09/1609/1
Steve Davies 10 years ago
parent dac0bf063c
commit 07583c2888

@ -7114,7 +7114,7 @@ static char *handle_cli_iax2_unregister(struct ast_cli_entry *e, int cmd, struct
p = find_peer(a->argv[2], 1); p = find_peer(a->argv[2], 1);
if (p) { if (p) {
if (p->expire > 0) { if (p->expire > -1) {
struct iax2_peer *peer; struct iax2_peer *peer;
peer = ao2_find(peers, a->argv[2], OBJ_KEY); peer = ao2_find(peers, a->argv[2], OBJ_KEY);
@ -7147,7 +7147,7 @@ static char *complete_iax2_unregister(const char *line, const char *word, int po
struct ao2_iterator i = ao2_iterator_init(peers, 0); struct ao2_iterator i = ao2_iterator_init(peers, 0);
while ((p = ao2_iterator_next(&i))) { while ((p = ao2_iterator_next(&i))) {
if (!strncasecmp(p->name, word, wordlen) && if (!strncasecmp(p->name, word, wordlen) &&
++which > state && p->expire > 0) { ++which > state && p->expire > -1) {
res = ast_strdup(p->name); res = ast_strdup(p->name);
peer_unref(p); peer_unref(p);
break; break;

@ -20829,7 +20829,7 @@ static char *sip_unregister(struct ast_cli_entry *e, int cmd, struct ast_cli_arg
return CLI_SHOWUSAGE; return CLI_SHOWUSAGE;
if ((peer = sip_find_peer(a->argv[2], NULL, load_realtime, FINDPEERS, TRUE, 0))) { 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, AST_SCHED_DEL_UNREF(sched, peer->expire,
sip_unref_peer(peer, "remove register expire ref")); sip_unref_peer(peer, "remove register expire ref"));
expire_register(sip_ref_peer(peer, "ref for expire_register")); 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"))) { while ((peer = ao2_t_iterator_next(&i, "iterate thru peers table"))) {
if (!strncasecmp(word, peer->name, wordlen) && if (!strncasecmp(word, peer->name, wordlen) &&
(!flags2 || ast_test_flag(&peer->flags[1], flags2)) && (!flags2 || ast_test_flag(&peer->flags[1], flags2)) &&
++which > state && peer->expire > 0) ++which > state && peer->expire > -1)
result = ast_strdup(peer->name); result = ast_strdup(peer->name);
if (result) { if (result) {
sip_unref_peer(peer, "toss iterator peer ptr before break"); 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 */ /*! \brief Set peer defaults before configuring specific configurations */
static void set_peer_defaults(struct sip_peer *peer) 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 /* Don't reset expire or port time during reload
if we have an active registration if we have an active registration
*/ */
peer->expire = -1; peer_sched_cleanup(peer);
peer->pokeexpire = -1;
peer->keepalivesend = -1;
set_socket_transport(&peer->socket, AST_TRANSPORT_UDP); set_socket_transport(&peer->socket, AST_TRANSPORT_UDP);
} }
peer->type = SIP_TYPE_PEER; peer->type = SIP_TYPE_PEER;
@ -30355,6 +30353,10 @@ static struct sip_peer *temp_peer(const char *name)
} }
ast_atomic_fetchadd_int(&apeerobjs, 1); ast_atomic_fetchadd_int(&apeerobjs, 1);
peer->expire = -1;
peer->pokeexpire = -1;
peer->keepalivesend = -1;
set_peer_defaults(peer); set_peer_defaults(peer);
ast_copy_string(peer->name, name, sizeof(peer->name)); 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); ast_debug(3, "-REALTIME- peer built. Name: %s. Peer objects: %d\n", name, rpeerobjs);
} else } else
ast_atomic_fetchadd_int(&speerobjs, 1); 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 */ /* Note that our peer HAS had its reference count increased */

@ -4780,7 +4780,7 @@ static void ast_rtp_prop_set(struct ast_rtp_instance *instance, enum ast_rtp_pro
return; return;
} else { } else {
if (rtp->rtcp) { if (rtp->rtcp) {
if (rtp->rtcp->schedid > 0) { if (rtp->rtcp->schedid > -1) {
if (!ast_sched_del(rtp->sched, rtp->rtcp->schedid)) { if (!ast_sched_del(rtp->sched, rtp->rtcp->schedid)) {
/* Successfully cancelled scheduler entry. */ /* Successfully cancelled scheduler entry. */
ao2_ref(instance, -1); ao2_ref(instance, -1);
@ -4997,7 +4997,7 @@ static void ast_rtp_stop(struct ast_rtp_instance *instance)
} }
#endif #endif
if (rtp->rtcp && rtp->rtcp->schedid > 0) { if (rtp->rtcp && rtp->rtcp->schedid > -1) {
if (!ast_sched_del(rtp->sched, rtp->rtcp->schedid)) { if (!ast_sched_del(rtp->sched, rtp->rtcp->schedid)) {
/* successfully cancelled scheduler entry. */ /* successfully cancelled scheduler entry. */
ao2_ref(instance, -1); ao2_ref(instance, -1);

Loading…
Cancel
Save