19b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng/* 29b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng * Copyright (C) 2013 The Android Open Source Project 39b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng * 49b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng * Licensed under the Apache License, Version 2.0 (the "License"); 59b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng * you may not use this file except in compliance with the License. 69b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng * You may obtain a copy of the License at 79b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng * 89b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng * http://www.apache.org/licenses/LICENSE-2.0 99b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng * 109b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng * Unless required by applicable law or agreed to in writing, software 119b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng * distributed under the License is distributed on an "AS IS" BASIS, 129b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng * See the License for the specific language governing permissions and 149b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng * limitations under the License. 159b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng */ 169b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng 17f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#include <errno.h> 18f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#include <fcntl.h> 199b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng 20f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#include <gtest/gtest.h> 219b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng 22f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#if defined(__BIONIC__) // Android's prebuilt gcc's header files don't include <sys/eventfd.h>. 239b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng#include <sys/eventfd.h> 24f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#else 25f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris// Include the necessary components of sys/eventfd.h right here. 26f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#include <stdint.h> 27f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris 28f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferristypedef uint64_t eventfd_t; 29f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris 30f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris__BEGIN_DECLS 31f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferrisextern int eventfd(int, int); 32f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferrisextern int eventfd_read(int, eventfd_t*); 33f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferrisextern int eventfd_write(int, eventfd_t); 34f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris__END_DECLS 35f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#endif 369b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng 379b84824dfd597d8137137fa33295faa26cc70ae0Kito ChengTEST(eventfd, smoke) { 389b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng unsigned int initial_value = 2; 399b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng int fd = eventfd(initial_value, O_NONBLOCK); 409b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng ASSERT_NE(fd, -1); 419b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng 429b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng eventfd_t value = 123; 439b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng ASSERT_EQ(0, eventfd_read(fd, &value)); 449b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng ASSERT_EQ(initial_value, value); 459b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng 469b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng // Reading clears the counter. 479b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng ASSERT_EQ(-1, eventfd_read(fd, &value)); 489b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng ASSERT_EQ(EAGAIN, errno); 499b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng 509b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng // Values written are added until the next read. 519b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng ASSERT_EQ(0, eventfd_write(fd, 1)); 529b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng ASSERT_EQ(0, eventfd_write(fd, 1)); 539b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng ASSERT_EQ(0, eventfd_write(fd, 1)); 549b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng 559b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng ASSERT_EQ(0, eventfd_read(fd, &value)); 569b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng ASSERT_EQ(3U, value); 579b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng 589b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng close(fd); 599b84824dfd597d8137137fa33295faa26cc70ae0Kito Cheng} 60