summaryrefslogtreecommitdiff
path: root/src/sapp_dev
diff options
context:
space:
mode:
authorlijia <[email protected]>2021-09-23 09:54:44 +0800
committerlijia <[email protected]>2021-09-23 09:54:44 +0800
commitbcd30b7ea3e7a8d486ae66bd015152ec78bf3e74 (patch)
tree652491bd71c34196b5891d7dd4354a2ffca4c3e8 /src/sapp_dev
parent140cdc5521f57bf558e8dd7f77c5297d37f9d983 (diff)
parent0801d601e00d8e98ad3899453c3aaf7befe58cba (diff)
Merge remote-tracking branch 'remotes/origin/feature-v4.2-destroy-but-not-exit' into dev-4.2
# Conflicts: # include/private/sapp_mem.h # include/private/stream_internal.h # src/common/sapp_mem.c # src/plugin/src/plugin_manage.c
Diffstat (limited to 'src/sapp_dev')
-rw-r--r--src/sapp_dev/sapp_init.c2
-rw-r--r--src/sapp_dev/sapp_plug.c50
2 files changed, 44 insertions, 8 deletions
diff --git a/src/sapp_dev/sapp_init.c b/src/sapp_dev/sapp_init.c
index cca84b9..07618cd 100644
--- a/src/sapp_dev/sapp_init.c
+++ b/src/sapp_dev/sapp_init.c
@@ -79,7 +79,7 @@ static void sapp_dictator_init(void)
assert(tmp != NULL);
free(tmp);
}else{
- printf("\033[33m[Warning]dictator is not enable, maybe degrade performance, please check 'sapp.toml -> dictator_enable'.\033[0m\n");
+ printf("\033[33m[Warning]dictator is not enable, maybe slow down performance, please check 'sapp.toml -> dictator_enable'.\033[0m\n");
}
#else
printf("\033[33m[Warning]sapp is compiled without dictator.\033[0m\n");
diff --git a/src/sapp_dev/sapp_plug.c b/src/sapp_dev/sapp_plug.c
index 097d654..f879e1a 100644
--- a/src/sapp_dev/sapp_plug.c
+++ b/src/sapp_dev/sapp_plug.c
@@ -25,6 +25,14 @@ void MESA_platform_run(void);
extern int sapp_args_v;
int dpdk_init(int argc, char **argv);
+/*
+ ��Щ�������ܷ���sapp_global_val, �����ж�destroy����״̬��, destroy��������Ҫfree sapp_global_val������!
+ 0:do nothing; 1:doing; 0x7FFFFFFF:done
+*/
+
+static volatile unsigned long g_destory_env_done;
+static volatile unsigned long g_destory_env_per_thread_done[MAX_THREAD_NUM];
+
static void signal_user_handler(int signo)
{
@@ -71,7 +79,8 @@ static void show_mesa_log(void)
int libsapp_setup_env(int argc, char *argv[])
{
int ret;
-
+
+ MESA_ATOMIC_SET(g_destory_env_done, 0);
sapp_gval_init();
sapp_set_current_state(SAPP_STATE_JUST_START);
sapp_set_current_state(SAPP_STATE_CONFIG_PARSE);
@@ -118,6 +127,14 @@ int libsapp_setup_env(int argc, char *argv[])
MESA_platform_run();
+ //TODO: dumpfileģʽ���������Զ��˳�, ����һֱ����
+ //�������ź�, �����������߳�ǿ�е���sapp_destroy_env()
+#if 0
+ while((SAPP_STATE_PROCESSING == sapp_global_val->individual_volatile->current_state)
+ && (sapp_global_val->config.packet_io.depolyment_mode_bin)){
+ usleep(1);
+ }
+#endif
return 0;
}
@@ -137,13 +154,18 @@ static void wait_for_all_io_threads(void)
void libsapp_destroy_env_per_thread(int tseq)
{
- if(sapp_global_val->mthread_volatile[tseq]->destory_env_done){
+ if(MESA_ATOMIC_INC(g_destory_env_per_thread_done[tseq]) != 1){
+ /* INC����1, ˵��ԭ���϶�����0, ˵��������һ���߳�������destroy����, �����ȴ�, ֱ������Ϊֹ */
+ while(MESA_ATOMIC_READ(g_destory_env_per_thread_done[tseq]) != 0x7FFFFFFF){
+ sapp_usleep(100);
+ }
return;
+ }else{
+ MESA_ATOMIC_SET(g_destory_env_per_thread_done[tseq], 1);
}
- sapp_global_val->mthread_volatile[tseq]->destory_env_done = 1;
packet_io_clean_thread_context(tseq);
- sapp_global_val->mthread_volatile[tseq]->destory_env_done = 2;
+ MESA_ATOMIC_SET(g_destory_env_per_thread_done[tseq], 0x7FFFFFFF);
}
@@ -151,18 +173,32 @@ void libsapp_destroy_env_per_thread(int tseq)
void libsapp_destroy_env(void)
{
- if(sapp_global_val->individual_volatile->destory_env_done){
+ /*
+ һ���������: sapp -d������Ϻ�, ���Զ�����libsapp_destroy_env(),
+ ���Dz��Ҳ���ܻ����ⲿ��������libsapp_destroy_env(),
+ �����������, ��double free��!!
+ �˴�����������һ���Ⱥ��߼�˳��.
+ */
+
+ if(MESA_ATOMIC_INC(g_destory_env_done) != 1){
+ /* INC����1, ˵��ԭ���϶�����0, ˵��������һ���߳�������destroy����, �����ȴ�, ֱ������Ϊֹ */
+ while(MESA_ATOMIC_READ(g_destory_env_done) != 0x7FFFFFFF){
+ sapp_usleep(100);
+ }
return;
+ }else{
+ MESA_ATOMIC_SET(g_destory_env_done, 1);
}
- sapp_global_val->individual_volatile->destory_env_done = 1;
+ MESA_ATOMIC_SET(g_destory_env_done, 1);
+
sapp_set_current_state(SAPP_STATE_READY_TO_EXIT);
wait_for_all_io_threads();
packet_io_exit();
- sapp_global_val->individual_volatile->destory_env_done = 2;
+ MESA_ATOMIC_SET(g_destory_env_done, 0x7FFFFFFF);
}