diff --git a/src/async/AsyncFile.cpp b/src/async/AsyncFile.cpp index 1ffdddc..95b33da 100644 --- a/src/async/AsyncFile.cpp +++ b/src/async/AsyncFile.cpp @@ -6,6 +6,10 @@ #include #include +void DefaultAsyncObjectCleanupCallback(CAsyncObject* object) { + AsyncFileReadDestroyObject(object); +} + CAsyncObject* AsyncFileReadAllocObject() { AsyncFileRead::s_queueLock.Enter(); @@ -37,6 +41,33 @@ CAsyncObject* AsyncFileReadAllocObject() { return object; } +int32_t AsyncFileReadCancel(CAsyncObject* object, void (*cleanupCallback)(CAsyncObject* object)) { + AsyncFileRead::s_queueLock.Enter(); + + if (object->isCurrent) { + object->userArg = object; + + if (!cleanupCallback) { + cleanupCallback = &DefaultAsyncObjectCleanupCallback; + } + + object->userFailedCallback = reinterpret_cast(cleanupCallback); + object->userPostloadCallback = reinterpret_cast(cleanupCallback); + + AsyncFileRead::s_queueLock.Leave(); + + return false; + } + + SFile::Close(object->file); + + AsyncFileRead::s_asyncFileReadFreeList.LinkToHead(object); + + AsyncFileRead::s_queueLock.Leave(); + + return true; +} + void AsyncFileReadDestroyObject(CAsyncObject* object) { AsyncFileRead::s_queueLock.Enter(); diff --git a/src/async/AsyncFile.hpp b/src/async/AsyncFile.hpp index 5326056..5fd857f 100644 --- a/src/async/AsyncFile.hpp +++ b/src/async/AsyncFile.hpp @@ -5,6 +5,8 @@ CAsyncObject* AsyncFileReadAllocObject(); +int32_t AsyncFileReadCancel(CAsyncObject* object, void (*cleanupCallback)(CAsyncObject* object)); + void AsyncFileReadDestroyObject(CAsyncObject* object); void AsyncFileReadInitialize(uint32_t threadSleep, uint32_t handlerTimeout); diff --git a/src/async/CAsyncObject.hpp b/src/async/CAsyncObject.hpp index af91472..3ce7765 100644 --- a/src/async/CAsyncObject.hpp +++ b/src/async/CAsyncObject.hpp @@ -6,6 +6,8 @@ class SFile; class CAsyncQueue; +typedef void (*ASYNC_CALLBACK)(void*); + class CAsyncObject { public: // Member variables @@ -13,8 +15,8 @@ class CAsyncObject { void* buffer; uint32_t size; void* userArg; - void (*userPostloadCallback)(void*); - void (*userFailedCallback)(void*); + ASYNC_CALLBACK userPostloadCallback; + ASYNC_CALLBACK userFailedCallback; CAsyncQueue* queue; void* ptr1C; uint8_t priority;