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