TEST(adb_utils, set_file_block_mode) { int fd = adb_open("/dev/null", O_RDWR | O_APPEND); ASSERT_GE(fd, 0); int flags = fcntl(fd, F_GETFL, 0); ASSERT_EQ(O_RDWR | O_APPEND, (flags & (O_RDWR | O_APPEND))); ASSERT_TRUE(set_file_block_mode(fd, false)); int new_flags = fcntl(fd, F_GETFL, 0); ASSERT_EQ(flags | O_NONBLOCK, new_flags); ASSERT_TRUE(set_file_block_mode(fd, true)); new_flags = fcntl(fd, F_GETFL, 0); ASSERT_EQ(flags, new_flags); ASSERT_EQ(0, adb_close(fd)); }
void fdevent_install(fdevent* fde, int fd, fd_func func, void* arg) { CHECK_GE(fd, 0); memset(fde, 0, sizeof(fdevent)); fde->state = FDE_ACTIVE; fde->fd = fd; fde->func = func; fde->arg = arg; if (!set_file_block_mode(fd, false)) { // Here is not proper to handle the error. If it fails here, some error is // likely to be detected by poll(), then we can let the callback function // to handle it. LOG(ERROR) << "failed to set non-blocking mode for fd " << fd; } auto pair = g_poll_node_map.emplace(fde->fd, PollNode(fde)); CHECK(pair.second) << "install existing fd " << fd; D("fdevent_install %s", dump_fde(fde).c_str()); }