VCOS_STATUS_T vcos_pthreads_map_errno(void) { #ifdef WIN32_KERN // TODO : Expand error return for kernel mode return vcos_pthreads_map_error(VCOS_EINVAL); #else return vcos_pthreads_map_error(errno); #endif }
VCOS_STATUS_T vcos_pthreads_timer_create(VCOS_TIMER_T *timer, const char *name, void (*expiration_routine)(void *context), void *context) { pthread_mutexattr_t lock_attr; VCOS_STATUS_T result = VCOS_SUCCESS; int settings_changed_initialized = 0; int lock_attr_initialized = 0; int lock_initialized = 0; (void)name; vcos_assert(timer); vcos_assert(expiration_routine); memset(timer, 0, sizeof(VCOS_TIMER_T)); timer->orig_expiration_routine = expiration_routine; timer->orig_context = context; /* Create conditional variable for notifying the timer's thread * when settings change. */ if (result == VCOS_SUCCESS) { int rc = pthread_cond_init(&timer->settings_changed, NULL); if (rc == 0) settings_changed_initialized = 1; else result = vcos_pthreads_map_error(rc); } /* Create attributes for the lock (we want it to be recursive) */ if (result == VCOS_SUCCESS) { int rc = pthread_mutexattr_init(&lock_attr); if (rc == 0) { pthread_mutexattr_settype(&lock_attr, PTHREAD_MUTEX_RECURSIVE); lock_attr_initialized = 1; } else { result = vcos_pthreads_map_error(rc); } } /* Create lock for the timer structure */ if (result == VCOS_SUCCESS) { int rc = pthread_mutex_init(&timer->lock, &lock_attr); if (rc == 0) lock_initialized = 1; else result = vcos_pthreads_map_error(rc); } /* Lock attributes are no longer needed */ if (lock_attr_initialized) pthread_mutexattr_destroy(&lock_attr); /* Create the underlying thread */ if (result == VCOS_SUCCESS) { int rc = pthread_create(&timer->thread, NULL, _timer_thread, timer); if (rc != 0) result = vcos_pthreads_map_error(rc); } /* Clean up if anything went wrong */ if (result != VCOS_SUCCESS) { if (lock_initialized) pthread_mutex_destroy(&timer->lock); if (settings_changed_initialized) pthread_cond_destroy(&timer->settings_changed); } return result; }
VCOS_STATUS_T vcos_pthreads_map_errno(void) { return vcos_pthreads_map_error(errno); }