+ /* Get time for sem_timedwait absolute timeout */
+ ret = clock_gettime(CLOCK_REALTIME, &timeout);
+ if (ret < 0) {
+ PERROR("clock_gettime spawn kconsumerd");
+ /* Infinite wait for the kconsumerd thread to be ready */
+ ret = sem_wait(&kconsumerd_sem);
+ } else {
+ /* Normal timeout if the gettime was successful */
+ timeout.tv_sec += DEFAULT_SEM_WAIT_TIMEOUT;
+ ret = sem_timedwait(&kconsumerd_sem, &timeout);
+ }
+
+ if (ret < 0) {
+ if (errno == ETIMEDOUT) {
+ /*
+ * Call has timed out so we kill the kconsumerd_thread and return
+ * an error.
+ */
+ ERR("The kconsumerd thread was never ready. Killing it");
+ ret = pthread_cancel(kconsumerd_thread);
+ if (ret < 0) {
+ PERROR("pthread_cancel kconsumerd_thread");
+ }
+ } else {
+ PERROR("semaphore wait failed kconsumerd thread");
+ }
+ goto error;
+ }