Index: src/ozmod/ozmod_wanpipe/ozmod_wanpipe.c =================================================================== --- src/ozmod/ozmod_wanpipe/ozmod_wanpipe.c (revision 745) +++ src/ozmod/ozmod_wanpipe/ozmod_wanpipe.c (working copy) @@ -98,19 +98,21 @@ * so we can have one analong handler thread that will deal with all the idle analog channels for events * the alternative would be for the driver to provide one socket for all of the oob events for all analog channels */ -static __inline__ int tdmv_api_wait_socket(sng_fd_t fd, int timeout, int *flags) +static __inline__ int tdmv_api_wait_socket(zap_channel_t *zchan, int timeout, int *flags) { #ifdef LIBSANGOMA_VERSION int err; - sangoma_wait_obj_t sangoma_wait_obj; + sangoma_wait_obj_t *sangoma_wait_obj = zchan->mod_data; - sangoma_init_wait_obj(&sangoma_wait_obj, fd, 1, 1, *flags, SANGOMA_WAIT_OBJ); + sangoma_init_wait_obj(sangoma_wait_obj, zchan->sockfd, 1, 1, 0, SANGOMA_WAIT_OBJ); - err=sangoma_socket_waitfor_many(&sangoma_wait_obj,1 , timeout); + err = sangoma_socket_waitfor_many(&sangoma_wait_obj, 1, timeout); + if (err > 0) { - *flags=sangoma_wait_obj.flags_out; + *flags = sangoma_wait_obj.flags_out; } + return err; #else @@ -118,7 +120,7 @@ int res; memset(&pfds[0], 0, sizeof(pfds[0])); - pfds[0].fd = fd; + pfds[0].fd = zchan->sockfd; pfds[0].events = *flags; res = poll(pfds, 1, timeout); *flags = 0; @@ -200,6 +202,15 @@ if (sockfd != WP_INVALID_SOCKET && zap_span_add_channel(span, sockfd, type, &chan) == ZAP_SUCCESS) { wanpipe_tdm_api_t tdm_api; +#ifdef LIBSANGOMA_VERSION + sangoma_wait_obj_t *sangoma_wait_obj; + + sangoma_wait_obj = malloc(sizeof(*sangoma_wait_obj)); + memset(sangoma_wait_obj, 0, sizeof(*sangoma_wait_obj)); + sangoma_init_wait_obj(sangoma_wait_obj, sockfd, 1, 1, 0, SANGOMA_WAIT_OBJ); + chan->mod_data = sangoma_wait_obj; +#endif + memset(&tdm_api,0,sizeof(tdm_api)); chan->physical_span_id = spanno; @@ -211,7 +222,7 @@ dtmf = "software"; - /* FIXME: Handle Error Conditino Check for return code */ + /* FIXME: Handle Error Condition Check for return code */ err= sangoma_tdm_get_hw_coding(chan->sockfd, &tdm_api); if (tdm_api.wp_tdm_cmd.hw_tdm_coding) { @@ -606,7 +617,7 @@ inflags |= POLLPRI; } - result = tdmv_api_wait_socket(zchan->sockfd, to, &inflags); + result = tdmv_api_wait_socket(zchan, to, &inflags); *flags = ZAP_NO_FLAGS; @@ -643,26 +654,30 @@ ZIO_SPAN_POLL_EVENT_FUNCTION(wanpipe_poll_event) { #ifdef LIBSANGOMA_VERSION - sangoma_wait_obj_t pfds[ZAP_MAX_CHANNELS_SPAN]; + sangoma_wait_obj_t *pfds[ZAP_MAX_CHANNELS_SPAN] = { 0 }; #else struct pollfd pfds[ZAP_MAX_CHANNELS_SPAN]; #endif uint32_t i, j = 0, k = 0, l = 0; - int objects=0; int r; for(i = 1; i <= span->chan_count; i++) { zap_channel_t *zchan = span->channels[i]; + #ifdef LIBSANGOMA_VERSION - sangoma_init_wait_obj(&pfds[j], zchan->sockfd , 1, 1, POLLPRI, SANGOMA_WAIT_OBJ); + if (!zchan->mod_data) { + continue; + } + pfds[j] = zchan->mod_data; + #else memset(&pfds[j], 0, sizeof(pfds[j])); pfds[j].fd = span->channels[i]->sockfd; pfds[j].events = POLLPRI; #endif - objects++; + /* The driver probably should be able to do this wink/flash/ringing by itself this is sort of a hack to make it work! */ if (zap_test_flag(zchan, ZAP_CHANNEL_WINK) || zap_test_flag(zchan, ZAP_CHANNEL_FLASH)) { @@ -703,7 +718,7 @@ ms = l; } #ifdef LIBSANGOMA_VERSION - r = sangoma_socket_waitfor_many(pfds,objects,ms); + r = sangoma_socket_waitfor_many(pfds, j, ms); #else r = poll(pfds, j, ms); #endif @@ -935,6 +950,15 @@ */ static ZIO_CHANNEL_DESTROY_FUNCTION(wanpipe_channel_destroy) { + sangoma_wait_obj_t *sangoma_wait_obj; + + if (zchan->mod_data) { + sangoma_wait_obj = zchan->mod_data; + zchan->mod_data = NULL; + sangoma_release_wait_obj(sangoma_wait_obj); + free(sangoma_wait_obj); + } + if (zchan->sockfd > -1) { close(zchan->sockfd); zchan->sockfd = WP_INVALID_SOCKET;