TEST(membarrier, query) {
ScopedErrnoCleaner errno_cleaner; int supported = syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0); if (supported == -1 && errno == ENOSYS) GTEST_SKIP() << "no membarrier() in this kernel";
ASSERT_GE(supported, 0);
}
TEST(membarrier, global_barrier) { if (!HasMembarrier(MEMBARRIER_CMD_GLOBAL)) {
GTEST_SKIP() << "MEMBARRIER_CMD_GLOBAL not supported";
}
ASSERT_EQ(0, syscall(__NR_membarrier, MEMBARRIER_CMD_GLOBAL, 0));
}
staticconstchar* MembarrierCommandToName(int membarrier_cmd) { switch (membarrier_cmd) { case MEMBARRIER_CMD_QUERY: return"MEMBARRIER_CMD_QUERY"; case MEMBARRIER_CMD_GLOBAL: return"MEMBARRIER_CMD_GLOBAL"; case MEMBARRIER_CMD_GLOBAL_EXPEDITED: return"MEMBARRIER_CMD_GLOBAL_EXPEDITED"; case MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED: return"MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED"; case MEMBARRIER_CMD_PRIVATE_EXPEDITED: return"MEMBARRIER_CMD_PRIVATE_EXPEDITED"; case MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED: return"MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED"; case MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE: return"MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE"; case MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE: return"MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE"; default: return"MEMBARRIER_UNKNOWN";
}
}
staticvoid TestRegisterAndBarrierCommands(int membarrier_cmd_register, int membarrier_cmd_barrier) { if (!HasMembarrier(membarrier_cmd_register)) {
GTEST_SKIP() << MembarrierCommandToName(membarrier_cmd_register) << " not supported";
} if (!HasMembarrier(membarrier_cmd_barrier)) {
GTEST_SKIP() << MembarrierCommandToName(membarrier_cmd_barrier) << " not supported";
}
ScopedErrnoCleaner errno_cleaner;
// Check barrier use without prior registration. if (membarrier_cmd_register == MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED) { // Global barrier use is always okay.
ASSERT_EQ(0, syscall(__NR_membarrier, membarrier_cmd_barrier, 0));
} else { // Private barrier should fail.
ASSERT_ERRNO_FAILURE(EPERM, -1, syscall(__NR_membarrier, membarrier_cmd_barrier, 0));
}
// Check registration for barrier succeeds.
ASSERT_EQ(0, syscall(__NR_membarrier, membarrier_cmd_register, 0));
// Check barrier use after registration succeeds.
ASSERT_EQ(0, syscall(__NR_membarrier, membarrier_cmd_barrier, 0));
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.