static void _destroy_recv_parts (lcm_udpm_t *lcm) { if (lcm->thread_created) { // send the read thread an exit command int wstatus = lcm_internal_pipe_write(lcm->thread_msg_pipe[1], "\0", 1); if(wstatus < 0) { perror(__FILE__ " write(destroy)"); } else { g_thread_join (lcm->read_thread); } lcm->read_thread = NULL; lcm->thread_created = 0; } if (lcm->thread_msg_pipe[0] >= 0) { lcm_internal_pipe_close(lcm->thread_msg_pipe[0]); lcm_internal_pipe_close(lcm->thread_msg_pipe[1]); lcm->thread_msg_pipe[0] = lcm->thread_msg_pipe[1] = -1; } if (lcm->recvfd >= 0) { lcm_close_socket(lcm->recvfd); lcm->recvfd = -1; } if (lcm->frag_bufs) { lcm_frag_buf_store_destroy(lcm->frag_bufs); lcm->frag_bufs = NULL; } if (lcm->inbufs_empty) { lcm_buf_queue_free (lcm->inbufs_empty, lcm->ringbuf); lcm->inbufs_empty = NULL; } if (lcm->inbufs_filled) { lcm_buf_queue_free (lcm->inbufs_filled, lcm->ringbuf); lcm->inbufs_filled = NULL; } if (lcm->ringbuf) { lcm_ringbuf_free (lcm->ringbuf); lcm->ringbuf = NULL; } }
void lcm_buf_free_data(lcm_buf_t *lcmb, lcm_ringbuf_t *ringbuf) { if(!lcmb->buf) return; if (lcmb->ringbuf) { lcm_ringbuf_dealloc (lcmb->ringbuf, lcmb->buf); // if the packet was allocated from an obsolete and empty ringbuffer, // then deallocate the old ringbuffer as well. if(lcmb->ringbuf != ringbuf && !lcm_ringbuf_used(lcmb->ringbuf)) { lcm_ringbuf_free(lcmb->ringbuf); dbg(DBG_LCM, "Destroying unused orphan ringbuffer %p\n", lcmb->ringbuf); } } else { free (lcmb->buf); } lcmb->buf = NULL; lcmb->buf_size = 0; lcmb->ringbuf = NULL; }