4b89cc5f创建于 2023年9月26日历史提交
/*
 * Copyright (C) 2021 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "gap_def.h"
#include "gap_task_internal.h"

#include "allocator.h"

#include "btm/btm_thread.h"
#include "log.h"

void GapBlockInTaskProcess(void *ctx)
{
    GapRunTaskBlockInfo *info = ctx;
    if (info->func != NULL) {
        info->func(info->ctx);
    }
    if (info->event != NULL) {
        EventSet(info->event);
    }
}

NO_SANITIZE("cfi") void GapUnBlockInTaskProcess(void *ctx)
{
    GapRunTaskUnBlockInfo *info = ctx;
    if (info != NULL) {
        if (info->func != NULL) {
            info->func(info->ctx);
        }
        if (info->free != NULL) {
            info->free(info->ctx);
        }
        if (info->ctx != NULL) {
            MEM_MALLOC.free(info->ctx);
        }
        MEM_MALLOC.free(info);
    }
}

int GapRunTaskBlockProcess(void (*func)(void *), void *ctx)
{
    GapRunTaskBlockInfo *info = MEM_MALLOC.alloc(sizeof(GapRunTaskBlockInfo));
    if (info == NULL) {
        return BT_NO_MEMORY;
    }

    info->event = EventCreate(true);
    info->ctx = ctx;
    info->func = func;

    int ret = BTM_RunTaskInProcessingQueue(PROCESSING_QUEUE_ID_GAP, GapBlockInTaskProcess, info);
    if (ret == BT_SUCCESS) {
        ret = EventWait(info->event, WAIT_TIME);
        if (ret == EVENT_WAIT_TIMEOUT_ERR) {
            HILOGE("EventWait result is timeout");
            ret = BT_TIMEOUT;
        } else if (ret == EVENT_WAIT_OTHER_ERR) {
            HILOGE("EventWait result is wait err");
            ret = BT_OS_ERROR;
        }
    }

    EventDelete(info->event);
    MEM_MALLOC.free(info);
    return ret;
}

int GapRunTaskUnBlockProcess(void (*const func)(void *), void *ctx, void (*const free)(void *))
{
    GapRunTaskUnBlockInfo *info = MEM_MALLOC.alloc(sizeof(GapRunTaskUnBlockInfo));
    if (info == NULL) {
        return BT_NO_MEMORY;
    }

    info->ctx = ctx;
    info->func = func;
    info->free = free;

    int ret = BTM_RunTaskInProcessingQueue(PROCESSING_QUEUE_ID_GAP, GapUnBlockInTaskProcess, info);

    return ret;
}