1d9f0492fSopenharmony_ci/* 2d9f0492fSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3d9f0492fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4d9f0492fSopenharmony_ci * you may not use this file except in compliance with the License. 5d9f0492fSopenharmony_ci * You may obtain a copy of the License at 6d9f0492fSopenharmony_ci * 7d9f0492fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8d9f0492fSopenharmony_ci * 9d9f0492fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10d9f0492fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11d9f0492fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12d9f0492fSopenharmony_ci * See the License for the specific language governing permissions and 13d9f0492fSopenharmony_ci * limitations under the License. 14d9f0492fSopenharmony_ci */ 15d9f0492fSopenharmony_ci 16d9f0492fSopenharmony_ci#ifndef LOOP_EVENT_H 17d9f0492fSopenharmony_ci#define LOOP_EVENT_H 18d9f0492fSopenharmony_ci#include <stdint.h> 19d9f0492fSopenharmony_ci#include <stdlib.h> 20d9f0492fSopenharmony_ci#include <sys/signalfd.h> 21d9f0492fSopenharmony_ci 22d9f0492fSopenharmony_ci#ifdef __cplusplus 23d9f0492fSopenharmony_ci#if __cplusplus 24d9f0492fSopenharmony_ciextern "C" { 25d9f0492fSopenharmony_ci#endif 26d9f0492fSopenharmony_ci#endif 27d9f0492fSopenharmony_ci 28d9f0492fSopenharmony_ci// 配置 29d9f0492fSopenharmony_ci#define LOOP_EVENT_USE_EPOLL 1 30d9f0492fSopenharmony_ci#define LOOP_DEFAULT_BUFFER (1024 * 5) 31d9f0492fSopenharmony_ci#define LOOP_MAX_BUFFER (1024 * 64) 32d9f0492fSopenharmony_ci 33d9f0492fSopenharmony_ci#define LOOP_MAX_CLIENT 1024 34d9f0492fSopenharmony_ci#define LOOP_MAX_SOCKET 1024 35d9f0492fSopenharmony_ci#define DEFAULT_TIMEOUT 1000 36d9f0492fSopenharmony_ci 37d9f0492fSopenharmony_citypedef enum { 38d9f0492fSopenharmony_ci EVENT_READ = (0x0001), 39d9f0492fSopenharmony_ci EVENT_WRITE = (0x0002), 40d9f0492fSopenharmony_ci EVENT_ERROR = (0x0004), 41d9f0492fSopenharmony_ci EVENT_FREE = (0x0008), 42d9f0492fSopenharmony_ci EVENT_TIMEOUT = (0x0010), 43d9f0492fSopenharmony_ci EVENT_SIGNAL = (0x0020), 44d9f0492fSopenharmony_ci} EventOper; 45d9f0492fSopenharmony_ci 46d9f0492fSopenharmony_citypedef enum { 47d9f0492fSopenharmony_ci LE_SUCCESS = 0, 48d9f0492fSopenharmony_ci LE_FAILURE = 10000, 49d9f0492fSopenharmony_ci LE_INVALID_PARAM, 50d9f0492fSopenharmony_ci LE_NO_MEMORY, 51d9f0492fSopenharmony_ci LE_DIS_CONNECTED, 52d9f0492fSopenharmony_ci LE_INVALID_TASK 53d9f0492fSopenharmony_ci} LE_STATUS; 54d9f0492fSopenharmony_ci 55d9f0492fSopenharmony_citypedef struct { 56d9f0492fSopenharmony_ci uint32_t flags; 57d9f0492fSopenharmony_ci} LoopBase; 58d9f0492fSopenharmony_ci 59d9f0492fSopenharmony_citypedef LoopBase *LoopHandle; 60d9f0492fSopenharmony_citypedef LoopBase *TaskHandle; 61d9f0492fSopenharmony_citypedef LoopBase *TimerHandle; 62d9f0492fSopenharmony_citypedef LoopBase *SignalHandle; 63d9f0492fSopenharmony_citypedef LoopBase *WatcherHandle; 64d9f0492fSopenharmony_citypedef void *BufferHandle; 65d9f0492fSopenharmony_ci 66d9f0492fSopenharmony_ciLoopHandle LE_GetDefaultLoop(void); 67d9f0492fSopenharmony_ciLE_STATUS LE_CreateLoop(LoopHandle *loopHandle); 68d9f0492fSopenharmony_civoid LE_RunLoop(const LoopHandle loopHandle); 69d9f0492fSopenharmony_civoid LE_CloseLoop(const LoopHandle loopHandle); 70d9f0492fSopenharmony_civoid LE_StopLoop(const LoopHandle loopHandle); 71d9f0492fSopenharmony_civoid LE_CloseTask(const LoopHandle loopHandle, const TaskHandle taskHandle); 72d9f0492fSopenharmony_ci 73d9f0492fSopenharmony_ci/** 74d9f0492fSopenharmony_ci * 申请一个buffer,用于消息的发送和接收 75d9f0492fSopenharmony_ci */ 76d9f0492fSopenharmony_ciBufferHandle LE_CreateBuffer(const LoopHandle loopHandle, uint32_t bufferSize); 77d9f0492fSopenharmony_civoid LE_FreeBuffer(const LoopHandle loopHandle, const TaskHandle taskHandle, const BufferHandle handle); 78d9f0492fSopenharmony_ciuint8_t *LE_GetBufferInfo(const BufferHandle handle, uint32_t *dataSize, uint32_t *buffSize); 79d9f0492fSopenharmony_civoid *LE_GetUserData(const TaskHandle handle); 80d9f0492fSopenharmony_ciint32_t LE_GetSendResult(const BufferHandle handle); 81d9f0492fSopenharmony_ci 82d9f0492fSopenharmony_citypedef void (*LE_Close)(const TaskHandle taskHandle); 83d9f0492fSopenharmony_citypedef struct { 84d9f0492fSopenharmony_ci uint32_t flags; 85d9f0492fSopenharmony_ci LE_Close close; 86d9f0492fSopenharmony_ci uint16_t userDataSize; 87d9f0492fSopenharmony_ci} LE_BaseInfo; 88d9f0492fSopenharmony_ci 89d9f0492fSopenharmony_ci/** 90d9f0492fSopenharmony_ci * 数据流服务,可以指定使用pipe或者普通的tcp 91d9f0492fSopenharmony_ci */ 92d9f0492fSopenharmony_ci#define TASK_STREAM 0x01 93d9f0492fSopenharmony_ci#define TASK_TCP (0x01 << 8) 94d9f0492fSopenharmony_ci#define TASK_PIPE (0x02 << 8) 95d9f0492fSopenharmony_ci#define TASK_SERVER (0x01 << 16) 96d9f0492fSopenharmony_ci#define TASK_CONNECT (0x02 << 16) 97d9f0492fSopenharmony_ci#define TASK_TEST (0x01 << 24) 98d9f0492fSopenharmony_ci#define TASK_PUBLIC (0x01 << 25) // If the socket can be publicly connected 99d9f0492fSopenharmony_citypedef void (*LE_DisConnectComplete)(const TaskHandle client); 100d9f0492fSopenharmony_citypedef void (*LE_ConnectComplete)(const TaskHandle client); 101d9f0492fSopenharmony_citypedef void (*LE_SendMessageComplete)(const TaskHandle taskHandle, BufferHandle handle); 102d9f0492fSopenharmony_citypedef void (*LE_RecvMessage)(const TaskHandle taskHandle, const uint8_t *buffer, uint32_t buffLen); 103d9f0492fSopenharmony_citypedef int (*LE_IncommingConnect)(const LoopHandle loopHandle, const TaskHandle serverTask); 104d9f0492fSopenharmony_citypedef int (*LE_HandleRecvMsg)(const TaskHandle taskHandle, uint8_t* buffer, int bufferSize, int flags); 105d9f0492fSopenharmony_citypedef struct { 106d9f0492fSopenharmony_ci LE_BaseInfo baseInfo; 107d9f0492fSopenharmony_ci char *server; 108d9f0492fSopenharmony_ci int socketId; 109d9f0492fSopenharmony_ci LE_DisConnectComplete disConnectComplete; 110d9f0492fSopenharmony_ci LE_IncommingConnect incommingConnect; 111d9f0492fSopenharmony_ci LE_SendMessageComplete sendMessageComplete; 112d9f0492fSopenharmony_ci LE_RecvMessage recvMessage; 113d9f0492fSopenharmony_ci} LE_StreamServerInfo; 114d9f0492fSopenharmony_ci 115d9f0492fSopenharmony_citypedef struct { 116d9f0492fSopenharmony_ci LE_BaseInfo baseInfo; 117d9f0492fSopenharmony_ci char *server; 118d9f0492fSopenharmony_ci LE_DisConnectComplete disConnectComplete; 119d9f0492fSopenharmony_ci LE_ConnectComplete connectComplete; 120d9f0492fSopenharmony_ci LE_SendMessageComplete sendMessageComplete; 121d9f0492fSopenharmony_ci LE_RecvMessage recvMessage; 122d9f0492fSopenharmony_ci LE_HandleRecvMsg handleRecvMsg; 123d9f0492fSopenharmony_ci} LE_StreamInfo; 124d9f0492fSopenharmony_ci 125d9f0492fSopenharmony_ciLE_STATUS LE_CreateStreamServer(const LoopHandle loopHandle, 126d9f0492fSopenharmony_ci TaskHandle *taskHandle, const LE_StreamServerInfo *info); 127d9f0492fSopenharmony_ciLE_STATUS LE_CreateStreamClient(const LoopHandle loopHandle, 128d9f0492fSopenharmony_ci TaskHandle *taskHandle, const LE_StreamInfo *info); 129d9f0492fSopenharmony_ciLE_STATUS LE_AcceptStreamClient(const LoopHandle loopHandle, 130d9f0492fSopenharmony_ci const TaskHandle serverTask, TaskHandle *taskHandle, const LE_StreamInfo *info); 131d9f0492fSopenharmony_ciLE_STATUS LE_Send(const LoopHandle loopHandle, 132d9f0492fSopenharmony_ci const TaskHandle taskHandle, const BufferHandle handle, uint32_t buffLen); 133d9f0492fSopenharmony_civoid LE_CloseStreamTask(const LoopHandle loopHandle, const TaskHandle taskHandle); 134d9f0492fSopenharmony_ciint LE_GetSocketFd(const TaskHandle taskHandle); 135d9f0492fSopenharmony_ci 136d9f0492fSopenharmony_ci/** 137d9f0492fSopenharmony_ci * 异步事件服务 138d9f0492fSopenharmony_ci */ 139d9f0492fSopenharmony_citypedef void (*LE_ProcessAsyncEvent)(const TaskHandle taskHandle, 140d9f0492fSopenharmony_ci uint64_t eventId, const uint8_t *buffer, uint32_t buffLen); 141d9f0492fSopenharmony_ci#define TASK_EVENT 0x02 142d9f0492fSopenharmony_ci#define TASK_ASYNC_EVENT (0x01 << 8) 143d9f0492fSopenharmony_ciLE_STATUS LE_CreateAsyncTask(const LoopHandle loopHandle, 144d9f0492fSopenharmony_ci TaskHandle *taskHandle, LE_ProcessAsyncEvent processAsyncEvent); 145d9f0492fSopenharmony_ciLE_STATUS LE_StartAsyncEvent(const LoopHandle loopHandle, 146d9f0492fSopenharmony_ci const TaskHandle taskHandle, uint64_t eventId, const uint8_t *data, uint32_t buffLen); 147d9f0492fSopenharmony_civoid LE_StopAsyncTask(const LoopHandle loopHandle, const TaskHandle taskHandle); 148d9f0492fSopenharmony_ci#ifdef STARTUP_INIT_TEST 149d9f0492fSopenharmony_civoid LE_DoAsyncEvent(const LoopHandle loopHandle, const TaskHandle taskHandle); 150d9f0492fSopenharmony_ci#endif 151d9f0492fSopenharmony_ci 152d9f0492fSopenharmony_ci/** 153d9f0492fSopenharmony_ci * 定时器处理 154d9f0492fSopenharmony_ci */ 155d9f0492fSopenharmony_ci#define TASK_TIME 0x04 156d9f0492fSopenharmony_citypedef void (*LE_ProcessTimer)(const TimerHandle taskHandle, void *context); 157d9f0492fSopenharmony_ci 158d9f0492fSopenharmony_ciLE_STATUS LE_CreateTimer(const LoopHandle loopHandle, TimerHandle *timer, 159d9f0492fSopenharmony_ci LE_ProcessTimer processTimer, void *context); 160d9f0492fSopenharmony_ciLE_STATUS LE_StartTimer(const LoopHandle loopHandle, 161d9f0492fSopenharmony_ci const TimerHandle timer, uint64_t timeout, uint64_t repeat); 162d9f0492fSopenharmony_civoid LE_StopTimer(const LoopHandle loopHandle, const TimerHandle timer); 163d9f0492fSopenharmony_ci 164d9f0492fSopenharmony_ci#define TASK_SIGNAL 0x08 165d9f0492fSopenharmony_citypedef void (*LE_ProcessSignal)(const struct signalfd_siginfo *siginfo); 166d9f0492fSopenharmony_ciLE_STATUS LE_CreateSignalTask(const LoopHandle loopHandle, 167d9f0492fSopenharmony_ci SignalHandle *signalHandle, LE_ProcessSignal processSignal); 168d9f0492fSopenharmony_ciLE_STATUS LE_AddSignal(const LoopHandle loopHandle, const SignalHandle signalHandle, int signal); 169d9f0492fSopenharmony_ciLE_STATUS LE_RemoveSignal(const LoopHandle loopHandle, const SignalHandle signalHandle, int signal); 170d9f0492fSopenharmony_civoid LE_CloseSignalTask(const LoopHandle loopHandle, const SignalHandle signalHandle); 171d9f0492fSopenharmony_ci 172d9f0492fSopenharmony_ci/** 173d9f0492fSopenharmony_ci * 监控句柄变化 174d9f0492fSopenharmony_ci */ 175d9f0492fSopenharmony_ci#define TASK_WATCHER 0x10 176d9f0492fSopenharmony_ci#define WATCHER_ONCE 0x0100 177d9f0492fSopenharmony_citypedef void (*ProcessWatchEvent)(const WatcherHandle taskHandle, int fd, uint32_t *events, const void *context); 178d9f0492fSopenharmony_citypedef struct { 179d9f0492fSopenharmony_ci int fd; 180d9f0492fSopenharmony_ci uint32_t flags; 181d9f0492fSopenharmony_ci uint32_t events; 182d9f0492fSopenharmony_ci LE_Close close; 183d9f0492fSopenharmony_ci ProcessWatchEvent processEvent; 184d9f0492fSopenharmony_ci} LE_WatchInfo; 185d9f0492fSopenharmony_ciLE_STATUS LE_StartWatcher(const LoopHandle loopHandle, 186d9f0492fSopenharmony_ci WatcherHandle *watcherHandle, const LE_WatchInfo *info, const void *context); 187d9f0492fSopenharmony_civoid LE_RemoveWatcher(const LoopHandle loopHandle, const WatcherHandle watcherHandle); 188d9f0492fSopenharmony_ci 189d9f0492fSopenharmony_ci/** 190d9f0492fSopenharmony_ci * Idle Processing:Idle handlers will be called for every loop 191d9f0492fSopenharmony_ci */ 192d9f0492fSopenharmony_ci 193d9f0492fSopenharmony_ci/* Idle Handler */ 194d9f0492fSopenharmony_citypedef void *IdleHandle; 195d9f0492fSopenharmony_ci 196d9f0492fSopenharmony_ci/** 197d9f0492fSopenharmony_ci * @brief Idle process function prototype 198d9f0492fSopenharmony_ci * 199d9f0492fSopenharmony_ci * @param taskHandle idle handler 200d9f0492fSopenharmony_ci * @param context idle function context 201d9f0492fSopenharmony_ci * @return None 202d9f0492fSopenharmony_ci */ 203d9f0492fSopenharmony_citypedef void (*LE_ProcessIdle)(const IdleHandle taskHandle, void *context); 204d9f0492fSopenharmony_ci 205d9f0492fSopenharmony_ci/** 206d9f0492fSopenharmony_ci * @brief Add a new idle handler 207d9f0492fSopenharmony_ci * 208d9f0492fSopenharmony_ci * @param loopHandle the running loop this idle will be attached 209d9f0492fSopenharmony_ci * @param idle optional output parameter for the created idle handler 210d9f0492fSopenharmony_ci * @param processIdle the idle handler function 211d9f0492fSopenharmony_ci * @param context optional idle handler context 212d9f0492fSopenharmony_ci * @param repeat if the idle function will be repeated forevent (non zero) or once (zero) 213d9f0492fSopenharmony_ci * @return status code, 0 means succeed 214d9f0492fSopenharmony_ci */ 215d9f0492fSopenharmony_ciLE_STATUS LE_AddIdle(const LoopHandle loopHandle, IdleHandle *idle, 216d9f0492fSopenharmony_ci LE_ProcessIdle processIdle, void *context, int repeat); 217d9f0492fSopenharmony_ci 218d9f0492fSopenharmony_ci/** 219d9f0492fSopenharmony_ci * @brief Delete an idle handler 220d9f0492fSopenharmony_ci * 221d9f0492fSopenharmony_ci * @param idle idle handler 222d9f0492fSopenharmony_ci * @return None 223d9f0492fSopenharmony_ci */ 224d9f0492fSopenharmony_civoid LE_DelIdle(IdleHandle idle); 225d9f0492fSopenharmony_ci 226d9f0492fSopenharmony_ci/** 227d9f0492fSopenharmony_ci * @brief Execute an function once in the next loop 228d9f0492fSopenharmony_ci * 229d9f0492fSopenharmony_ci * @param loopHandle the running loop this idle will be attached 230d9f0492fSopenharmony_ci * @param idle the function to be executed 231d9f0492fSopenharmony_ci * @param context optional idle handler context 232d9f0492fSopenharmony_ci * @return status code, 0 means succeed 233d9f0492fSopenharmony_ci */ 234d9f0492fSopenharmony_ciint LE_DelayProc(const LoopHandle loopHandle, LE_ProcessIdle idle, void *context); 235d9f0492fSopenharmony_ci 236d9f0492fSopenharmony_ci#ifdef __cplusplus 237d9f0492fSopenharmony_ci#if __cplusplus 238d9f0492fSopenharmony_ci} 239d9f0492fSopenharmony_ci#endif 240d9f0492fSopenharmony_ci#endif 241d9f0492fSopenharmony_ci#endif