1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "le_task.h"
16 #include "le_loop.h"
17
HandleWatcherTaskClose_(const LoopHandle loopHandle,const TaskHandle taskHandle)18 static void HandleWatcherTaskClose_(const LoopHandle loopHandle, const TaskHandle taskHandle)
19 {
20 LE_LOGV("HandleWatcherTaskClose_ fd: %d ", GetSocketFd(taskHandle));
21 DelTask((EventLoop *)loopHandle, (BaseTask *)taskHandle);
22 CloseTask(loopHandle, (BaseTask *)taskHandle);
23 }
24
HandleWatcherEvent_(const LoopHandle loopHandle,const TaskHandle taskHandle,uint32_t oper)25 static LE_STATUS HandleWatcherEvent_(const LoopHandle loopHandle, const TaskHandle taskHandle, uint32_t oper)
26 {
27 LE_CHECK(taskHandle != NULL, return 0, "TaskHandle is NULL");
28 LE_LOGV("HandleWatcherEvent_ fd: %d oper 0x%x", GetSocketFd(taskHandle), oper);
29 EventLoop *loop = (EventLoop *)loopHandle;
30 WatcherTask *watcher = (WatcherTask *)taskHandle;
31 int fd = GetSocketFd(taskHandle);
32 uint32_t events = oper;
33 uint64_t userData = *(uint64_t *)LE_GetUserData(taskHandle);
34 if (watcher->processEvent != NULL) {
35 watcher->processEvent(taskHandle, fd, &events, (void *)userData);
36 }
37 watcher = (WatcherTask *)GetTaskByFd((EventLoop *)loopHandle, fd);
38 LE_ONLY_CHECK(watcher != NULL, return 0);
39 if (watcher->base.flags & WATCHER_ONCE) {
40 HandleWatcherTaskClose_((LoopHandle)loop, (TaskHandle)watcher);
41 return 0;
42 }
43 if (events == 0) {
44 HandleWatcherTaskClose_((LoopHandle)loop, (TaskHandle)watcher);
45 return 0;
46 }
47 if (events != watcher->events) {
48 watcher->events = events;
49 loop->modEvent(loop, (const BaseTask *)taskHandle, watcher->events);
50 }
51 return LE_SUCCESS;
52 }
53
DumpWatcherTaskInfo_(const TaskHandle task)54 static void DumpWatcherTaskInfo_(const TaskHandle task)
55 {
56 INIT_CHECK(task != NULL, return);
57 BaseTask *baseTask = (BaseTask *)task;
58
59 WatcherTask *watcherTask = (WatcherTask *)baseTask;
60 printf("\tfd: %d \n", watcherTask->base.taskId.fd);
61 printf("\t TaskType: %s \n", "WatcherTask");
62 }
63
LE_StartWatcher(const LoopHandle loopHandle,WatcherHandle * watcherHandle,const LE_WatchInfo * info,const void * context)64 LE_STATUS LE_StartWatcher(const LoopHandle loopHandle,
65 WatcherHandle *watcherHandle, const LE_WatchInfo *info, const void *context)
66 {
67 LE_CHECK(loopHandle != NULL && watcherHandle != NULL, return LE_INVALID_PARAM, "Invalid parameters");
68 LE_CHECK(info != NULL && info->processEvent != NULL, return LE_INVALID_PARAM, "Invuint64_talid processEvent");
69
70 LE_BaseInfo baseInfo = {TASK_WATCHER | (info->flags & WATCHER_ONCE), info->close, sizeof(uint64_t)};
71 WatcherTask *task = (WatcherTask *)CreateTask(loopHandle, info->fd, &baseInfo, sizeof(WatcherTask));
72 LE_CHECK(task != NULL, return LE_NO_MEMORY, "Failed to create task");
73 task->base.handleEvent = HandleWatcherEvent_;
74 task->base.innerClose = HandleWatcherTaskClose_;
75 task->base.dumpTaskInfo = DumpWatcherTaskInfo_;
76 task->processEvent = info->processEvent;
77 task->events = info->events;
78 *(uint64_t *)(task + 1) = (uint64_t)context;
79
80 EventLoop *loop = (EventLoop *)loopHandle;
81 loop->addEvent(loop, (const BaseTask *)task, info->events);
82 *watcherHandle = (WatcherHandle)task;
83 return LE_SUCCESS;
84 }
85
LE_RemoveWatcher(const LoopHandle loopHandle,const WatcherHandle watcherHandle)86 void LE_RemoveWatcher(const LoopHandle loopHandle, const WatcherHandle watcherHandle)
87 {
88 LE_CHECK(loopHandle != NULL && watcherHandle != NULL, return, "Invalid parameters");
89 LE_CloseTask(loopHandle, watcherHandle);
90 }