瀏覽代碼

修改task相关线程间传输数据处理相关的内容,确保子类数据能够正确的构造、析构。

zzj 6 年之前
父節點
當前提交
e9adb47b32
共有 5 個文件被更改,包括 61 次插入23 次删除
  1. 13 2
      area.cpp
  2. 23 2
      message.cpp
  3. 3 2
      message.h
  4. 4 4
      worker.cpp
  5. 18 13
      worker.h

+ 13 - 2
area.cpp

@@ -109,6 +109,9 @@ void area::change_business(uint32_t new_bits)
 	uint32_t del=((m_area_type^new_bits)|m_area_type)^m_area_type;
 	uint32_t add=((m_area_type^new_bits)|new_bits)^new_bits;
 
+	if(del==0 && add==0)
+		return;
+
 	task*t =task::alloc<message_change_business>();
 
 	t->m_cmd_code=0x10001; //区域业务类型修改的编码
@@ -116,8 +119,16 @@ void area::change_business(uint32_t new_bits)
 
 	auto&mcb=t->body<message_change_business>();
 	mcb.area_id=m_id;
-	mcb.del_list=area_business::get_instance_list(del,m_id);
-	mcb.add_list=area_business::get_instance_list(add,m_id);
+	if(del!=0) 
+	{
+		mcb.del_list=area_business::get_instance_list(del,m_id);
+	}
+
+	if(add!=0) 
+	{
+		mcb.add_list=area_business::get_instance_list(add,m_id);
+	}
+
 	mcb.new_list=area_business::get_instance_list(new_bits,m_id);
 	mcb.ref_count.store(w->num_thread());
 

+ 23 - 2
message.cpp

@@ -5,7 +5,21 @@
 
 void message_locinfo::zero_this()
 {
-	memset(this,0,sizeof(*this));
+	m_time_stamp=
+	m_site_id=
+	m_site_time=
+
+	m_card_type=
+	m_card_id=
+	m_tof=
+	m_card_ct=
+	m_batty_status=
+	m_callinfo=
+	m_rav=
+	m_acc=
+	m_ant_id=
+	m_sync_ct=
+	m_rssi=0;
 }
 
 void message_locinfo::load(zistream&is,bool tdoa)
@@ -59,7 +73,14 @@ void message_locinfo::load(zistream&is,bool tdoa)
 
 void message_tdoasync::zero_this()
 {
-	memset(this,0,sizeof(*this));
+	m_local_site_id=
+	m_parent_site_id=
+	m_local_ant_id=
+	m_parent_ant_id=
+	m_sync_ct=
+	m_local_level=
+	m_recv_time=
+	m_send_time=0;
 }
 
 void message_tdoasync::load(zistream&is)

+ 3 - 2
message.h

@@ -2,6 +2,7 @@
 #define __MESSAGE_HPP__
 #include <stdint.h>
 #include <time.h>
+#include "worker.h"
 
 struct zistream;
 
@@ -15,7 +16,7 @@ struct zistream;
 #define CHAR_CTRL_READER_CMD 0x804c					// 向分站发送控制指令,控制分站向上位机发送数据
 
 //	分站传上来的卡定位数据,包括tof,tdoa
-struct message_locinfo
+struct message_locinfo:task
 {
 	uint64_t m_time_stamp;
 	uint32_t m_site_id;
@@ -43,7 +44,7 @@ struct message_locinfo
 };
 
 //tdoa分站同步数据
-struct message_tdoasync
+struct message_tdoasync:task
 {
 	uint32_t m_local_site_id;
 	uint32_t m_parent_site_id;

+ 4 - 4
worker.cpp

@@ -112,7 +112,7 @@ struct worker_thread: zloop<task*> ,visitor<std::shared_ptr<card_location_base>>
 			case 0x863b://tdoa
 				log_info("card loc message%04X",t.m_cmd_code);
 				card_list::instance()->on_message(this,t.body<message_locinfo>(),false);
-				free(&t);
+				t.destroy();
 
 				//card_message::on_loc_message(this,t.m_param1);
 			break;
@@ -121,12 +121,12 @@ struct worker_thread: zloop<task*> ,visitor<std::shared_ptr<card_location_base>>
 				log_info("site history message%04X",t.m_cmd_code);
 					card_list::instance()->on_message(this,t.body<message_locinfo>(),true);
 				//site_message::on_sync(this,t.m_param1);
-				free(&t);
+				t.destroy();
 			break;
 
 			case 0x804c://ctrl site message
 				log_info("ctrl site message%04X",t.m_cmd_code);
-				free(&t);
+				t.destroy();
 			break;
 
 			case 0x10001://区域业务类型修改
@@ -148,7 +148,7 @@ struct worker_thread: zloop<task*> ,visitor<std::shared_ptr<card_location_base>>
 
 				if(mcb.ref_count.fetch_sub(1)==1)
 				{
-					free(&t);
+					t.destroy();
 				}
 			}
 		}

+ 18 - 13
worker.h

@@ -1,43 +1,48 @@
 #ifndef _WORKER_HPP_
 #define _WORKER_HPP_
 #include <ev++.h>
+#include <atomic>
+#include <vector>
 
 struct task
 {
 	uint32_t m_cmd_code;
 	uint32_t m_hash_id;
-	char     m_d[1];
 
-	void destroy()
+	task(uint32_t hash_id,uint32_t cmd_code)
+		:m_cmd_code(cmd_code)
+		,m_hash_id(hash_id)
 	{
-		free(this);
 	}
 
-	template<typename T> const T&body()const
+	task()
+	{}
+
+	void destroy()
 	{
-		const void*x=&m_d[0];
-		return *(T*)x;
+		delete this;
 	}
 
-	template<typename T> T&body()
+	template<typename T> const T&body()const
 	{
-		void*x=&m_d[0];
-		return *(T*)x;
+		return *(T*)this;
 	}
 
-	static size_t align(size_t n)
+	template<typename T> T&body()
 	{
-		return (n+31)&~0x1F;
+		return *(T*)this;
 	}
 
 	template<typename T> static task*alloc()
 	{
-		return (task*)malloc(align(sizeof(T)+sizeof(task)));
+		return new T();
 	}
+
+	virtual ~task(){}
 };
 
 struct area_business;
-struct message_change_business
+struct message_change_business:task
 {
 	int area_id;
 	std::atomic<int> ref_count;