From 954c37acbb0a9a790d07b567ad99c952e150e6da Mon Sep 17 00:00:00 2001 From: Mingchuan Wu Date: Tue, 27 Feb 2024 16:05:13 +0800 Subject: [PATCH 5/5] [PluginClient] Bugfix for semaphore exception and port number release. --- lib/PluginClient/PluginClient.cpp | 16 +++++++++++++--- lib/Translate/GimpleToPluginOps.cpp | 7 ++++++- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/PluginClient/PluginClient.cpp b/lib/PluginClient/PluginClient.cpp index fba0de4..6bc6401 100644 --- a/lib/PluginClient/PluginClient.cpp +++ b/lib/PluginClient/PluginClient.cpp @@ -1749,7 +1749,12 @@ static bool WaitServer(const string& port) mode_t mask = umask(0); mode_t mode = 0666; // 权限是rwrwrw,跨进程时,其他用户也要可以访问 string semFile = "wait_server_startup" + port; - sem_t *sem = sem_open(semFile.c_str(), O_CREAT, mode, 0); + sem_t *sem = sem_open(semFile.c_str(), O_CREAT | O_EXCL, mode, 0); + // Semaphore exception handling. + if (sem == SEM_FAILED) { + sem_unlink(semFile.c_str()); + sem = sem_open(semFile.c_str(), O_CREAT, mode, 0); + } umask(mask); int i = 0; for (; i < cnt; i++) { @@ -1770,8 +1775,13 @@ static bool WaitServer(const string& port) int PluginClient::ServerStart(pid_t& pid) { if (!grpcPort.FindUnusedPort()) { - LOGE("cannot find port for grpc,port 40001-65535 all used!\n"); - return -1; + // Rectify the fault that the port number is not released + // because the client is abnormal. + LOGW("cannot find port for grpc, try again!\n"); + if (!grpcPort.FindUnusedPort()) { + LOGE("cannot find port for grpc,port 40001-65534 all used!\n"); + return -1; + } } int ret = 0; diff --git a/lib/Translate/GimpleToPluginOps.cpp b/lib/Translate/GimpleToPluginOps.cpp index 342ef3d..76c5e31 100644 --- a/lib/Translate/GimpleToPluginOps.cpp +++ b/lib/Translate/GimpleToPluginOps.cpp @@ -1523,7 +1523,12 @@ Value GimpleToPluginOps::TreeToValue(uint64_t treeId) unsigned HOST_WIDE_INT uinit = tree_to_uhwi(t); initAttr = builder.getI64IntegerAttr(uinit); } else { - abort(); + wide_int val = wi::to_wide(t); + if (wi::neg_p(val, TYPE_SIGN(TREE_TYPE(t)))) { + val = -val; + } + signed HOST_WIDE_INT init = val.to_shwi(); + initAttr = builder.getI64IntegerAttr(init); } GetTreeAttr(treeId, readOnly, rPluginType); opValue = builder.create( -- 2.33.0