예제 #1
0
파일: mux.c 프로젝트: FuangCao/cavan
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;
}
예제 #2
0
파일: mux.c 프로젝트: FuangCao/cavan
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);
}
예제 #3
0
파일: alarm.c 프로젝트: Jack19881218/cavan
void cavan_alarm_thread_stop(struct cavan_alarm_thread *thread)
{
	cavan_thread_stop(&thread->thread);
}
예제 #4
0
파일: Thread.cpp 프로젝트: FuangCao/cavan
CavanThread::~CavanThread(void)
{
	cavan_thread_stop(&mThread);
	cavan_thread_deinit(&mThread);
}