int cavan_mux_init(struct cavan_mux *mux, void *data) { int i; int ret; struct cavan_thread *thread; if (mux->send == NULL || mux->recv == NULL) { pr_red_info("mux->send = %p, mux->recv = %p", mux->send, mux->recv); return -EINVAL; } cavan_lock_init(&mux->lock, false); ret = cavan_mem_queue_init(&mux->recv_queue, CAVAN_MUX_MTU); if (ret < 0) { pr_red_info("cavan_mem_queue_init: %d", ret); goto out_cavan_lock_deinit; } mux->private_data = data; mux->packages = NULL; mux->package_head = NULL; mux->package_tail = &mux->package_head; for (i = 0; i < NELEM(mux->links); i++) { mux->links[i] = NULL; } thread = &mux->recv_thread; thread->name = "MUX RECEIVE"; thread->handler = cavan_mux_recv_thread_handler; thread->wake_handker = NULL; ret = cavan_thread_run(thread, mux, 0); if (ret < 0) { pr_red_info("cavan_thread_run"); goto out_cavan_mem_queue_deinit; } thread = &mux->send_thread; thread->name = "MUX SEND"; thread->handler = cavan_mux_send_thread_handler; thread->wake_handker = NULL; ret = cavan_thread_run(thread, mux, 0); if (ret < 0) { pr_red_info("cavan_thread_run"); goto out_cavan_thread_stop_recv; } return 0; out_cavan_thread_stop_recv: cavan_thread_stop(&mux->recv_thread); out_cavan_mem_queue_deinit: cavan_mem_queue_deinit(&mux->recv_queue); out_cavan_lock_deinit: cavan_lock_deinit(&mux->lock); return ret; }
void cavan_mux_deinit(struct cavan_mux *mux) { struct cavan_mux_package_raw *head; cavan_thread_stop(&mux->recv_thread); cavan_lock_acquire(&mux->lock); head = mux->packages; while (head) { struct cavan_mux_package_raw *next = head->next; free(head); head = next; } cavan_lock_release(&mux->lock); cavan_lock_deinit(&mux->lock); }
void cavan_alarm_thread_stop(struct cavan_alarm_thread *thread) { cavan_thread_stop(&thread->thread); }
CavanThread::~CavanThread(void) { cavan_thread_stop(&mThread); cavan_thread_deinit(&mThread); }