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