blob: 4a46c30688e8b23b76b8ec4e7de830350d1b22f0 [file]
/** @file
A brief file description
@section license License
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#pragma once
#include "tscore/ink_config.h"
#include "tscore/ink_platform.h"
struct PollDescriptor;
using EventLoop = PollDescriptor *;
#define USE_EDGE_TRIGGER_EPOLL 1
#define USE_EDGE_TRIGGER_KQUEUE 1
#define USE_EDGE_TRIGGER_PORT 1
#if TS_USE_EPOLL
#ifndef EPOLLEXCLUSIVE
#define EPOLLEXCLUSIVE 0
#endif
#ifdef USE_EDGE_TRIGGER_EPOLL
#define USE_EDGE_TRIGGER 1
#define EVENTIO_READ (EPOLLIN | EPOLLET)
#define EVENTIO_WRITE (EPOLLOUT | EPOLLET)
#else
#define EVENTIO_READ EPOLLIN
#define EVENTIO_WRITE EPOLLOUT
#endif
#define EVENTIO_ERROR (EPOLLERR | EPOLLPRI | EPOLLHUP)
#endif
#if TS_USE_KQUEUE
#ifdef USE_EDGE_TRIGGER_KQUEUE
#define USE_EDGE_TRIGGER 1
#define INK_EV_EDGE_TRIGGER EV_CLEAR
#else
#define INK_EV_EDGE_TRIGGER 0
#endif
#include <sys/event.h>
#define INK_EVP_IN 0x001
#define INK_EVP_PRI 0x002
#define INK_EVP_OUT 0x004
#define INK_EVP_ERR 0x010
#define INK_EVP_HUP 0x020
#define EVENTIO_READ INK_EVP_IN
#define EVENTIO_WRITE INK_EVP_OUT
#define EVENTIO_ERROR (0x010 | 0x002 | 0x020) // ERR PRI HUP
#endif
/// Unified API for setting and clearing kernel and epoll events.
struct EventIO {
int fd = -1; ///< file descriptor, often a system port
#if TS_USE_KQUEUE || TS_USE_EPOLL && !defined(USE_EDGE_TRIGGER)
int events = 0; ///< a bit mask of enabled events
#endif
EventLoop event_loop = nullptr; ///< the assigned event loop
bool syscall = true; ///< if false, disable all functionality (for QUIC)
/** Alter the events that will trigger the continuation, for level triggered I/O.
@param events add with positive mask(+EVENTIO_READ), or remove with negative mask (-EVENTIO_READ)
@return int the number of events created, -1 is error
*/
int modify(int events);
/** Refresh the existing events (i.e. KQUEUE EV_CLEAR), for edge triggered I/O
@param events mask of events
@return int the number of events created, -1 is error
*/
int refresh(int events);
/// Remove the kernel or epoll event. Returns 0 on success.
int stop();
// Process one event that has triggered.
virtual void process_event(int flags) = 0;
EventIO() {}
virtual ~EventIO() {}
protected:
/** The start methods all logically Setup a class to be called
when a file descriptor is available for read or write.
The type of the classes vary. Generally the file descriptor
is pulled from the class, but there is one option that lets
the file descriptor be expressed directly.
@param l the event loop
@param events a mask of flags (for details `man epoll_ctl`)
@return int the number of events created, -1 is error
*/
int start_common(EventLoop l, int fd, int events);
};