Commit b7aa1b9e authored by Nikolay Igotti's avatar Nikolay Igotti

Add temporary locking.

parent 449ad5bc
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#import <OpenGL/gl3.h> #import <OpenGL/gl3.h>
#import <Metal/Metal.h> #import <Metal/Metal.h>
#import <QuartzCore/CAMetalLayer.h> #import <QuartzCore/CAMetalLayer.h>
#import <pthread.h>
JavaVM *jvm = NULL; JavaVM *jvm = NULL;
...@@ -133,6 +134,16 @@ JavaVM *jvm = NULL; ...@@ -133,6 +134,16 @@ JavaVM *jvm = NULL;
@end @end
NSMutableSet *layerStorage = nil; NSMutableSet *layerStorage = nil;
pthread_mutex_t layerStorageMutex = { 0 };
void lockLayers() {
pthread_mutex_lock(&layerStorageMutex);
}
void unlockLayers() {
pthread_mutex_unlock(&layerStorageMutex);
}
LayerHandler * findByObject(JNIEnv *env, jobject object) LayerHandler * findByObject(JNIEnv *env, jobject object)
{ {
for (LayerHandler* layer in layerStorage) for (LayerHandler* layer in layerStorage)
...@@ -142,7 +153,6 @@ LayerHandler * findByObject(JNIEnv *env, jobject object) ...@@ -142,7 +153,6 @@ LayerHandler * findByObject(JNIEnv *env, jobject object)
return layer; return layer;
} }
} }
return NULL; return NULL;
} }
...@@ -150,6 +160,8 @@ extern jboolean Skiko_GetAWT(JNIEnv* env, JAWT* awt); ...@@ -150,6 +160,8 @@ extern jboolean Skiko_GetAWT(JNIEnv* env, JAWT* awt);
JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv *env, jobject canvas) JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv *env, jobject canvas)
{ {
lockLayers();
if (layerStorage != nil || [layerStorage count] > 0) if (layerStorage != nil || [layerStorage count] > 0)
{ {
LayerHandler *layer = findByObject(env, canvas); LayerHandler *layer = findByObject(env, canvas);
...@@ -158,9 +170,11 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv ...@@ -158,9 +170,11 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv
if (layer.container == NULL && layer.glLayer == NULL) if (layer.container == NULL && layer.glLayer == NULL)
{ {
[layerStorage removeObject: layer]; [layerStorage removeObject: layer];
unlockLayers();
return; return;
} }
[layer syncLayersSize]; [layer syncLayersSize];
unlockLayers();
return; return;
} }
} }
...@@ -168,6 +182,7 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv ...@@ -168,6 +182,7 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv
{ {
layerStorage = [[NSMutableSet alloc] init]; layerStorage = [[NSMutableSet alloc] init];
} }
unlockLayers();
JAWT awt; JAWT awt;
JAWT_DrawingSurface *ds = NULL; JAWT_DrawingSurface *ds = NULL;
...@@ -198,7 +213,9 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv ...@@ -198,7 +213,9 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv
dsi_mac = ( __bridge NSObject<JAWT_SurfaceLayers> *) dsi->platformInfo; dsi_mac = ( __bridge NSObject<JAWT_SurfaceLayers> *) dsi->platformInfo;
LayerHandler *layersSet = [[LayerHandler alloc] init]; LayerHandler *layersSet = [[LayerHandler alloc] init];
lockLayers();
[layerStorage addObject: layersSet]; [layerStorage addObject: layersSet];
unlockLayers();
layersSet.container = [dsi_mac windowLayer]; layersSet.container = [dsi_mac windowLayer];
[layersSet.container removeAllAnimations]; [layersSet.container removeAllAnimations];
...@@ -224,7 +241,9 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv ...@@ -224,7 +241,9 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv
JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_redrawLayer(JNIEnv *env, jobject canvas) JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_redrawLayer(JNIEnv *env, jobject canvas)
{ {
lockLayers();
LayerHandler *layer = findByObject(env, canvas); LayerHandler *layer = findByObject(env, canvas);
unlockLayers();
if (layer != NULL) if (layer != NULL)
{ {
[layer updateLayerContent]; [layer updateLayerContent];
...@@ -233,7 +252,9 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_redrawLayer(JNIEnv ...@@ -233,7 +252,9 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_redrawLayer(JNIEnv
JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_disposeLayer(JNIEnv *env, jobject canvas) JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_disposeLayer(JNIEnv *env, jobject canvas)
{ {
lockLayers();
LayerHandler *layer = findByObject(env, canvas); LayerHandler *layer = findByObject(env, canvas);
unlockLayers();
if (layer != NULL) if (layer != NULL)
{ {
[layer disposeLayer: env]; [layer disposeLayer: env];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment