]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Further fixes to improper usage of scheduler 14/1614/1
authorSteve Davies <steve@one47.co.uk>
Wed, 11 Nov 2015 10:16:22 +0000 (10:16 +0000)
committerMatt Jordan <mjordan@digium.com>
Thu, 12 Nov 2015 16:55:29 +0000 (11:55 -0500)
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
(cherry picked from commit e74110188d7e4c959d6c3ddbe40635a639b33a14)

channels/chan_iax2.c
channels/chan_sip.c
res/res_rtp_asterisk.c

index df945fec1ac73d8c77abf3d3049b76c7c3b6f546..a492bddd354dd678d68acd7318d591001dbfb41c 100644 (file)
@@ -7061,7 +7061,7 @@ static char *handle_cli_iax2_unregister(struct ast_cli_entry *e, int cmd, struct
 
        p = find_peer(a->argv[2], 1);
        if (p) {
-               if (p->expire > 0) {
+               if (p->expire > -1) {
                        struct iax2_peer *peer;
 
                        peer = ao2_find(peers, a->argv[2], OBJ_KEY);
@@ -7094,7 +7094,7 @@ static char *complete_iax2_unregister(const char *line, const char *word, int po
                struct ao2_iterator i = ao2_iterator_init(peers, 0);
                while ((p = ao2_iterator_next(&i))) {
                        if (!strncasecmp(p->name, word, wordlen) && 
-                               ++which > state && p->expire > 0) {
+                               ++which > state && p->expire > -1) {
                                res = ast_strdup(p->name);
                                peer_unref(p);
                                break;
index 53070cdbe47a12421993c7f130468adef2befa4f..c47baf7c4ef9695e3b368926a7b3c5f0934144b5 100644 (file)
@@ -20312,7 +20312,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"));
@@ -20895,7 +20895,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");
@@ -30215,13 +30215,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, SIP_TRANSPORT_UDP);
        }
        peer->type = SIP_TYPE_PEER;
@@ -30303,6 +30301,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));
@@ -30422,6 +30424,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 */
index 7b7f34afc050e90a6bb7114abc78756cbbcc7981..f10dee8242d83ed49786a3a7d47983e782071913 100644 (file)
@@ -4275,7 +4275,7 @@ static void ast_rtp_prop_set(struct ast_rtp_instance *instance, enum ast_rtp_pro
                        return;
                } else {
                        if (rtp->rtcp) {
-                               if (rtp->rtcp->schedid > 0) {
+                               if (rtp->rtcp->schedid > -1) {
                                        if (!ast_sched_del(rtp->sched, rtp->rtcp->schedid)) {
                                                /* Successfully cancelled scheduler entry. */
                                                ao2_ref(instance, -1);
@@ -4501,7 +4501,7 @@ static void ast_rtp_stop(struct ast_rtp_instance *instance)
        ast_mutex_unlock(&rtp->dtls_timer_lock);
 #endif
 
-       if (rtp->rtcp && rtp->rtcp->schedid > 0) {
+       if (rtp->rtcp && rtp->rtcp->schedid > -1) {
                if (!ast_sched_del(rtp->sched, rtp->rtcp->schedid)) {
                        /* successfully cancelled scheduler entry. */
                        ao2_ref(instance, -1);