X-Git-Url: http://git.eversberg.eu/gitweb.cgi?p=lcr.git;a=blobdiff_plain;f=chan_lcr.c;h=59687339a7c29ae51ac4d05c39d6f899436264b7;hp=c912b809f0b16e517f54b1f167f8900b8b9f1ca0;hb=ec4c180567d94ada2940ca106b45e5876d6bbf3a;hpb=91601aaa42f63e4ca89295dfbabe46289bd9cf38 diff --git a/chan_lcr.c b/chan_lcr.c index c912b80..5968733 100644 --- a/chan_lcr.c +++ b/chan_lcr.c @@ -227,7 +227,7 @@ void lock_debug(char *text) { pthread_t tid = pthread_self(); // printf("%s|%03x\n", text, ((tid>>6) | (tid>>3) | tid) & 0xfff); fflush(stdout); - printf("%s|%x", text, (int)tid); fflush(stdout); + printf(" %s(%x) ", text, (int)tid); fflush(stdout); } /* @@ -240,8 +240,9 @@ void chan_lcr_log(int type, const char *file, int line, const char *function, st char ast_text[128] = "NULL"; va_list args; - lock_debug("L"); + lock_debug("L+"); ast_mutex_lock(&log_lock); + lock_debug("L-"); va_start(args,fmt); vsnprintf(buffer,sizeof(buffer)-1,fmt,args); @@ -253,8 +254,9 @@ void chan_lcr_log(int type, const char *file, int line, const char *function, st if (ast) strncpy(ast_text, ast->name, sizeof(ast_text)-1); ast_text[sizeof(ast_text)-1] = '\0'; - - ast_log(type, file, line, function, "[call=%s ast=%s] %s", call_text, ast_text, buffer); + +printf("\n[call=%s ast=%s] %s\n", call_text, ast_text, buffer); +// ast_log(type, file, line, function, "[call=%s ast=%s] %s", call_text, ast_text, buffer); ast_mutex_unlock(&log_lock); lock_debug("l"); @@ -1263,6 +1265,7 @@ int receive_message(int message_type, unsigned int ref, union parameter *param) if (message_type == MESSAGE_BCHANNEL) { switch(param->bchannel.type) { case BCHANNEL_ASSIGN: +lock_debug("rx1"); CDEBUG(NULL, NULL, "Received BCHANNEL_ASSIGN message. (handle=%08lx) for ref %d\n", param->bchannel.handle, ref); if ((bchannel = find_bchannel_handle(param->bchannel.handle))) { CERROR(NULL, NULL, "bchannel handle %x already assigned.\n", (int)param->bchannel.handle); @@ -1527,16 +1530,23 @@ static int handle_socket(struct lcr_fd *fd, unsigned int what, void *instance, i struct admin_list *admin; struct admin_message msg; + lock_debug("handle+"); if ((what & LCR_FD_READ)) { /* read from socket */ + lock_debug("handle1"); len = read(lcr_sock, &msg, sizeof(msg)); + lock_debug("handle2"); if (len == 0) { CERROR(NULL, NULL, "Socket closed.\n"); error: CERROR(NULL, NULL, "Handling of socket failed - closing for some seconds.\n"); + lock_debug("handle3"); close_socket(); + lock_debug("handle4"); release_all_calls(); + lock_debug("handle5"); schedule_timer(&socket_retry, SOCKET_RETRY_TIMER, 0); + lock_debug("handle-"); return 0; } if (len > 0) { @@ -1548,7 +1558,9 @@ static int handle_socket(struct lcr_fd *fd, unsigned int what, void *instance, i CERROR(NULL, NULL, "Socket received illegal message %d.\n", msg.message); goto error; } + lock_debug("handleX"); receive_message(msg.u.msg.type, msg.u.msg.ref, &msg.u.msg.param); + lock_debug("handleY"); } else { CERROR(NULL, NULL, "Socket failed (errno %d).\n", errno); goto error; @@ -1559,10 +1571,13 @@ static int handle_socket(struct lcr_fd *fd, unsigned int what, void *instance, i /* write to socket */ if (!admin_first) { socket_fd.when &= ~LCR_FD_WRITE; + lock_debug("handle-"); return 0; } + lock_debug("handle6"); admin = admin_first; len = write(lcr_sock, &admin->msg, sizeof(msg)); + lock_debug("handle7"); if (len == 0) { CERROR(NULL, NULL, "Socket closed.\n"); goto error; @@ -1573,6 +1588,7 @@ static int handle_socket(struct lcr_fd *fd, unsigned int what, void *instance, i goto error; } /* free head */ + lock_debug("handle8"); admin_first = admin->next; free(admin); global_change = 1; @@ -1582,6 +1598,7 @@ static int handle_socket(struct lcr_fd *fd, unsigned int what, void *instance, i } } + lock_debug("handle-"); return 0; } @@ -1654,9 +1671,11 @@ static int wake_event(struct lcr_fd *fd, unsigned int what, void *instance, int { char byte; + lock_debug("wake+"); read(wake_pipe[0], &byte, 1); wake_global = 0; + lock_debug("wake-"); return 0; } @@ -1673,8 +1692,13 @@ static void handle_queue() p = call->queue_string; ast = call->ast; if (*p && ast) { - lock_debug("A1"); - ast_channel_lock(ast); + lock_debug("A1+"); + while (ast_channel_trylock(ast)) { + lock_debug(""); + usleep(1000); + lock_debug("A1++"); + } + lock_debug("A1-"); while(*p) { switch (*p) { case 'T': @@ -1748,8 +1772,9 @@ static int handle_retry(struct lcr_timer *timer, void *instance, int index) void lock_chan(void) { - lock_debug("C"); + lock_debug("C+"); ast_mutex_lock(&chan_lock); + lock_debug("C-"); } void unlock_chan(void) @@ -1777,8 +1802,9 @@ static void *chan_thread(void *arg) /* open socket the first time */ handle_retry(NULL, NULL, 0); - lock_debug("A2"); + lock_debug("A2+"); ast_mutex_lock(&chan_lock); + lock_debug("A2-"); while(!quit) { handle_queue(); @@ -1811,8 +1837,9 @@ struct ast_channel *lcr_request(const char *type, int format, void *data, int *c struct ast_channel *ast; struct chan_call *call; - lock_debug("A3"); + lock_debug("A3+"); ast_mutex_lock(&chan_lock); + lock_debug("A3-"); CDEBUG(NULL, NULL, "Received request from Asterisk. (data=%s)\n", (char *)data); /* if socket is closed */ @@ -1905,8 +1932,9 @@ static int lcr_call(struct ast_channel *ast, char *dest, int timeout) union parameter newparam; struct chan_call *call; - lock_debug("A4"); + lock_debug("A4+"); ast_mutex_lock(&chan_lock); + lock_debug("A4-"); call = ast->tech_pvt; #ifdef LCR_FOR_CALLWEAVER @@ -1992,8 +2020,8 @@ static void send_digit_to_chan(struct ast_channel * ast, char digit ) ast_playtones_start(ast,0,dtmf_tones[15], 0); else { /* not handled */ - ast_log(LOG_DEBUG, "Unable to handle DTMF tone " - "'%c' for '%s'\n", digit, ast->name); +// ast_log(LOG_DEBUG, "Unable to handle DTMF tone " +// "'%c' for '%s'\n", digit, ast->name); } } @@ -2016,8 +2044,9 @@ static int lcr_digit(struct ast_channel *ast, char digit) if (digit > 126 || digit < 32) return 0; - lock_debug("A5"); + lock_debug("A5+"); ast_mutex_lock(&chan_lock); + lock_debug("A5-"); call = ast->tech_pvt; if (!call) { CERROR(NULL, ast, "Received digit from Asterisk, but no call instance exists.\n"); @@ -2061,8 +2090,9 @@ static int lcr_digit_end(struct ast_channel *ast, char digit, unsigned int durat struct chan_call *call; #endif - lock_debug("A6"); + lock_debug("A6+"); ast_mutex_lock(&chan_lock); + lock_debug("A6-"); call = ast->tech_pvt; @@ -2097,8 +2127,9 @@ static int lcr_answer(struct ast_channel *ast) union parameter newparam; struct chan_call *call; - lock_debug("A7"); + lock_debug("A7+"); ast_mutex_lock(&chan_lock); + lock_debug("A7-"); call = ast->tech_pvt; if (!call) { CERROR(NULL, ast, "Received answer from Asterisk, but no call instance exists.\n"); @@ -2142,8 +2173,9 @@ static int lcr_hangup(struct ast_channel *ast) pthread_t tid = pthread_self(); if (!pthread_equal(tid, chan_tid)) { - lock_debug("H"); + lock_debug("H+"); ast_mutex_lock(&chan_lock); + lock_debug("H-"); } call = ast->tech_pvt; if (!call) { @@ -2206,8 +2238,9 @@ static int lcr_write(struct ast_channel *ast, struct ast_frame *f) if (!(f->subclass & ast->nativeformats)) CDEBUG(NULL, ast, "Unexpected format.\n"); - lock_debug("A8"); + lock_debug("A8+"); ast_mutex_lock(&chan_lock); + lock_debug("A8-"); call = ast->tech_pvt; if (!call) { ast_mutex_unlock(&chan_lock); @@ -2227,8 +2260,9 @@ static struct ast_frame *lcr_read(struct ast_channel *ast) struct chan_call *call; int len; - lock_debug("A9"); + lock_debug("A9+"); ast_mutex_lock(&chan_lock); + lock_debug("A9-"); call = ast->tech_pvt; if (!call) { ast_mutex_unlock(&chan_lock); @@ -2301,8 +2335,9 @@ static int lcr_indicate(struct ast_channel *ast, int cond, const void *data, siz struct chan_call *call; const struct tone_zone_sound *ts = NULL; - lock_debug("A0"); + lock_debug("A0+"); ast_mutex_lock(&chan_lock); + lock_debug("A0-"); call = ast->tech_pvt; if (!call) { CERROR(NULL, ast, "Received indicate from Asterisk, but no call instance exists.\n"); @@ -2453,8 +2488,9 @@ static int lcr_fixup(struct ast_channel *oldast, struct ast_channel *ast) return -1; } - lock_debug("Af"); + lock_debug("Af+"); ast_mutex_lock(&chan_lock); + lock_debug("Af-"); call = ast->tech_pvt; if (!call) { CERROR(NULL, ast, "Received fixup from Asterisk, but no call instance exists.\n"); @@ -2478,8 +2514,9 @@ static int lcr_send_text(struct ast_channel *ast, const char *text) struct chan_call *call; union parameter newparam; - lock_debug("At"); + lock_debug("At+"); ast_mutex_lock(&chan_lock); + lock_debug("At-"); call = ast->tech_pvt; if (!call) { CERROR(NULL, ast, "Received send_text from Asterisk, but no call instance exists.\n"); @@ -2518,8 +2555,9 @@ enum ast_bridge_result lcr_bridge(struct ast_channel *ast1, carr[1] = ast2; /* join via dsp (if the channels are currently open) */ - lock_debug("Ab"); + lock_debug("Ab+"); ast_mutex_lock(&chan_lock); + lock_debug("Ab-"); call1 = ast1->tech_pvt; call2 = ast2->tech_pvt; if (!call1 || !call2) { @@ -2636,8 +2674,9 @@ enum ast_bridge_result lcr_bridge(struct ast_channel *ast1, CDEBUG(NULL, NULL, "Releasing bridge.\n"); /* split channels */ - lock_debug("Ab"); + lock_debug("Ab+"); ast_mutex_lock(&chan_lock); + lock_debug("Ab-"); call1 = ast1->tech_pvt; call2 = ast2->tech_pvt; if (call1 && call1->bridge_id) { @@ -2789,8 +2828,9 @@ static int lcr_config_exec(struct ast_channel *ast, void *data, char **argv) { struct chan_call *call; - lock_debug("Ae"); + lock_debug("Ae+"); ast_mutex_lock(&chan_lock); + lock_debug("Ae-"); #ifdef LCR_FOR_ASTERISK CDEBUG(NULL, ast, "Received lcr_config (data=%s)\n", (char *)data); @@ -2992,8 +3032,9 @@ int usecount(void) hae { int res; - lock_debug("U"); + lock_debug("U+"); ast_mutex_lock(&usecnt_lock); + lock_debug("U-"); res = usecnt; ast_mutex_unlock(&usecnt_lock); lock_debug("u");