Exemplo 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;
}
Exemplo n.º 2
0
void *cavan_data_pool_alloc(struct cavan_data_pool *pool)
{
	void *data;
	struct double_link_node *node;
	struct cavan_data_pool_node *pool_node;

	node = double_link_pop(&pool->link);
	if (node) {
		return double_link_get_container(&pool->link, node);
	}

	data = malloc(pool->node_size);
	if (data == NULL) {
		pr_error_info("malloc");
		return NULL;
	}

	pool_node = cavan_data_pool_to_node(pool, data);
	pool_node->destroy = cavan_data_pool_node_destroy2;
	double_link_node_init(&pool_node->node);

	return data;
}
Exemplo n.º 3
0
static bool cavan_alarm_insert_matcher(struct double_link *link, struct double_link_node *node, void *data)
{
	struct cavan_alarm_node *alarm_node = double_link_get_container(link, node);

	return alarm_node->time > *(time_t *) data;
}