Wrap worker jobs to autoreleasepool

#KT-42822 Fixed.
This commit is contained in:
SvyatoslavScherbina
2020-10-28 19:44:33 +03:00
committed by Stanislav Erokhin
parent 96d458e35b
commit 47c606f1eb
6 changed files with 260 additions and 0 deletions
@@ -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.