diff --git a/server/imserver/player.cc b/server/imserver/player.cc index 8c30514..a93367e 100644 --- a/server/imserver/player.cc +++ b/server/imserver/player.cc @@ -36,27 +36,27 @@ void Player::UnInit() SaveToDB(); timer_attacher.ClearTimerList(); for (auto& pair : friend_hash_) { - if (!list_empty(&pair.second.watch_node)) { + if (!list_empty(&pair.second->watch_node)) { PlayerMgr::Instance()->UnWatchPlayer(pair.second); + delete pair.second; } } + friend_hash_.clear(); } void Player::Deserialize(const ss::MFUserDB& user_db) { for (auto& friend_db : user_db.friends()) { - Friend friendobj; - TypeConvert::Convert(friend_db.base_data(), friendobj.base_data); - friendobj.crc32_code = a8::openssl::Crc32( - (unsigned char*)myself.base_data.account_id.data(), - myself.base_data.account_id.size() - );; - friend_hash_[friendobj.base_data.account_id] = friendobj; - } - for (auto& pair : friend_hash_) { - pair.second.hum = this; - INIT_LIST_HEAD(&pair.second.watch_node); - PlayerMgr::Instance()->WatchPlayer(pair.second); + Friend* friendobj = new Friend; + TypeConvert::Convert(friend_db.base_data(), friendobj->base_data); + friendobj->crc32_code = a8::openssl::Crc32 + ( + (unsigned char*)friendobj->base_data.account_id.data(), + friendobj->base_data.account_id.size() + ); + friendobj->hum = this; + friend_hash_[friendobj->base_data.account_id] = friendobj; + PlayerMgr::Instance()->WatchPlayer(friendobj); } } @@ -64,7 +64,7 @@ void Player::Serialize(ss::MFUserDB& user_db) { for (auto& pair : friend_hash_) { auto p = user_db.add_friends(); - TypeConvert::Convert(pair.second.base_data, *(p->mutable_base_data())); + TypeConvert::Convert(pair.second->base_data, *(p->mutable_base_data())); } } @@ -438,8 +438,8 @@ void Player::FillFriendList(::google::protobuf::RepeatedPtrField< ::cs::MFUserIn } for (auto& pair : friend_hash_) { auto p = friend_list->Add(); - TypeConvert::Convert(pair.second.base_data, *(p->mutable_base_data())); - TypeConvert::Convert(pair.second.temp_custom_data, *(p->mutable_temp_custom_data())); + TypeConvert::Convert(pair.second->base_data, *(p->mutable_base_data())); + TypeConvert::Convert(pair.second->temp_custom_data, *(p->mutable_temp_custom_data())); } } @@ -543,7 +543,7 @@ void Player::SaveToDB() Friend* Player::GetFriendById(const std::string& friend_id) { auto itr = friend_hash_.find(friend_id); - return itr != friend_hash_.end() ? &itr->second : nullptr; + return itr != friend_hash_.end() ? itr->second : nullptr; } void Player::FillApplyList(const cs::MFPaging& paging, cs::SMFriendApplyList& respmsg) diff --git a/server/imserver/player.h b/server/imserver/player.h index 03d2a95..b475fb7 100644 --- a/server/imserver/player.h +++ b/server/imserver/player.h @@ -121,7 +121,7 @@ private: timer_list* update_user_info_timer_ = nullptr; long long last_apply_idx_ = 0; - std::map friend_hash_; + std::map friend_hash_; std::map apply_hash_; std::list apply_list_; }; diff --git a/server/imserver/playermgr.cc b/server/imserver/playermgr.cc index cdef1b1..7bb582b 100644 --- a/server/imserver/playermgr.cc +++ b/server/imserver/playermgr.cc @@ -88,32 +88,32 @@ void PlayerMgr::_CMLogin(f8::MsgHdr& hdr, const cs::CMLogin& msg) AsyncLogin1(msg); } -void PlayerMgr::WatchPlayer(Friend& friend_data) +void PlayerMgr::WatchPlayer(Friend* friend_data) { #ifdef DEBUG - if (!list_empty(&friend_data.watch_node)) { + if (!list_empty(&friend_data->watch_node)) { abort(); } #endif - auto itr = watch_players_.find(friend_data.base_data.account_id); + auto itr = watch_players_.find(friend_data->base_data.account_id); if (itr == watch_players_.end()) { - watch_players_[friend_data.base_data.account_id] = list_head(); - itr = watch_players_.find(friend_data.base_data.account_id); + watch_players_[friend_data->base_data.account_id] = list_head(); + itr = watch_players_.find(friend_data->base_data.account_id); if (itr == watch_players_.end()) { abort(); } INIT_LIST_HEAD(&itr->second); } - list_add(&friend_data.watch_node, &itr->second); + list_add(&friend_data->watch_node, &itr->second); } -void PlayerMgr::UnWatchPlayer(Friend& friend_data) +void PlayerMgr::UnWatchPlayer(Friend* friend_data) { - if (!list_empty(&friend_data.watch_node)) { - list_del_init(&friend_data.watch_node); + if (!list_empty(&friend_data->watch_node)) { + list_del_init(&friend_data->watch_node); } { - auto itr = watch_players_.find(friend_data.base_data.account_id); + auto itr = watch_players_.find(friend_data->base_data.account_id); if (itr != watch_players_.end()) { if (list_empty(&itr->second)) { watch_players_.erase(itr); diff --git a/server/imserver/playermgr.h b/server/imserver/playermgr.h index 3373fe5..257c595 100644 --- a/server/imserver/playermgr.h +++ b/server/imserver/playermgr.h @@ -41,8 +41,8 @@ class PlayerMgr : public a8::Singleton Player* GetPlayerByAccountId(const std::string& account_id); void ReBindSocket(int socket_handle, Player* hum); void OnWSProxyDisconnect(a8::XParams& param); - void WatchPlayer(Friend& friend_data); - void UnWatchPlayer(Friend& friend_data); + void WatchPlayer(Friend* friend_data); + void UnWatchPlayer(Friend* friend_data); int OnlineNum(); private: