diff --git a/src/ae.cpp b/src/ae.cpp index 99093daa8..69c61e59a 100644 --- a/src/ae.cpp +++ b/src/ae.cpp @@ -113,6 +113,8 @@ enum class AE_ASYNC_OP PostCppFunction, DeleteFileEvent, CreateFileEvent, + PostAsynDBFunction, + }; struct aeCommand @@ -125,6 +127,8 @@ struct aeCommand aePostFunctionProc *proc; aeFileProc *fproc; std::function *pfn; + aePostFunctionTokenProc* tproc; + }; void *clientData; }; @@ -175,6 +179,15 @@ void aeProcessCmd(aeEventLoop *eventLoop, int fd, void *, int ) (*cmd.pfn)(); delete cmd.pfn; + break; + } + case AE_ASYNC_OP::PostAsynDBFunction: + { //added to support async api IStorage + std::unique_lock ulock(g_lock, std::defer_lock); + if (cmd.fLock) + ulock.lock(); + ((aePostFunctionTokenProc*)cmd.tproc)(eventLoop,(StorageToken*)cmd.clientData); + break; } break; } @@ -256,6 +269,21 @@ int aePostFunction(aeEventLoop *eventLoop, aePostFunctionProc *proc, void *arg) return AE_OK; } +int aePostFunction(aeEventLoop *eventLoop, aePostFunctionTokenProc *proc, StorageToken *token) +{ + //added to support async api IStorage + proc(eventLoop,token); + aeCommand cmd = {}; + cmd.op = AE_ASYNC_OP::PostAsynDBFunction; + cmd.tproc = proc; + cmd.clientData = (void*)token; + cmd.fLock = true; + auto size = write(eventLoop->fdCmdWrite, &cmd, sizeof(cmd)); + if (size != sizeof(cmd)) + return AE_ERR; + return AE_OK; +} + int aePostFunction(aeEventLoop *eventLoop, std::function fn, bool fLock, bool fForceQueue) { if (eventLoop == g_eventLoopThisThread && !fForceQueue) diff --git a/src/ae.h b/src/ae.h index 3868db4a0..6babc3a58 100644 --- a/src/ae.h +++ b/src/ae.h @@ -79,6 +79,9 @@ typedef int aeTimeProc(struct aeEventLoop *eventLoop, long long id, void *client typedef void aeEventFinalizerProc(struct aeEventLoop *eventLoop, void *clientData); typedef void aeBeforeSleepProc(struct aeEventLoop *eventLoop); typedef void aePostFunctionProc(void *pvArgs); +//added to support async api IStorage +struct StorageToken; +typedef void aePostFunctionTokenProc(aeEventLoop *el, StorageToken *token); /* File event structure */ typedef struct aeFileEvent { @@ -134,6 +137,8 @@ int aePostFunction(aeEventLoop *eventLoop, aePostFunctionProc *proc, void *arg); #ifdef __cplusplus } // EXTERN C int aePostFunction(aeEventLoop *eventLoop, std::function fn, bool fLock = true, bool fForceQueue = false); +//added to support async api IStorage +int aePostFunction(aeEventLoop *eventLoop, aePostFunctionTokenProc *proc, StorageToken *token); extern "C" { #endif void aeDeleteEventLoop(aeEventLoop *eventLoop);