Ejemplo n.º 1
0
static int cavan_alarm_thread_handler(struct cavan_thread *thread, void *data)
{
	struct cavan_alarm_thread *alarm_thread = data;
	struct double_link_node *node;

	pthread_mutex_lock(&alarm_thread->lock);

	node = double_link_get_first_node(&alarm_thread->link);
	if (node == NULL)
	{
		alarm(0);
		cavan_thread_suspend(thread);
	}
	else
	{
		struct cavan_alarm_node *alarm_node = double_link_get_container(&alarm_thread->link, node);
		time_t curr_time;

		curr_time = time(NULL);
		if (curr_time < 0)
		{
			pr_error_info("get current time");
			pthread_mutex_unlock(&thread->lock);
			return curr_time;
		}

		cavan_show_date2(curr_time, "curr_time = ");
		cavan_show_date2(alarm_node->time, "alarm_time = ");

		if (curr_time < alarm_node->time)
		{
			alarm(alarm_node->time - curr_time);
			cavan_thread_suspend(thread);
		}
		else
		{
			double_link_remove(&alarm_thread->link, node);
			alarm_node->handler(alarm_node, alarm_thread, alarm_node->private_data);

			if (alarm_node->repeat)
			{
				alarm_node->time += alarm_node->repeat;
				cavan_alarm_insert_node_base(alarm_thread, alarm_node);
			}
			else if (alarm_node->destroy)
			{
				alarm_node->destroy(alarm_node, alarm_node->private_data);
			}
		}
	}

	pthread_mutex_unlock(&alarm_thread->lock);

	return 0;
}
Ejemplo n.º 2
0
static int cavan_mux_send_thread_handler(struct cavan_thread *thread, void *data)
{
	struct cavan_mux *mux = data;
	struct cavan_mux_package_raw *package_raw;

	package_raw = mux->package_head;
	if (package_raw == NULL)
	{
		cavan_thread_suspend(thread);
	}
	else
	{
		struct cavan_mux_package *package = &package_raw->package;
		char *data = (char *) package;
		size_t length = cavan_mux_package_get_whole_length(package);

		while (length)
		{
			ssize_t wrlen;

			wrlen = mux->send(mux, data, length);
			if (wrlen < 0)
			{
				pr_red_info("mux->send");
				return wrlen;
			}

			data += wrlen;
			length -= wrlen;
		}

		mux->package_head = package_raw->next;
		if (mux->package_head == NULL)
		{
			mux->package_tail = &mux->package_head;
		}

		cavan_mux_package_free(mux, package);
	}

	return 0;
}