blob: df2339a9791a8f483b7dd58f45566836e75d0d69 [file] [log] [blame]
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -08001/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef __FDEVENT_H
18#define __FDEVENT_H
19
Yabin Cuic1b1f6f2015-09-15 16:27:09 -070020#include <stddef.h>
David 'Digit' Turnerf6330a22009-05-18 17:36:28 +020021#include <stdint.h> /* for int64_t */
22
Josh Gao4c936392017-05-03 14:10:39 -070023#include <functional>
24
Josh Gao3b37fa22018-05-14 13:42:49 -070025#include "adb_unique_fd.h"
26
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080027/* events that may be observed */
28#define FDE_READ 0x0001
29#define FDE_WRITE 0x0002
30#define FDE_ERROR 0x0004
31
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080032typedef void (*fd_func)(int fd, unsigned events, void *userdata);
33
Yabin Cuic1b1f6f2015-09-15 16:27:09 -070034struct fdevent {
Josh Gaoded557f2018-06-18 14:55:27 -070035 uint64_t id;
36
Josh Gao3b37fa22018-05-14 13:42:49 -070037 unique_fd fd;
Josh Gao71f775a2018-05-14 11:14:33 -070038 int force_eof = 0;
Yabin Cuic1b1f6f2015-09-15 16:27:09 -070039
Josh Gao71f775a2018-05-14 11:14:33 -070040 uint16_t state = 0;
41 uint16_t events = 0;
Yabin Cuic1b1f6f2015-09-15 16:27:09 -070042
Josh Gao71f775a2018-05-14 11:14:33 -070043 fd_func func = nullptr;
44 void* arg = nullptr;
Yabin Cuic1b1f6f2015-09-15 16:27:09 -070045};
46
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080047/* Allocate and initialize a new fdevent object
David 'Digit' Turnerf6330a22009-05-18 17:36:28 +020048 * Note: use FD_TIMER as 'fd' to create a fd-less object
49 * (used to implement timers).
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080050*/
51fdevent *fdevent_create(int fd, fd_func func, void *arg);
52
Josh Gao2f6c2fa2018-09-20 17:38:55 -070053// Deallocate an fdevent object that was created by fdevent_create.
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080054void fdevent_destroy(fdevent *fde);
55
Josh Gao2f6c2fa2018-09-20 17:38:55 -070056// fdevent_destroy, except releasing the file descriptor previously owned by the fdevent.
57unique_fd fdevent_release(fdevent* fde);
58
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080059/* Change which events should cause notifications
60*/
61void fdevent_set(fdevent *fde, unsigned events);
62void fdevent_add(fdevent *fde, unsigned events);
63void fdevent_del(fdevent *fde, unsigned events);
64
David 'Digit' Turnerf6330a22009-05-18 17:36:28 +020065void fdevent_set_timeout(fdevent *fde, int64_t timeout_ms);
66
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080067/* loop forever, handling events.
68*/
69void fdevent_loop();
70
Yabin Cuib5e11412017-03-10 16:01:01 -080071void check_main_thread();
72
Josh Gao4c936392017-05-03 14:10:39 -070073// Queue an operation to run on the main thread.
74void fdevent_run_on_main_thread(std::function<void()> fn);
75
Josh Gao022d4472016-02-10 14:49:00 -080076// The following functions are used only for tests.
77void fdevent_terminate_loop();
Yabin Cuic1b1f6f2015-09-15 16:27:09 -070078size_t fdevent_installed_count();
Yabin Cuic1b1f6f2015-09-15 16:27:09 -070079void fdevent_reset();
Yabin Cuib5e11412017-03-10 16:01:01 -080080void set_main_thread();
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080081
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080082#endif