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_TASK_H
17d9f0492fSopenharmony_ci#define LOOP_TASK_H
18d9f0492fSopenharmony_ci#include <stdlib.h>
19d9f0492fSopenharmony_ci
20d9f0492fSopenharmony_ci#include "init_hashmap.h"
21d9f0492fSopenharmony_ci#include "le_utils.h"
22d9f0492fSopenharmony_ci#include "list.h"
23d9f0492fSopenharmony_ci#include "loop_event.h"
24d9f0492fSopenharmony_ci
25d9f0492fSopenharmony_ci#ifndef LOOP_EVENT_USE_MUTEX
26d9f0492fSopenharmony_ci#define LoopMutexInit(x) (void)(x)
27d9f0492fSopenharmony_ci#define LoopMutexLock(x) (void)(x)
28d9f0492fSopenharmony_ci#define LoopMutexUnlock(x) (void)(x)
29d9f0492fSopenharmony_ci#define LoopMutexDestroy(x) (void)(x)
30d9f0492fSopenharmony_ci#else
31d9f0492fSopenharmony_ci#include <pthread.h>
32d9f0492fSopenharmony_ci#define LoopMutex pthread_mutex_t
33d9f0492fSopenharmony_ci#define LoopMutexInit(x) pthread_mutex_init(x, NULL)
34d9f0492fSopenharmony_ci#define LoopMutexLock(x) pthread_mutex_lock(x)
35d9f0492fSopenharmony_ci#define LoopMutexUnlock(x) pthread_mutex_unlock(x)
36d9f0492fSopenharmony_ci#define LoopMutexDestroy(x) pthread_mutex_destroy(x)
37d9f0492fSopenharmony_ci#endif
38d9f0492fSopenharmony_ci
39d9f0492fSopenharmony_ci#ifdef __cplusplus
40d9f0492fSopenharmony_ci#if __cplusplus
41d9f0492fSopenharmony_ciextern "C" {
42d9f0492fSopenharmony_ci#endif
43d9f0492fSopenharmony_ci#endif
44d9f0492fSopenharmony_ci
45d9f0492fSopenharmony_citypedef struct {
46d9f0492fSopenharmony_ci    ListNode node;
47d9f0492fSopenharmony_ci    uint32_t buffSize;
48d9f0492fSopenharmony_ci    uint32_t dataSize;
49d9f0492fSopenharmony_ci    int32_t result;
50d9f0492fSopenharmony_ci    uint8_t data[0];
51d9f0492fSopenharmony_ci} LE_Buffer;
52d9f0492fSopenharmony_ci
53d9f0492fSopenharmony_ci#define TASK_FLAGS_INVALID 0x80000000
54d9f0492fSopenharmony_citypedef LE_STATUS (*HandleTaskEvent)(const LoopHandle loop, const TaskHandle task, uint32_t oper);
55d9f0492fSopenharmony_citypedef void (*HandleTaskClose)(const LoopHandle loop, const TaskHandle task);
56d9f0492fSopenharmony_citypedef void (*DumpTaskInfo)(const TaskHandle task);
57d9f0492fSopenharmony_ci#define TASKINFO \
58d9f0492fSopenharmony_ci    uint32_t flags; \
59d9f0492fSopenharmony_ci    union { \
60d9f0492fSopenharmony_ci        int fd; \
61d9f0492fSopenharmony_ci    } taskId
62d9f0492fSopenharmony_ci
63d9f0492fSopenharmony_citypedef struct {
64d9f0492fSopenharmony_ci    TASKINFO;
65d9f0492fSopenharmony_ci} TaskId;
66d9f0492fSopenharmony_ci
67d9f0492fSopenharmony_citypedef struct LiteTask_ {
68d9f0492fSopenharmony_ci    TASKINFO;
69d9f0492fSopenharmony_ci    HashNode hashNode;
70d9f0492fSopenharmony_ci    LE_Close close;
71d9f0492fSopenharmony_ci    DumpTaskInfo dumpTaskInfo;
72d9f0492fSopenharmony_ci    HandleTaskEvent handleEvent;
73d9f0492fSopenharmony_ci    HandleTaskClose innerClose;
74d9f0492fSopenharmony_ci    uint16_t userDataOffset;
75d9f0492fSopenharmony_ci    uint16_t userDataSize;
76d9f0492fSopenharmony_ci} BaseTask;
77d9f0492fSopenharmony_ci
78d9f0492fSopenharmony_citypedef struct {
79d9f0492fSopenharmony_ci    BaseTask base;
80d9f0492fSopenharmony_ci    LE_IncommingConnect incommingConnect;
81d9f0492fSopenharmony_ci    char server[0];
82d9f0492fSopenharmony_ci} StreamServerTask;
83d9f0492fSopenharmony_ci
84d9f0492fSopenharmony_citypedef struct {
85d9f0492fSopenharmony_ci    BaseTask base;
86d9f0492fSopenharmony_ci#ifdef LOOP_EVENT_USE_MUTEX
87d9f0492fSopenharmony_ci    LoopMutex mutex;
88d9f0492fSopenharmony_ci#else
89d9f0492fSopenharmony_ci    char mutex;
90d9f0492fSopenharmony_ci#endif
91d9f0492fSopenharmony_ci    ListHead buffHead;
92d9f0492fSopenharmony_ci} StreamTask;
93d9f0492fSopenharmony_ci
94d9f0492fSopenharmony_citypedef struct {
95d9f0492fSopenharmony_ci    StreamTask stream;
96d9f0492fSopenharmony_ci    StreamServerTask *serverTask;
97d9f0492fSopenharmony_ci    LE_SendMessageComplete sendMessageComplete;
98d9f0492fSopenharmony_ci    LE_RecvMessage recvMessage;
99d9f0492fSopenharmony_ci    LE_DisConnectComplete disConnectComplete;
100d9f0492fSopenharmony_ci    LE_HandleRecvMsg handleRecvMsg;
101d9f0492fSopenharmony_ci} StreamConnectTask;
102d9f0492fSopenharmony_ci
103d9f0492fSopenharmony_citypedef struct {
104d9f0492fSopenharmony_ci    StreamTask stream;
105d9f0492fSopenharmony_ci    LE_DisConnectComplete disConnectComplete;
106d9f0492fSopenharmony_ci    LE_ConnectComplete connectComplete;
107d9f0492fSopenharmony_ci    LE_SendMessageComplete sendMessageComplete;
108d9f0492fSopenharmony_ci    LE_RecvMessage recvMessage;
109d9f0492fSopenharmony_ci    LE_HandleRecvMsg handleRecvMsg;
110d9f0492fSopenharmony_ci    uint32_t connected : 1;
111d9f0492fSopenharmony_ci    char server[0];
112d9f0492fSopenharmony_ci} StreamClientTask;
113d9f0492fSopenharmony_ci
114d9f0492fSopenharmony_citypedef struct {
115d9f0492fSopenharmony_ci    StreamTask stream;
116d9f0492fSopenharmony_ci    LE_ProcessAsyncEvent processAsyncEvent;
117d9f0492fSopenharmony_ci} AsyncEventTask;
118d9f0492fSopenharmony_ci
119d9f0492fSopenharmony_citypedef struct {
120d9f0492fSopenharmony_ci    BaseTask base;
121d9f0492fSopenharmony_ci    uint32_t events;
122d9f0492fSopenharmony_ci    ProcessWatchEvent processEvent;
123d9f0492fSopenharmony_ci} WatcherTask;
124d9f0492fSopenharmony_ci
125d9f0492fSopenharmony_ciLE_Buffer *CreateBuffer(uint32_t bufferSize);
126d9f0492fSopenharmony_ciLE_Buffer *GetNextBuffer(StreamTask *task, const LE_Buffer *next);
127d9f0492fSopenharmony_ciLE_Buffer *GetFirstBuffer(StreamTask *task);
128d9f0492fSopenharmony_ciint IsBufferEmpty(StreamTask *task);
129d9f0492fSopenharmony_ci
130d9f0492fSopenharmony_civoid FreeBuffer(const LoopHandle loop, StreamTask *task, LE_Buffer *buffer);
131d9f0492fSopenharmony_civoid AddBuffer(StreamTask *task, LE_Buffer *buffer);
132d9f0492fSopenharmony_ci
133d9f0492fSopenharmony_ciBaseTask *CreateTask(const LoopHandle loopHandle, int fd, const LE_BaseInfo *info, uint32_t size);
134d9f0492fSopenharmony_civoid CloseTask(const LoopHandle loopHandle, BaseTask *task);
135d9f0492fSopenharmony_ciint GetSocketFd(const TaskHandle task);
136d9f0492fSopenharmony_ciint CheckTaskFlags(const BaseTask *task, uint32_t flags);
137d9f0492fSopenharmony_ci
138d9f0492fSopenharmony_ci#ifdef __cplusplus
139d9f0492fSopenharmony_ci#if __cplusplus
140d9f0492fSopenharmony_ci}
141d9f0492fSopenharmony_ci#endif
142d9f0492fSopenharmony_ci#endif
143d9f0492fSopenharmony_ci
144d9f0492fSopenharmony_ci#endif
145