/* * Implementation of the "udf-list" Info. Command. */ int udf_cask_info_list(char *name, cf_dyn_buf *out) { cf_debug(AS_UDF, "UDF CASK INFO LIST"); pthread_mutex_t get_data_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t get_data_cond_var = PTHREAD_COND_INITIALIZER; udf_get_data_t get_data; get_data.db = out; get_data.cv = &get_data_cond_var; get_data.mt = &get_data_mutex; get_data.done = false; pthread_mutex_lock(&get_data_mutex); int retval = as_smd_get_metadata(udf_smd_module_name, "", udf_cask_get_metadata_cb, &get_data); if (!retval) { do { // [Note: Loop protects against spurious wakeups.] if ((retval = pthread_cond_wait(&get_data_cond_var, &get_data_mutex))) { cf_warning(AS_UDF, "pthread_cond_wait failed (rv %d)", retval); break; } } while (!get_data.done); } else { cf_warning(AS_UDF, "failed to get UDF metadata (rv %d)", retval); } pthread_mutex_unlock(&get_data_mutex); pthread_mutex_destroy(&get_data_mutex); pthread_cond_destroy(&get_data_cond_var); return retval; }
/* * Implementation of the "udf-list" Info. Command. */ int udf_cask_info_list(char *name, cf_dyn_buf *out) { cf_debug(AS_UDF, "UDF CASK INFO LIST"); pthread_mutex_t get_data_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t get_data_cond_var = PTHREAD_COND_INITIALIZER; udf_get_data_t get_data; get_data.db = out; get_data.cv = &get_data_cond_var; pthread_mutex_lock(&get_data_mutex); int retval = as_smd_get_metadata(udf_smd_module_name, "", udf_cask_get_metadata_cb, &get_data); if (!retval) { if ((retval = pthread_cond_wait(&get_data_cond_var, &get_data_mutex))) { cf_warning(AS_UDF, "pthread_cond_wait failed (rv %d)", retval); } } else { cf_warning(AS_UDF, "failed to get UDF metadata (rv %d)", retval); } pthread_mutex_unlock(&get_data_mutex); pthread_mutex_destroy(&get_data_mutex); pthread_cond_destroy(&get_data_cond_var); return retval; }