Skip to content
Snippets Groups Projects
Commit 97d2549b authored by Tzafrir Cohen's avatar Tzafrir Cohen Committed by Oron Peled
Browse files

openr2(2/6): Stop polling channels when DAHDI returns -ENODEV (e.g: plug-out)


Otherwise, OpenR2 threads go crazy and consume almost all CPU resources

Change-Id: I10a41f617613fe7399c5bdced5c64a2751173f28
Signed-off-by: default avatarOron Peled <oron.peled@xorcom.com>
parent 2f0a8e12
No related branches found
No related tags found
No related merge requests found
......@@ -748,6 +748,7 @@ struct dahdi_mfcr2 {
openr2_context_t *protocol_context; /*!< OpenR2 context handle */
struct dahdi_pvt *pvts[SIG_MFCR2_MAX_CHANNELS]; /*!< Member channel pvt structs */
int numchans; /*!< Number of channels in this R2 block */
int nodev; /*!< Link disconnected? */
struct dahdi_mfcr2_conf conf; /*!< Configuration used to setup this pseudo-link */
};
 
......@@ -3636,7 +3637,19 @@ static void dahdi_r2_on_hardware_alarm(openr2_chan_t *r2chan, int alarm)
 
static void dahdi_r2_on_os_error(openr2_chan_t *r2chan, int errorcode)
{
struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
ast_log(LOG_ERROR, "OS error on chan %d: %s\n", openr2_chan_get_number(r2chan), strerror(errorcode));
ast_mutex_lock(&p->lock);
/* Disconnected? */
if (errorcode == ENODEV) {
struct dahdi_mfcr2 *r2link = p->mfcr2;
p->mfcr2call = 0;
if (r2link) {
r2link->nodev = 1;
}
}
ast_mutex_unlock(&p->lock);
}
 
static void dahdi_r2_on_protocol_error(openr2_chan_t *r2chan, openr2_protocol_error_t reason)
......@@ -13741,6 +13754,9 @@ static void *mfcr2_monitor(void *data)
if (mfcr2->pvts[i]->owner) {
continue;
}
if (mfcr2->nodev) {
continue;
}
if (!mfcr2->pvts[i]->r2chan) {
ast_debug(1, "Wow, no r2chan on channel %d\n", mfcr2->pvts[i]->channel);
quit_loop = 1;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment