Wrap worker jobs to autoreleasepool
#KT-42822 Fixed.
This commit is contained in:
committed by
Stanislav Erokhin
parent
96d458e35b
commit
47c606f1eb
@@ -31,6 +31,7 @@
|
||||
#include "Natives.h"
|
||||
#include "ObjCInterop.h"
|
||||
#include "ObjCExportPrivate.h"
|
||||
#include "ObjCMMAPI.h"
|
||||
#include "Types.h"
|
||||
#include "Utils.h"
|
||||
|
||||
@@ -309,6 +310,13 @@ id objc_allocWithZone(Class clazz);
|
||||
id objc_retain(id ptr);
|
||||
void objc_release(id ptr);
|
||||
|
||||
konan::AutoreleasePool::AutoreleasePool()
|
||||
: handle(objc_autoreleasePoolPush()) {}
|
||||
|
||||
konan::AutoreleasePool::~AutoreleasePool() {
|
||||
objc_autoreleasePoolPop(handle);
|
||||
}
|
||||
|
||||
void* Kotlin_objc_autoreleasePoolPush() {
|
||||
return objc_autoreleasePoolPush();
|
||||
}
|
||||
|
||||
@@ -12,6 +12,22 @@
|
||||
|
||||
extern "C" ALWAYS_INLINE void Kotlin_ObjCExport_releaseAssociatedObject(void* associatedObject);
|
||||
|
||||
namespace konan {
|
||||
class AutoreleasePool {
|
||||
public:
|
||||
AutoreleasePool();
|
||||
~AutoreleasePool();
|
||||
|
||||
AutoreleasePool(const AutoreleasePool&) = delete;
|
||||
AutoreleasePool(AutoreleasePool&&) = delete;
|
||||
AutoreleasePool& operator=(const AutoreleasePool&) = delete;
|
||||
AutoreleasePool& operator=(AutoreleasePool&&) = delete;
|
||||
|
||||
private:
|
||||
void* handle;
|
||||
};
|
||||
} // namespace konan
|
||||
|
||||
#endif // KONAN_OBJC_INTEROP
|
||||
|
||||
#endif // RUNTIME_OBJCMMAPI_H
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include "Exceptions.h"
|
||||
#include "KAssert.h"
|
||||
#include "Memory.h"
|
||||
#include "ObjCMMAPI.h"
|
||||
#include "Runtime.h"
|
||||
#include "Types.h"
|
||||
#include "Worker.h"
|
||||
@@ -956,6 +957,9 @@ JobKind Worker::processQueueElement(bool blocking) {
|
||||
ObjHolder operationHolder, dummyHolder;
|
||||
KRef obj = DerefStablePointer(job.executeAfter.operation, operationHolder.slot());
|
||||
try {
|
||||
#if KONAN_OBJC_INTEROP
|
||||
konan::AutoreleasePool autoreleasePool;
|
||||
#endif
|
||||
WorkerLaunchpad(obj, dummyHolder.slot());
|
||||
} catch (ExceptionObjHolder& e) {
|
||||
if (errorReporting())
|
||||
@@ -969,6 +973,9 @@ JobKind Worker::processQueueElement(bool blocking) {
|
||||
KNativePtr result = nullptr;
|
||||
bool ok = true;
|
||||
try {
|
||||
#if KONAN_OBJC_INTEROP
|
||||
konan::AutoreleasePool autoreleasePool;
|
||||
#endif
|
||||
job.regularJob.function(argument, resultHolder.slot());
|
||||
argumentHolder.clear();
|
||||
// Transfer the result.
|
||||
|
||||
Reference in New Issue
Block a user