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); }
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; }