From d69e2a2ed12d639cca99a4718250aacd6579987c Mon Sep 17 00:00:00 2001
From: fujuntang <fujuntang@smartai.com>
Date: 星期日, 10 十月 2021 13:33:50 +0800
Subject: [PATCH] Add the deadlock detect feature.
---
include/usgcommon/sem_util.h | 10 +-
src/bus_proxy_start.cpp | 9 ++
src/shm/mm.cpp | 8 -
src/CMakeLists.txt | 2
src/svsem.cpp | 142 +++++++++++++++++++++++++++++------
src/bh_api.cpp | 13 ++
src/svsem.h | 5
CMakeLists.txt | 2
src/shm/hashtable.cpp | 12 +-
9 files changed, 158 insertions(+), 45 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ace3180..ae3249b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -21,6 +21,8 @@
list(APPEND EXTRA_INCLUDES "${PROJECT_SOURCE_DIR}/include/usgcommon")
+list(APPEND EXTRA_INCLUDES "${PROJECT_SOURCE_DIR}/proto/source")
+list(APPEND EXTRA_INCLUDES "${PROJECT_SOURCE_DIR}/src/msg_trigger")
list(APPEND EXTRA_LIBS ${PROJECT_SOURCE_DIR}/lib/libusgcommon.a pthread rt protobuf.a protobuf-lite.a)
# build api doc
diff --git a/include/usgcommon/sem_util.h b/include/usgcommon/sem_util.h
index 04934fe..6633541 100644
--- a/include/usgcommon/sem_util.h
+++ b/include/usgcommon/sem_util.h
@@ -9,18 +9,18 @@
int get(key_t key, unsigned int value);
int dec(int semId);
int dec_nowait(int semId);
- int dec_timeout(const int semId, const struct timespec * timeout);
+ int dec_timeout(int semId, struct timespec * timeout);
+ int dec_uni(int semId);
int zero(int semId);
int zero_nowait(int semId);
- int zero_timeout(const int semId, const struct timespec * timeout);
+ int zero_timeout(int semId, struct timespec * timeout);
int inc(int semId);
int set(int semId, int val);
void remove(int semid);
-
-
-
}
+#define SEM_USG_WT_TIMEOUT 60
+
#endif
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index f2ed570..d0c367c 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -31,6 +31,7 @@
../proto/source/bhome_msg.pb.cc
../proto/source/error_msg.pb.cc
./shm/shm_mm_wrapper.cpp
+./msg_trigger/msg_mgr.cpp
./shm/mm.cpp
./shm/hashtable.cpp
./shm/shm_mm.cpp
@@ -57,6 +58,7 @@
${CMAKE_CURRENT_SOURCE_DIR}/proto
${CMAKE_CURRENT_SOURCE_DIR}/queue
${CMAKE_CURRENT_SOURCE_DIR}/socket
+ ${CMAKE_CURRENT_SOURCE_DIR}/msg_trigger
${CMAKE_CURRENT_SOURCE_DIR}/net
)
diff --git a/src/bh_api.cpp b/src/bh_api.cpp
index b774d4e..8b03231 100644
--- a/src/bh_api.cpp
+++ b/src/bh_api.cpp
@@ -7,6 +7,7 @@
#include "bh_api.h"
#include <pthread.h>
#include <getopt.h>
+#include "msg_mgr.h"
#include "../proto/source/error_msg.pb.h"
#include "../proto/source/bhome_msg.pb.h"
#include "../proto/source/bhome_msg_api.pb.h"
@@ -102,6 +103,10 @@
memset(&pData, 0x00, sizeof(ProcInfo));
if (gRun_stat == 0) {
pthread_mutex_init(&mutex, NULL);
+
+#if defined(MSG_HANDLER)
+ msg_init();
+#endif
} else {
logger->error("the process has already registered!\n");
@@ -1814,9 +1819,13 @@
}
+#if defined(MSG_HANDLER)
int inter_key_get(void)
{
- return net_mod_socket_get_key(gNetmod_socket);
-}
+ if (gNetmod_socket != NULL)
+ return net_mod_socket_get_key(gNetmod_socket);
+ return 0;
+}
+#endif
diff --git a/src/bus_proxy_start.cpp b/src/bus_proxy_start.cpp
index e2e4955..c5eaaf5 100644
--- a/src/bus_proxy_start.cpp
+++ b/src/bus_proxy_start.cpp
@@ -10,6 +10,7 @@
#include <errno.h>
#include <getopt.h>
#include <stdlib.h>
+#include "msg_mgr.h"
using namespace std;
@@ -148,6 +149,10 @@
}
}
+#if defined(MSG_HANDLER)
+ msg_init();
+#endif
+
if (gShm_size == -1) {
gShm_size = SHM_RES_SIZE;
}
@@ -166,7 +171,9 @@
if (gBusServer_stat >= 0) {
pthread_create(&tids[1], NULL, svr_start, (void *)&gPort);
- pthread_create(&tids[0], NULL, check_start, NULL);
+ pthread_create(&tids[2], NULL, check_start, NULL);
+
+ //pthread_create(&tids[3], NULL, sem_msg_handler, NULL);
}
for (i = 0; i< TOTAL_THREADS; i++) {
diff --git a/src/shm/hashtable.cpp b/src/shm/hashtable.cpp
index 8593cca..62d052e 100755
--- a/src/shm/hashtable.cpp
+++ b/src/shm/hashtable.cpp
@@ -102,7 +102,7 @@
void *oldvalue;
int rv;
- if( (rv = svsem_wait(hashtable->mutex)) != 0) {
+ if( (rv = svsem_uni_wait(hashtable->mutex)) != 0) {
LoggerFactory::getLogger()->error(errno, "hashtable_remove\n");
}
tailq_header_t *my_tailq_head = hashtable->array[code] ;
@@ -140,7 +140,7 @@
void *hashtable_get(hashtable_t *hashtable, int key) {
int rv;
- if((rv = svsem_wait(hashtable->mutex)) != 0) {
+ if((rv = svsem_uni_wait(hashtable->mutex)) != 0) {
LoggerFactory::getLogger()->error(errno, "hashtable_get\n");
}
void * res = _hashtable_get(hashtable, key);
@@ -154,7 +154,7 @@
void hashtable_put(hashtable_t *hashtable, int key, void *value) {
int rv;
- if((rv = svsem_wait(hashtable->mutex)) != 0) {
+ if((rv = svsem_uni_wait(hashtable->mutex)) != 0) {
LoggerFactory::getLogger()->error(errno, "hashtable_put\n");
}
_hashtable_put(hashtable, key, value);
@@ -170,7 +170,7 @@
int rv;
void * val;
- if(( rv = svsem_wait(hashtable->mutex)) != 0) {
+ if(( rv = svsem_uni_wait(hashtable->mutex)) != 0) {
LoggerFactory::getLogger()->error(errno, "hashtable_put\n");
}
if(overwrite) {
@@ -208,7 +208,7 @@
key = START_KEY;
}
- rv = svsem_wait(hashtable->mutex);
+ rv = svsem_uni_wait(hashtable->mutex);
if(rv != 0) {
LoggerFactory::getLogger()->error(errno, "hashtable_alloc_key\n");
}
@@ -271,7 +271,7 @@
{
tailq_entry_t *item;
int rv;
- if( (rv = svsem_wait(hashtable->mutex)) != 0) {
+ if( (rv = svsem_uni_wait(hashtable->mutex)) != 0) {
LoggerFactory::getLogger()->error(errno, "hashtable_removeall\n");
}
for (int i = 0; i < MAPSIZE; i++)
diff --git a/src/shm/mm.cpp b/src/shm/mm.cpp
index e4ef672..13ec443 100644
--- a/src/shm/mm.cpp
+++ b/src/shm/mm.cpp
@@ -147,7 +147,7 @@
*}
*/
- SemUtil::dec(mutex);
+ SemUtil::dec_uni(mutex);
size_t size = GET_SIZE(HDRP(ptr));
PUT(HDRP(ptr), PACK(size, 0));
PUT(FTRP(ptr), PACK(size, 0));
@@ -237,7 +237,7 @@
{
//鍚屼竴杩涚▼鍐呭凡缁忓垵濮嬪寲杩囦簡
- SemUtil::dec(mutex);
+ SemUtil::dec_uni(mutex);
if (shmid != -1){
hashtable = (hashtable_t *)shmp;
SemUtil::inc(mutex);
@@ -311,7 +311,7 @@
bool mm_destroy(void) {
struct shmid_ds shmid_ds;
- SemUtil::dec(mutex);
+ SemUtil::dec_uni(mutex);
if(shmctl(shmid, IPC_STAT, &shmid_ds) == 0) {
//LoggerFactory::getLogger()->debug("shm_nattch=%d\n", shmid_ds.shm_nattch);
@@ -336,8 +336,6 @@
//remove shared memery
if (shmctl(shmid, IPC_RMID, 0) == -1)
err_exit(errno, "mm_destroy shmctl IPC_RMID");
- else
- LoggerFactory::getLogger()->debug("shared memory destroy\n");
SemUtil::inc(mutex);
SemUtil::remove(mutex);
diff --git a/src/svsem.cpp b/src/svsem.cpp
index 00e6dbc..bbcb7fa 100644
--- a/src/svsem.cpp
+++ b/src/svsem.cpp
@@ -1,9 +1,11 @@
+#include "bh_api.h"
#include "svsem.h"
+#include "msg_mgr.h"
int svsem_get(key_t key, unsigned int value) {
int semid, perms;
- perms = S_IRUSR | S_IWUSR;
+ perms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
semid = semget(key, 2, IPC_CREAT | IPC_EXCL | perms);
@@ -24,7 +26,7 @@
sop.sem_num = 0; /* Operate on semaphore 0 */
sop.sem_op = value;
- sop.sem_flg = 0;
+ sop.sem_flg = SEM_UNDO;
if (semop(semid, &sop, 1) == -1)
err_exit(errno, "semop");
@@ -71,7 +73,7 @@
sops.sem_num = 0;
sops.sem_op = -1;
- sops.sem_flg = 0;
+ sops.sem_flg = SEM_UNDO;
while (semop(semid, &sops, 1) == -1)
if (errno != EINTR) {
@@ -79,6 +81,15 @@
return -1;
}
+
+#if defined(MSG_HANDLER)
+ Msg_info msg_obj;
+
+ msg_obj.key = inter_key_get();
+ msg_obj.id = semid;
+ msg_obj.act = SEM_GET;
+ msg_distrib(SEM_TYPE_ID, &msg_obj);
+#endif
return 0;
}
@@ -88,18 +99,26 @@
sops.sem_num = 0;
sops.sem_op = -1;
- sops.sem_flg = IPC_NOWAIT | 0;
+ sops.sem_flg = IPC_NOWAIT | SEM_UNDO;
+#if defined(MSG_HANDLER)
+ Msg_info msg_obj;
+
+ msg_obj.key = inter_key_get();
+ msg_obj.id = semid;
+ msg_obj.act = SEM_GET;
+ msg_distrib(SEM_TYPE_ID, &msg_obj);
+#endif
return semop(semid, &sops, 1) ;
}
-int svsem_timedwait(const int semid, const struct timespec *timeout) {
+int svsem_timedwait(int semid, struct timespec *timeout) {
struct sembuf sops;
sops.sem_num = 0;
sops.sem_op = -1;
- sops.sem_flg = 0;
+ sops.sem_flg = SEM_UNDO;
while (semtimedop(semid, &sops, 1, timeout) == -1)
if (errno != EINTR) {
@@ -107,9 +126,40 @@
return -1;
}
+#if defined(MSG_HANDLER)
+ Msg_info msg_obj;
+
+ msg_obj.key = inter_key_get();
+ msg_obj.id = semid;
+ msg_obj.act = SEM_GET;
+ msg_distrib(SEM_TYPE_ID, &msg_obj);
+#endif
+
return 0;
}
+int svsem_uni_wait(int semid) {
+ struct timespec res;
+
+ res.tv_sec = SEM_WT_TIMEOUT;
+ res.tv_nsec = 0;
+
+ int count = 2;
+ while(count > 0) {
+ if(svsem_timedwait(semid, &res) != 0) {
+
+ if(svsem_post(semid) != 0) {
+ err_msg(errno, "_inc");
+ }
+
+ count--;
+ }
+
+ break;
+ }
+
+ return 0;
+}
/* Release semaphore - increment it by 1 */
int svsem_post(int semid) {
@@ -117,18 +167,25 @@
sops.sem_num = 0;
sops.sem_op = 1;
- sops.sem_flg = 0;
+ sops.sem_flg = SEM_UNDO;
int rv = semop(semid, &sops, 1);
if (rv == -1) {
// err_msg(errno, "svsem_inc");
return -1;
}
+
+#if defined(MSG_HANDLER)
+ Msg_info msg_obj;
+
+ msg_obj.key = inter_key_get();
+ msg_obj.id = semid;
+ msg_obj.act = SEM_POST;
+ msg_distrib(SEM_TYPE_ID, &msg_obj);
+#endif
+
return 0;
}
-
-
-
int svsem_cond_wait(int semid ){
@@ -144,12 +201,12 @@
//閲婃斁mutex
sops[0].sem_num = 0;
sops[0].sem_op = 1;
- sops[0].sem_flg = 0;
+ sops[0].sem_flg = SEM_UNDO;
// 绛夊緟cond
sops[1].sem_num = 1;
sops[1].sem_op = 0;
- sops[1].sem_flg = 0;
+ sops[1].sem_flg = SEM_UNDO;
while (semop(semid, sops, 2) == -1)
if (errno != EINTR) {
@@ -161,13 +218,22 @@
//閲嶆柊鑾峰彇mutex
sops[0].sem_num = 0;
sops[0].sem_op = -1;
- sops[0].sem_flg = 0;
+ sops[0].sem_flg = SEM_UNDO;
while (semop(semid, sops, 1) == -1)
if (errno != EINTR) {
// err_msg(errno, "Svsvsem_dec");
return -1;
}
+
+#if defined(MSG_HANDLER)
+ Msg_info msg_obj;
+
+ msg_obj.key = inter_key_get();
+ msg_obj.id = semid;
+ msg_obj.act = SEM_GET;
+ msg_distrib(SEM_TYPE_ID, &msg_obj);
+#endif
return 0;
}
@@ -196,13 +262,22 @@
sops.sem_num = 0;
sops.sem_op = 0;
- sops.sem_flg = 0;
+ sops.sem_flg = SEM_UNDO;
while (semop(semid, &sops, 1) == -1)
if (errno != EINTR) {
// err_msg(errno, "svsem_zero");
return -1;
}
+
+#if defined(MSG_HANDLER)
+ Msg_info msg_obj;
+
+ msg_obj.key = inter_key_get();
+ msg_obj.id = semid;
+ msg_obj.act = SEM_RESET;
+ msg_distrib(SEM_TYPE_ID, &msg_obj);
+#endif
return 0;
}
@@ -213,7 +288,7 @@
sops.sem_num = 0;
sops.sem_op = 0;
- sops.sem_flg = IPC_NOWAIT;
+ sops.sem_flg = IPC_NOWAIT | SEM_UNDO;
while (semop(semid, &sops, 1) == -1)
if (errno != EINTR) {
@@ -221,15 +296,23 @@
return -1;
}
+#if defined(MSG_HANDLER)
+ Msg_info msg_obj;
+ msg_obj.key = inter_key_get();
+ msg_obj.id = semid;
+ msg_obj.act = SEM_RESET;
+ msg_distrib(SEM_TYPE_ID, &msg_obj);
+#endif
+
return 0;
}
-int svsem_zero_timeout(const int semid, const struct timespec *timeout) {
+int svsem_zero_timeout(int semid, struct timespec *timeout) {
struct sembuf sops;
sops.sem_num = 0;
sops.sem_op = 0;
- sops.sem_flg = 0;
+ sops.sem_flg = SEM_UNDO;
while (semtimedop(semid, &sops, 1, timeout) == -1)
if (errno != EINTR) {
@@ -237,11 +320,16 @@
return -1;
}
+#if defined(MSG_HANDLER)
+ Msg_info msg_obj;
+ msg_obj.key = inter_key_get();
+ msg_obj.id = semid;
+ msg_obj.act = SEM_RESET;
+ msg_distrib(SEM_TYPE_ID, &msg_obj);
+#endif
+
return 0;
}
-
-
-
int svsem_set(int semid, int val) {
union semun arg;
@@ -250,14 +338,20 @@
return semctl(semid, 0, SETVAL, arg);
}
-
void svsem_remove(int semid) {
union semun dummy;
+
if (semctl(semid, 0, IPC_RMID, dummy) == -1)
err_msg(errno, "svsem_remove");
+
+#if defined(MSG_HANDLER)
+ Msg_info msg_obj;
+ msg_obj.key = inter_key_get();
+ msg_obj.id = semid;
+ msg_obj.act = SEM_RM;
+ msg_distrib(SEM_TYPE_ID, &msg_obj);
+#endif
+
}
-
-
-
diff --git a/src/svsem.h b/src/svsem.h
index 2b7a079..1a71e45 100644
--- a/src/svsem.h
+++ b/src/svsem.h
@@ -12,8 +12,9 @@
int svsem_trywait(int semid) ;
-int svsem_timedwait(const int semid, const struct timespec *timeout) ;
+int svsem_timedwait(int semid, struct timespec *timeout) ;
+int svsem_uni_wait(int semid) ;
/* Release semaphore - increment it by 1 */
int svsem_post(int semid) ;
@@ -32,7 +33,7 @@
int svsem_zero_nowait(int semid) ;
-int svsem_zero_timeout(const int semid, const struct timespec *timeout) ;
+int svsem_zero_timeout(int semid, struct timespec *timeout) ;
--
Gitblit v1.8.0