diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 5c6f23fedbb698b602cc9cc71292c9fe99cdf269..97cd6abb05e410081097265c606572cc908e040a 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -23278,18 +23278,14 @@ static int sip_reinvite_retry(const void *data)
 	struct sip_pvt *p = (struct sip_pvt *) data;
 	struct ast_channel *owner;
 
-	sip_pvt_lock(p); /* called from schedule thread which requires a lock */
-	while ((owner = p->owner) && ast_channel_trylock(owner)) {
-		sip_pvt_unlock(p);
-		usleep(1);
-		sip_pvt_lock(p);
-	}
+	owner = sip_pvt_lock_full(p);
 	ast_set_flag(&p->flags[0], SIP_NEEDREINVITE);
 	p->waitid = -1;
 	check_pendings(p);
 	sip_pvt_unlock(p);
 	if (owner) {
 		ast_channel_unlock(owner);
+		ast_channel_unref(owner);
 	}
 	dialog_unref(p, "Schedule waitid complete");
 	return 0;