Exemplo n.º 1
0
int cavan_thread_msleep(struct cavan_thread *thread, u32 msec)
{
	struct timespec time;

	cavan_timer_set_timespec(&time, msec);

	return cavan_thread_msleep_until(thread, &time);
}
Exemplo n.º 2
0
ssize_t cavan_cache_read(struct cavan_cache *cache, char *buff, size_t size, size_t reserved, u32 timeout)
{
	ssize_t length, rcount;

	pthread_mutex_lock(&cache->lock);

	while (1)
	{
		if (cache->head > cache->tail)
		{
			rcount = cache->mem_end - cache->head;
			length = rcount + (cache->tail - cache->mem);
		}
		else
		{
			length = rcount = cache->tail - cache->head;
		}

#if CAVAN_CACHE_DEBUG
		println("Read: head = %p, tail = %p, rcount = %d, length = %d, used_space = %d",
			cache->head, cache->tail, rcount, length, cavan_cache_used_space(cache));
#endif

		if ((size_t) length > reserved)
		{
			length -= reserved;
			break;
		}

		if (cache->closed)
		{
			length = 0;
			goto out_pthread_mutex_unlock;
		}

		if (timeout > 0)
		{
			int ret;
			struct timespec abstime;

			cavan_timer_set_timespec(&abstime, timeout);

			ret = pthread_cond_timedwait(&cache->rdcond, &cache->lock, &abstime);
			if (ret != 0)
			{
				length = -ETIMEDOUT;
				pr_red_info("pthread_cond_timedwait");
				goto out_pthread_mutex_unlock;
			}
		}
		else
		{
			pthread_cond_wait(&cache->rdcond, &cache->lock);
		}
	}

	if ((size_t) length > size)
	{
		length = size;
	}

	if (length > rcount)
	{
		size_t lcount = length - rcount;

		memcpy(buff, cache->head, rcount);
		memcpy(buff + rcount, cache->mem, lcount);
		cache->head = cache->mem + lcount;
	}
	else
	{
		memcpy(buff, cache->head, length);

		cache->head += length;
		if (cache->head >= cache->mem_end)
		{
			cache->head = cache->mem;
		}
	}

	pthread_cond_signal(&cache->wrcond);

out_pthread_mutex_unlock:
	pthread_mutex_unlock(&cache->lock);
	return length;
}