/** * @brief Get the kind of a pthread read/write lock attributes object. * @see pthread_rwlockattr_getkind_np() * @param attr a pointer to the read/write lock attributes object to be queried. * @param pref a pointer to an integer that will receive the kind of the read/write lock. * @return 0 on success or an error number on failure. */ int rwlock_attr_getkind(pthread_rwlockattr_t *attr, int *pref) { #ifdef MAGMA_PEDANTIC int result = pthread_rwlockattr_getkind_np(attr, pref); if (result) log_pedantic("Could not get the read/write lock attribute preference. {pthread_rwlockattr_getkind_np = %i}", result); return result; #else return pthread_rwlockattr_getkind_np(attr, pref); #endif }
TEST(pthread, pthread_rwlockattr_smoke) { pthread_rwlockattr_t attr; ASSERT_EQ(0, pthread_rwlockattr_init(&attr)); int pshared_value_array[] = {PTHREAD_PROCESS_PRIVATE, PTHREAD_PROCESS_SHARED}; for (size_t i = 0; i < sizeof(pshared_value_array) / sizeof(pshared_value_array[0]); ++i) { ASSERT_EQ(0, pthread_rwlockattr_setpshared(&attr, pshared_value_array[i])); int pshared; ASSERT_EQ(0, pthread_rwlockattr_getpshared(&attr, &pshared)); ASSERT_EQ(pshared_value_array[i], pshared); } int kind_array[] = {PTHREAD_RWLOCK_PREFER_READER_NP, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP}; for (size_t i = 0; i < sizeof(kind_array) / sizeof(kind_array[0]); ++i) { ASSERT_EQ(0, pthread_rwlockattr_setkind_np(&attr, kind_array[i])); int kind; ASSERT_EQ(0, pthread_rwlockattr_getkind_np(&attr, &kind)); ASSERT_EQ(kind_array[i], kind); } ASSERT_EQ(0, pthread_rwlockattr_destroy(&attr)); }