From: giwoong.kim Date: Fri, 26 Apr 2013 02:49:43 +0000 (+0900) Subject: shm: Change the segment size if shmget fails X-Git-Tag: TizenStudio_2.0_p2.3~854 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c71d6b39724b11114a73559bc10d58bdbdacc0a1;p=sdk%2Femulator%2Fqemu.git shm: Change the segment size if shmget fails Change the segment size if shmget fails. Change-Id: Ibdd8e95b29eac13a7180da06d367072e0fc775e2 Signed-off-by: GiWoong Kim --- diff --git a/tizen/src/skin/client/native_src/share.c b/tizen/src/skin/client/native_src/share.c index a8bef4e..4063908 100644 --- a/tizen/src/skin/client/native_src/share.c +++ b/tizen/src/skin/client/native_src/share.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "org_tizen_emulator_skin_EmulatorShmSkin.h" #define MAXLEN 512 @@ -52,7 +53,32 @@ JNIEXPORT jint JNICALL Java_org_tizen_emulator_skin_EmulatorShmSkin_shmget if (shmid == -1) { fprintf(stderr, "share.c: shmget failed\n"); fflush(stderr); - return 1; + + if (errno == EINVAL) { + /* get identifiedr of unavailable segment */ + shmid = shmget((key_t)shmkey, (size_t)1, 0666 | IPC_CREAT); + if (shmid == -1) { + perror("share.c: "); + return 1; + } + + /* a segment with given key existed, but size is greater than + the size of that segment */ + if (shmctl(shmid, IPC_RMID, 0) == -1) { + perror("share.c: "); + return 1; + } + + /* try to shmget one more time */ + shmid = shmget((key_t)shmkey, (size_t)size, 0666 | IPC_CREAT); + if (shmid == -1) { + perror("share.c: "); + return 1; + } else { + fprintf(stdout, "share.c: new segment was to be created!\n"); + fflush(stdout); + } + } } /* We now make the shared memory accessible to the program */ diff --git a/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java b/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java index 0490227..cf8822d 100644 --- a/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java +++ b/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java @@ -1705,7 +1705,12 @@ public class EmulatorSkin { communicator.terminate(); } - System.exit(-1); + shell.getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + System.exit(-1); + } + }); } } });