Async FLASH Design: AE event loop changes to understand StorageToken

This commit is contained in:
a00817524 2023-09-01 12:17:43 +00:00 committed by John Sully
parent 441b74a936
commit cf13e7b594
2 changed files with 33 additions and 0 deletions

View File

@ -113,6 +113,8 @@ enum class AE_ASYNC_OP
PostCppFunction, PostCppFunction,
DeleteFileEvent, DeleteFileEvent,
CreateFileEvent, CreateFileEvent,
PostAsynDBFunction,
}; };
struct aeCommand struct aeCommand
@ -125,6 +127,8 @@ struct aeCommand
aePostFunctionProc *proc; aePostFunctionProc *proc;
aeFileProc *fproc; aeFileProc *fproc;
std::function<void()> *pfn; std::function<void()> *pfn;
aePostFunctionTokenProc* tproc;
}; };
void *clientData; void *clientData;
}; };
@ -175,6 +179,15 @@ void aeProcessCmd(aeEventLoop *eventLoop, int fd, void *, int )
(*cmd.pfn)(); (*cmd.pfn)();
delete cmd.pfn; delete cmd.pfn;
break;
}
case AE_ASYNC_OP::PostAsynDBFunction:
{ //added to support async api IStorage
std::unique_lock<decltype(g_lock)> ulock(g_lock, std::defer_lock);
if (cmd.fLock)
ulock.lock();
((aePostFunctionTokenProc*)cmd.tproc)(eventLoop,(StorageToken*)cmd.clientData);
break;
} }
break; break;
} }
@ -256,6 +269,21 @@ int aePostFunction(aeEventLoop *eventLoop, aePostFunctionProc *proc, void *arg)
return AE_OK; 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<void()> fn, bool fLock, bool fForceQueue) int aePostFunction(aeEventLoop *eventLoop, std::function<void()> fn, bool fLock, bool fForceQueue)
{ {
if (eventLoop == g_eventLoopThisThread && !fForceQueue) if (eventLoop == g_eventLoopThisThread && !fForceQueue)

View File

@ -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 aeEventFinalizerProc(struct aeEventLoop *eventLoop, void *clientData);
typedef void aeBeforeSleepProc(struct aeEventLoop *eventLoop); typedef void aeBeforeSleepProc(struct aeEventLoop *eventLoop);
typedef void aePostFunctionProc(void *pvArgs); typedef void aePostFunctionProc(void *pvArgs);
//added to support async api IStorage
struct StorageToken;
typedef void aePostFunctionTokenProc(aeEventLoop *el, StorageToken *token);
/* File event structure */ /* File event structure */
typedef struct aeFileEvent { typedef struct aeFileEvent {
@ -134,6 +137,8 @@ int aePostFunction(aeEventLoop *eventLoop, aePostFunctionProc *proc, void *arg);
#ifdef __cplusplus #ifdef __cplusplus
} // EXTERN C } // EXTERN C
int aePostFunction(aeEventLoop *eventLoop, std::function<void()> fn, bool fLock = true, bool fForceQueue = false); int aePostFunction(aeEventLoop *eventLoop, std::function<void()> fn, bool fLock = true, bool fForceQueue = false);
//added to support async api IStorage
int aePostFunction(aeEventLoop *eventLoop, aePostFunctionTokenProc *proc, StorageToken *token);
extern "C" { extern "C" {
#endif #endif
void aeDeleteEventLoop(aeEventLoop *eventLoop); void aeDeleteEventLoop(aeEventLoop *eventLoop);