static void lcm_logprov_destroy (lcm_logprov_t *lr) { dbg (DBG_LCM, "closing lcm log provider context\n"); if (lr->thread_created) { /* Destroy the timer thread */ int64_t abort_cmd = -1; int status = lcm_internal_pipe_write(lr->timer_pipe[1], &abort_cmd, sizeof(abort_cmd)); if(status < 0) { perror(__FILE__ " - write (abort_cmd)"); } g_thread_join (lr->timer_thread); } if(lr->notify_pipe[0] >= 0) lcm_internal_pipe_close(lr->notify_pipe[0]); if(lr->notify_pipe[1] >= 0) lcm_internal_pipe_close(lr->notify_pipe[1]); if(lr->timer_pipe[0] >= 0) lcm_internal_pipe_close(lr->timer_pipe[0]); if(lr->timer_pipe[1] >= 0) lcm_internal_pipe_close(lr->timer_pipe[1]); if (lr->event) lcm_eventlog_free_event (lr->event); if (lr->log) lcm_eventlog_destroy (lr->log); free (lr->filename); free (lr); }
void lcm_udpm_destroy (lcm_udpm_t *lcm) { dbg (DBG_LCM, "closing lcm context\n"); _destroy_recv_parts (lcm); if (lcm->sendfd >= 0) _close_socket(lcm->sendfd); lcm_internal_pipe_close(lcm->notify_pipe[0]); lcm_internal_pipe_close(lcm->notify_pipe[1]); g_static_rec_mutex_free (&lcm->mutex); g_static_mutex_free (&lcm->transmit_lock); free (lcm); }
static void lcm_memq_destroy(lcm_memq_t *self) { dbg(DBG_LCM, "destroying LCM memq provider context\n"); if (self->notify_pipe[0] >= 0) lcm_internal_pipe_close(self->notify_pipe[0]); if (self->notify_pipe[1] >= 0) lcm_internal_pipe_close(self->notify_pipe[1]); while (!g_queue_is_empty(self->queue)) { memq_msg_t *msg = (memq_msg_t *) g_queue_pop_head(self->queue); memq_msg_destroy(msg); } g_queue_free(self->queue); g_mutex_free(self->mutex); memset(self, 0, sizeof(lcm_memq_t)); free(self); }
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; } }