[svn-commits] oej: branch group/pinana-publish-1.4 r297602 - /team/group/pinana-publish-1.4...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Mon Dec 6 15:36:01 CST 2010


Author: oej
Date: Mon Dec  6 15:35:55 2010
New Revision: 297602

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=297602
Log:
- Moving some more parts to flexible scheduler scheme. 
  To get PUBLISH request retransmits into the device_state_thread
  more functions need to understand that all scheduler items are not
  running on the default scheduler...
- Fixing or maybe breaking the device_state_thread to run continously
  It still doesn't do retransmits though... This needs to be checked
  a bit more.

Marquis42: Feel free to grab these issues :-)

Modified:
    team/group/pinana-publish-1.4/channels/chan_sip.c

Modified: team/group/pinana-publish-1.4/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/group/pinana-publish-1.4/channels/chan_sip.c?view=diff&rev=297602&r1=297601&r2=297602
==============================================================================
--- team/group/pinana-publish-1.4/channels/chan_sip.c (original)
+++ team/group/pinana-publish-1.4/channels/chan_sip.c Mon Dec  6 15:35:55 2010
@@ -1900,7 +1900,8 @@
 static void dlginfo_handle_publish_error(struct sip_pvt *pvt, const int resp, struct sip_request *req, struct sip_epa_entry *epa_entry);
 static void dlginfo_handle_publish_ok(struct sip_pvt *pvt, struct sip_request *req, struct sip_epa_entry *epa_entry);
 static void dlginfo_epa_destructor(void *data);
-struct sched_context *dlginfo_get_scheduler(void);
+static struct sched_context *dlginfo_get_scheduler(void);
+static struct sched_context *get_scheduler(struct sip_pvt *dialog);
 
 
 /*! \brief Definition of this channel for PBX channel registration */
@@ -2334,6 +2335,20 @@
 	return;
 }
 
+/*! \brief Get scheduler for a specific dialog */
+static struct sched_context *get_scheduler(struct sip_pvt *dialog)
+{
+	struct sched_context *mysched = sched;	/* Use the default scheduler */
+
+	/* Get the scheduler entry if we have a special one for this packet
+	   in the publish event system */
+	if (dialog->epa_entry && dialog->epa_entry->static_data->sched) {
+		mysched = dialog->epa_entry->static_data->sched();
+		ast_log(LOG_DEBUG, "DEBUG PINANA --- Scheduling for presence in pres_sched for %s\n", dialog->callid);
+	}
+	return mysched;
+}
+
 /*! \brief Retransmit SIP message if no answer (Called from scheduler) */
 static int retrans_pkt(const void *data)
 {
@@ -2489,8 +2504,6 @@
 	if (pkt->timer_t1)
 		siptimer_a = pkt->timer_t1 * 2;
 
-	if (option_debug > 3 && sipdebug)
-		ast_log(LOG_DEBUG, "*** SIP TIMER: Initializing retransmit timer on packet: Id  #%d\n", pkt->retransid);
 	pkt->retransid = -1;
 	pkt->next = p->packets;
 	p->packets = pkt;
@@ -2505,16 +2518,12 @@
 		append_history(pkt->owner, "XmitErr", "%s", (ast_test_flag(pkt, FLAG_FATAL)) ? "(Critical)" : "(Non-critical)");
 		return AST_FAILURE;
 	} else {
-		struct sched_context *resched = sched;	/* Use the default scheduler */
-
-		/* Get the scheduler entry if we have a special one for this packet
-		   in the publish event system */
-		if (pkt->owner->epa_entry && pkt->owner->epa_entry->static_data->sched) {
-			resched = pkt->owner->epa_entry->static_data->sched();
-			ast_log(LOG_DEBUG, "DEBUG PINANA --- Scheduling for presence in pres_sched\n");
-		}
+		struct sched_context *resched = get_scheduler(pkt->owner);	/* Use the default scheduler */
+
 		/* Schedule retransmission */
 		pkt->retransid = ast_sched_add_variable(resched, siptimer_a, retrans_pkt, pkt, 1);
+		if (option_debug > 3 && sipdebug)
+			ast_log(LOG_DEBUG, "*** SIP TIMER: Initializing retransmit timer on packet: Id  #%d\n", pkt->retransid);
 		return AST_SUCCESS;
 	}
 }
@@ -2589,6 +2598,8 @@
 /*! \brief Schedule destruction of SIP dialog */
 static void sip_scheddestroy(struct sip_pvt *p, int ms)
 {
+	struct sched_context *mysched = get_scheduler(p);
+
 	if (ms < 0) {
 		if (p->timer_t1 == 0)
 			p->timer_t1 = 500;	/* Set timer T1 if not set (RFC 3261) */
@@ -2600,7 +2611,7 @@
 		append_history(p, "SchedDestroy", "%d ms", ms);
 
 	AST_SCHED_DEL(sched, p->autokillid);
-	p->autokillid = ast_sched_add(sched, ms, __sip_autodestruct, p);
+	p->autokillid = ast_sched_add(mysched, ms, __sip_autodestruct, p);
 }
 
 /*! \brief Cancel destruction of SIP dialog */
@@ -2627,6 +2638,8 @@
 	int res = FALSE;
 
 	msg = sip_methods[sipmethod].text;
+
+	struct sched_context *mysched = get_scheduler(p);	/* Use the default scheduler */
 
 	for (cur = p->packets; cur; prev = cur, cur = cur->next) {
 		if ((cur->seqno == seqno) && ((ast_test_flag(cur, FLAG_RESPONSE)) == resp) &&
@@ -2660,7 +2673,7 @@
 			 * the packet's retransid will be set to -1. The atomicity of the setting and checking
 			 * of the retransid to -1 is ensured since in both cases p's lock is held.
 			 */
-			AST_SCHED_DEL_SPINLOCK(sched, cur->retransid, &p->lock);
+			AST_SCHED_DEL_SPINLOCK(mysched, cur->retransid, &p->lock);
 			free(cur);
 			break;
 		}
@@ -2813,10 +2826,11 @@
 static void remove_provisional_keepalive_sched(struct sip_pvt *pvt)
 {
 	int res;
+
 	if (!pvt->provisional_keepalive_data) {
 		return;
 	}
-	res = AST_SCHED_DEL(sched, pvt->provisional_keepalive_data->sched_id);
+	res = AST_SCHED_DEL(get_scheduler(pvt), pvt->provisional_keepalive_data->sched_id);
 	/* If we could not remove this item. remove pvt's reference this data and mark it for removal
 	 * for the next time the scheduler uses it. The scheduler has it's own ref to this data
 	 * and will detect it should not reschedule the event since the sched_id is -1 and pvt == NULL */
@@ -2841,7 +2855,7 @@
 	ao2_ref(pvt->provisional_keepalive_data, +1);
 
 	/* schedule the provisional keepalive */
-	pvt->provisional_keepalive_data->sched_id = ast_sched_add(sched,
+	pvt->provisional_keepalive_data->sched_id = ast_sched_add(get_scheduler(pvt),
 		PROVIS_KEEPALIVE_TIMEOUT,
 		with_sdp ? send_provisional_keepalive_with_sdp : send_provisional_keepalive,
 		pvt->provisional_keepalive_data);
@@ -3718,6 +3732,7 @@
 	struct sip_pvt *cur, *prev = NULL;
 	struct sip_pkt *cp;
 	struct sip_request *req;
+	struct sched_context *mysched = get_scheduler(p);
 
 	/* We absolutely cannot destroy the rtp struct while a bridge is active or we WILL crash */
 	if (p->rtp && ast_rtp_get_bridged(p->rtp)) {
@@ -3775,10 +3790,10 @@
 	 * the extension update queue relating to this dialog. */
 	clear_extenstate_updates(p);
 
-	AST_SCHED_DEL(sched, p->initid);
-	AST_SCHED_DEL(sched, p->waitid);
-	AST_SCHED_DEL(sched, p->autokillid);
-	AST_SCHED_DEL(sched, p->request_queue_sched_id);
+	AST_SCHED_DEL(mysched, p->initid);
+	AST_SCHED_DEL(mysched, p->waitid);
+	AST_SCHED_DEL(mysched, p->autokillid);
+	AST_SCHED_DEL(mysched, p->request_queue_sched_id);
 
 	remove_provisional_keepalive_sched(p);
 	if (p->provisional_keepalive_data) {
@@ -3836,7 +3851,7 @@
 	/* remove all current packets in this dialog */
 	while((cp = p->packets)) {
 		p->packets = p->packets->next;
-		AST_SCHED_DEL(sched, cp->retransid);
+		AST_SCHED_DEL(mysched, cp->retransid);
 		free(cp);
 	}
 	if (p->chanvars) {
@@ -9989,7 +10004,7 @@
 }
 
 /*! \brief Get scheduler context */
-struct sched_context *dlginfo_get_scheduler(void)
+static struct sched_context *dlginfo_get_scheduler(void)
 {
 	if (pres_sched) {
 		return pres_sched;
@@ -10190,11 +10205,15 @@
 
 	/* Running this thread */
 	while (!device_state.stop) {
+		int somethinghappened = FALSE;
 		ast_mutex_lock(&device_state.lock);
-		if (!(sc = AST_LIST_REMOVE_HEAD(&device_state.state_change_q, entry))) {
-			ast_cond_wait(&device_state.cond, &device_state.lock);
+		/* For now I've disabled this cond wait. In order for retransmits
+		   to happen, I need this loop to run. Maybe we should put in a sleep()
+		   to wait if we have no sc or scheduled items */
+		//if (!(sc = AST_LIST_REMOVE_HEAD(&device_state.state_change_q, entry))) {
+			////ast_cond_wait(&device_state.cond, &device_state.lock);
 			sc = AST_LIST_REMOVE_HEAD(&device_state.state_change_q, entry);
-		}
+		//}
 		ast_mutex_unlock(&device_state.lock);
 
 		/* Check to see if we were woken up to see the request to stop */
@@ -10202,22 +10221,26 @@
 			break;
 		}
 
-		if (!sc) {
-			continue;
-		}
-
-		handle_statechange(sc);
+		if (sc) {
+			somethinghappened = TRUE;
+			handle_statechange(sc);
+			free(sc);
+			sc = NULL;
+		}
 
 		waiting = ast_sched_wait(pres_sched);
 		if (waiting > 0) {
 			int res = ast_sched_runq(pres_sched);
-			if (option_debug > 2) {
+
+			somethinghappened = TRUE;
+			if (res && option_debug > 2) {
 				ast_log(LOG_DEBUG, "Presence scheduler ran %d items\n", res);
 			}
-		}
-
-		free(sc);
-		sc = NULL;
+		} 
+		if (!somethinghappened) {
+			/* We did nothing in this run. Wait a while until next run */
+			usleep(50);
+		}
 	}
 
 	/* Stopping this thread */
@@ -20035,7 +20058,8 @@
 		while(nextfilter) {
 			struct pubsub_filter *newfilter;
 			/* First, cut off string if needed */
-			nextfilter = strchr(nextfilter, ',');
+			filter = nextfilter;
+			nextfilter = strchr(filter, ',');
 			if (nextfilter) {
 				*nextfilter++ = '\0';
 			}




More information about the svn-commits mailing list