/*
 * Copyright (c) 2022 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.
 */

#ifndef FILLP_FUNCTIONS_H
#define FILLP_FUNCTIONS_H

#include "fillp_os.h"

#ifdef __cplusplus
extern "C" {
#endif

#define FILLP_FD_CLR   (g_fillpOsSocketLibFun.fillpFuncFdClr)
#define FILLP_FD_SET   (g_fillpOsSocketLibFun.fillpFuncFdSet)
#define FILLP_FD_ISSET (g_fillpOsSocketLibFun.fillpFuncFdIsSet)


#define FILLP_FD_CREATE_FD_SET   (g_fillpOsSocketLibFun.fillpFuncCreateFdSet)
#define FILLP_FD_DESTROY_FD_SET  (g_fillpOsSocketLibFun.fillpFuncDestroyFdSet)
#define FILLP_FD_COPY_FD_SET     (g_fillpOsSocketLibFun.fillpFuncCopyFdSet)


#define FILLP_GETSOCKOPT               (g_fillpOsSocketLibFun.getSockOpt)
#define FILLP_SETSOCKOPT               (g_fillpOsSocketLibFun.setSockOpt)
#define FILLP_IOCTLSOCKET              (g_fillpOsSocketLibFun.ioctl)
#define FILLP_FCNTL                    (g_fillpOsSocketLibFun.fcntl)
#define FILLP_SOCKET                   (g_fillpOsSocketLibFun.socketCallbackFunc)
#define FILLP_BIND                     (g_fillpOsSocketLibFun.bindCallbackFunc)
#define FILLP_GETSOCKNAME              (g_fillpOsSocketLibFun.getSockNameCallbackFunc)
#define FILLP_CONNECT                  (g_fillpOsSocketLibFun.connectCallbackFunc)
#define FILLP_SENDTO                   (g_fillpOsSocketLibFun.sendtoCallbackFunc)
#define FILLP_SEND                     (g_fillpOsSocketLibFun.sendCallbackFunc)
#define FILLP_RECVFROM                 (g_fillpOsSocketLibFun.recvFromCallbackFunc)
#define FILLP_STRLEN                   (g_fillpOsBasicLibFun.fillpStrLen)
#define FILLP_CALLOC                   (g_fillpOsBasicLibFun.memCalloc)
#define FILLP_MALLOC                   (g_fillpOsBasicLibFun.memAlloc)
#define FILLP_FREE                     (g_fillpOsBasicLibFun.memFree)
#define FILLP_SELECT                   (g_fillpOsSocketLibFun.select)
#define FILLP_RAND                     (g_fillpOsBasicLibFun.fillpRand)
#define FILLP_CRYPTO_RAND              (g_fillpOsBasicLibFun.cryptoRand)
#define FILLP_CLOSE                    (g_fillpOsSocketLibFun.closeSocketCallbackFunc)
#define FILLP_MEMCHR                   (g_fillpOsBasicLibFun.memChr)
#define FILLP_SYS_START_NEWTHREAD      (g_fillpOsBasicLibFun.fillpCreateThread)
#define SYS_ARCH_INIT                  (g_fillpOsBasicLibFun.sysArcInit)
#define SYS_ARCH_GET_CUR_TIME_LONGLONG (g_fillpOsBasicLibFun.sysArcGetCurTimeLongLong)
#define CAS                            (g_fillpOsBasicLibFun.sysArchCompAndSwap)
#define FILLP_SLEEP_MS                 (g_fillpOsBasicLibFun.sysSleepMs)
#define FILLP_RTE_PAUSE                (g_fillpOsBasicLibFun.rtePause)
#define SYS_ARCH_ATOMIC_INC            (g_fillpOsBasicLibFun.sysArchAtomicInc)
#define SYS_ARCH_ATOMIC_INC_AND_TEST   (g_fillpOsBasicLibFun.sysArchAtomicIncAndTest)
#define SYS_ARCH_ATOMIC_DEC            (g_fillpOsBasicLibFun.sysArchAtomicDec)
#define SYS_ARCH_ATOMIC_DEC_AND_TEST   (g_fillpOsBasicLibFun.sysArchAtomicDecAndTest)
#define SYS_ARCH_ATOMIC_READ           (g_fillpOsBasicLibFun.sysArchAtomicRead)
#define SYS_ARCH_ATOMIC_SET            (g_fillpOsBasicLibFun.sysArchAtomicSet)
#define FILLP_USLEEP                   (g_fillpOsBasicLibFun.sysUsleep)

/* Once inited with semaphore_create() in callback sysArchSemInit, it will be destroyed
    semaphore_destroy() in sysArchSemDestroy. There is no semaphore_close() in MAC
*/
#ifndef FILLP_MAC
#define SYS_ARCH_SEM_CLOSE           (g_fillpOsSemLibFun.sysArchSemClose)
#endif

#define SYS_ARCH_SEM_INIT         (g_fillpOsSemLibFun.sysArchSemInit)
#define SYS_ARCH_SEM_TRYWAIT      (g_fillpOsSemLibFun.sysArchSemTryWait)
#define SYS_ARCH_SEM_WAIT         (g_fillpOsSemLibFun.sysArchSemWait)
#define SYS_ARCH_SEM_POST         (g_fillpOsSemLibFun.sysArchSemPost)
#define SYS_ARCH_SEM_DESTROY      (g_fillpOsSemLibFun.sysArchSemDestroy)
#define SYS_ARCH_SEM_WAIT_TIMEOUT (g_fillpOsSemLibFun.sysArchSemWaitTimeout)
#define SYS_ARCH_SCHED_YIELD      (g_fillpOsSemLibFun.sysArchSchedYield)

static inline void sys_arch_compiler_barrier(void)
{
#ifdef FILLP_LINUX
#if !defined(__clang__) && (((__GNUC__ <= 4) && (__GNUC_MINOR__ < 4)) || (__GNUC__ <= 3))
    #error "GCC 4.4.0 FIXED GCC Bug[36793] x86-64 does not get __sync_synchronize right"
#endif
    __sync_synchronize();
#else
    MemoryBarrier();
#endif
}

#define SYS_ARCH_RWSEM_INIT         (g_fillpOsSemLibFun.sysArchRWSemInit)
#define SYS_ARCH_RWSEM_TRYRDWAIT    (g_fillpOsSemLibFun.sysArchRWSemTryRDWait)
#define SYS_ARCH_RWSEM_TRYWRWAIT    (g_fillpOsSemLibFun.sysArchRWSemTryWRWait)
#define SYS_ARCH_RWSEM_RDPOST       (g_fillpOsSemLibFun.sysArchRWSemRDPost)
#define SYS_ARCH_RWSEM_WRPOST       (g_fillpOsSemLibFun.sysArchRWSemWRPost)
#define SYS_ARCH_RWSEM_DESTROY      (g_fillpOsSemLibFun.sysArchRWSemDestroy)
#define SYS_ARCH_RWSEM_WAIT_TIMEOUT (g_fillpOsSemLibFun.pfSysArchRWSemWaitTimeout)

#define FILLP_SOCKETCLOSE_CBK (g_fillpAppCbkFun.fillpSockCloseCbkFunc)

#ifdef __cplusplus
}
#endif

#endif /* FILLP_FUNCTIONS_H */