/**
* Tencent is pleased to support the open source community by making Tars available.
*
* Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* https://opensource.org/licenses/BSD-3-Clause
*
* Unless required by applicable law or agreed to in writing, software distributed
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
#include "util/tc_multi_hashmap.h"
#include "util/tc_pack.h"
#include "util/tc_common.h"
namespace tars
{
int TC_Multi_HashMap::FailureRecover::_iRefCount = 0;
bool TC_Multi_HashMap::MainKey::next()
{
_iHead = getHeadPtr()->_iNext;
_pHead = _pMap->getAbsolute(_iHead);
return _iHead != 0;
}
bool TC_Multi_HashMap::MainKey::prev()
{
_iHead = getHeadPtr()->_iPrev;
_pHead = _pMap->getAbsolute(_iHead);
return _iHead != 0;
}
void TC_Multi_HashMap::MainKey::deallocate()
{
if(HASNEXTCHUNK())
{
// 释放所有chunk
deallocate(getHeadPtr()->_iNextChunk);
}
// 释放主key头
vector<uint32_t> v;
v.push_back(_iHead);
_pMap->_pDataAllocator->deallocateMemChunk(v);
}
void TC_Multi_HashMap::MainKey::deallocate(uint32_t iChunk)
{
vector<uint32_t> v;
v.push_back(iChunk);
tagChunkHead *pChunk = getChunkHead(iChunk);
//获取所有后续的chunk地址
while(true)
{
if(pChunk->_bNextChunk)
{
v.push_back(pChunk->_iNextChunk);
pChunk = getChunkHead(pChunk->_iNextChunk);
}
else
{
break;
}
}
// 空间全部释放掉
_pMap->_pDataAllocator->deallocateMemChunk(v);
}
void TC_Multi_HashMap::MainKey::makeNew(uint32_t iIndex, uint32_t iAllocSize)
{
getHeadPtr()->_iSize = iAllocSize;
getHeadPtr()->_iIndex = iIndex;
getHeadPtr()->_iAddr = 0;
getHeadPtr()->_iNext = 0;
getHeadPtr()->_iPrev = 0;
getHeadPtr()->_iGetNext = 0;
getHeadPtr()->_iGetPrev = 0;
getHeadPtr()->_iDataLen = 0;
SETNEXTCHUNK(false);
SETFULLDATA(false);
_pMap->incMainKeyListCount(iIndex);
// 挂到主key链上
if(_pMap->itemMainKey(iIndex)->_iMainKeyAddr == 0)
{
//当前hash桶没有元素
_pMap->saveValue(&_pMap->itemMainKey(iIndex)->_iMainKeyAddr, _iHead);
_pMap->saveValue(&getHeadPtr()->_iNext, (uint32_t)0);
_pMap->saveValue(&getHeadPtr()->_iPrev, (uint32_t)0);
}
else
{
//当前hash桶有元素, 挂在桶开头
_pMap->saveValue(&getHeadPtr(_pMap->itemMainKey(iIndex)->_iMainKeyAddr)->_iPrev, _iHead);
_pMap->saveValue(&getHeadPtr()->_iNext, _pMap->itemMainKey(iIndex)->_iMainKeyAddr);
_pMap->saveValue(&_pMap->itemMainKey(iIndex)->_iMainKeyAddr, _iHead);
_pMap->saveValue(&getHeadPtr()->_iPrev, (uint32_t)0);
}
//挂在Get链表头部
if(_pMap->_pHead->_iGetHead == 0)
{
assert(_pMap->_pHead->_iGetTail == 0);
_pMap->saveValue(&_pMap->_pHead->_iGetHead, _iHead);
_pMap->saveValue(&_pMap->_pHead->_iGetTail, _iHead);
}
else
{
assert(_pMap->_pHead->_iGetTail != 0);
_pMap->saveValue(&getHeadPtr()->_iGetNext, _pMap->_pHead->_iGetHead);
_pMap->saveValue(&getHeadPtr(_pMap->_pHead->_iGetHead)->_iGetPrev, _iHead);
_pMap->saveValue(&_pMap->_pHead->_iGetHead, _iHead);
}
}
int TC_Multi_HashMap::MainKey::erase(vector<Value> &vtData)
{
//////////////////修改备份数据链表/////////////
if(_pMap->_pHead->_iBackupTail == _iHead)
{
_pMap->saveValue(&_pMap->_pHead->_iBackupTail, getHeadPtr()->_iGetPrev);
}
////////////////////修改Get链表的数据//////////
//
{
bool bHead = (_pMap->_pHead->_iGetHead == _iHead);
bool bTail = (_pMap->_pHead->_iGetTail == _iHead);
if(!bHead)
{
if(bTail)
{
assert(getHeadPtr()->_iGetNext == 0);
//是尾部, 尾部指针指向上一个元素
_pMap->saveValue(&_pMap->_pHead->_iGetTail, getHeadPtr()->_iGetPrev);
_pMap->saveValue(&getHeadPtr(getHeadPtr()->_iGetPrev)->_iGetNext, (uint32_t)0);
}
else
{
//不是头部也不是尾部
assert(getHeadPtr()->_iGetNext != 0);
_pMap->saveValue(&getHeadPtr(getHeadPtr()->_iGetPrev)->_iGetNext, getHeadPtr()->_iGetNext);
_pMap->saveValue(&getHeadPtr(getHeadPtr()->_iGetNext)->_iGetPrev, getHeadPtr()->_iGetPrev);
}
}
else
{
if(bTail)
{
assert(getHeadPtr()->_iGetNext == 0);
assert(getHeadPtr()->_iGetPrev == 0);
//头部也是尾部, 指针都设置为0
_pMap->saveValue(&_pMap->_pHead->_iGetHead, (uint32_t)0);
_pMap->saveValue(&_pMap->_pHead->_iGetTail, (uint32_t)0);
}
else
{
//头部不是尾部, 头部指针指向下一个元素
assert(getHeadPtr()->_iGetNext != 0);
_pMap->saveValue(&_pMap->_pHead->_iGetHead, getHeadPtr()->_iGetNext);
//下一个元素上指针为0
_pMap->saveValue(&getHeadPtr(getHeadPtr()->_iGetNext)->_iGetPrev, (uint32_t)0);
}
}
}
///////////////////删除主key下的所有block/////////////////////////////
string mk;
int ret = get(mk);
if(ret != TC_Multi_HashMap::RT_OK)
{
// todo, 这里出错会有大问题,前面的修改都应该取消
return ret;
}
while(getHeadPtr()->_iAddr != 0)
{
Block block(_pMap, getHeadPtr()->_iAddr);
Value value;
value._mkey = mk;
int ret = block.getBlockData(value._data);
if(ret == TC_Multi_HashMap::RT_OK)
{
vtData.push_back(value);
}
block.erase();
}
///////////////////从主key链表中去掉///////////
//
//上一个主key指向下一个主key
if(getHeadPtr()->_iPrev != 0)
{
_pMap->saveValue(&getHeadPtr(getHeadPtr()->_iPrev)->_iNext, getHeadPtr()->_iNext);
}
//下一个主key指向上一个
if(getHeadPtr()->_iNext != 0)
{
_pMap->saveValue(&getHeadPtr(getHeadPtr()->_iNext)->_iPrev, getHeadPtr()->_iPrev);
}
//////////////////如果是hash头部, 需要修改hash索引数据指针//////
//
_pMap->delMainKeyListCount(getHeadPtr()->_iIndex);
if(getHeadPtr()->_iPrev == 0)
{
//如果是hash桶的头部, 则还需要处理
TC_Multi_HashMap::tagMainKeyHashItem *pItem = _pMap->itemMainKey(getHeadPtr()->_iIndex);
assert(pItem->_iMainKeyAddr == _iHead);
if(pItem->_iMainKeyAddr == _iHead)
{
_pMap->saveValue(&pItem->_iMainKeyAddr, getHeadPtr()->_iNext);
}
}
// 手工置空一些参数,使在数据恢复区建立记录,以便crash后恢复
_pMap->saveValue(&getHeadPtr()->_iSize, (uint32_t)0);
_pMap->saveValue(&getHeadPtr()->_iIndex, (uint32_t)0);
_pMap->saveValue(&getHeadPtr()->_iBitset, (uint8_t)0);
_pMap->saveValue(&getHeadPtr()->_iDataLen, (uint32_t)0);
// 归还内存前先确认上述修改,因为内存被释放后是不能恢复的
// 即使后面的内存释放失败也不会造成数据的破坏
_pMap->doUpdate();
//归还到内存中
deallocate();
return RT_OK;
}
void TC_Multi_HashMap::MainKey::refreshGetList()
{
assert(_pMap->_pHead->_iGetHead
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
基于C++开发的异种数据库跨平台连接中间件..zip (444个子文件)
libpq_linux.a 277KB
libpq_osx.a 212KB
tc_multi_hashmap.cpp 111KB
tc_rbtree.cpp 78KB
tc_hashmap_compact.cpp 75KB
tc_hashmap.cpp 67KB
tc_epoll_server.cpp 58KB
tc_malloc_chunk.cpp 57KB
EndpointManager.cpp 56KB
tc_http.cpp 47KB
Application.cpp 39KB
EDatabase_freetds.cpp 39KB
ServantHandle.cpp 27KB
EDatabase_oracle.cpp 26KB
ServantProxy.cpp 25KB
EDatabase_pgsql.cpp 24KB
main.cpp 24KB
StatReport.cpp 24KB
AdapterProxy.cpp 24KB
tc_cgi.cpp 22KB
EDatabase_mysql.cpp 21KB
TarsLogger.cpp 21KB
tc_config.cpp 18KB
tc_clientsocket.cpp 17KB
tc_mem_chunk.cpp 17KB
tc_socket.cpp 16KB
EDBHandler.cpp 16KB
tc_common.cpp 16KB
CommunicatorEpoll.cpp 15KB
Transceiver.cpp 13KB
oracle.cpp 13KB
sybase.cpp 12KB
mssql.cpp 12KB
postgres.cpp 12KB
mysql.cpp 12KB
tc_file.cpp 11KB
tc_http_async.cpp 11KB
Communicator.cpp 10KB
esql.cpp 10KB
tc_mem_queue.cpp 9KB
tc_pack.cpp 9KB
tc_md5.cpp 9KB
ObjectProxy.cpp 8KB
TarsCurrent.cpp 8KB
tc_bitmap.cpp 8KB
EConnectionPool.cpp 8KB
tc_logger.cpp 7KB
tc_encoder.cpp 7KB
tc_epoller.cpp 7KB
EConnection.cpp 6KB
tc_base64.cpp 6KB
tc_thread_pool.cpp 6KB
EResultSet.cpp 6KB
TarsConfig.cpp 6KB
EDatabase.cpp 6KB
tc_parsepara.cpp 6KB
EStatement.cpp 6KB
tc_sem_mutex.cpp 5KB
NetworkUtil.cpp 5KB
tc_buffer_pool.cpp 5KB
tc_thread_mutex.cpp 5KB
NotifyObserver.cpp 4KB
tc_buffer.cpp 4KB
Servant.cpp 4KB
AppCache.cpp 4KB
tc_gzip.cpp 4KB
EUpdateStatement.cpp 3KB
tc_timeprovider.cpp 3KB
tc_thread_rwlock.cpp 3KB
EndpointInfo.cpp 3KB
tc_mmap.cpp 3KB
TarsNotify.cpp 3KB
tc_thread.cpp 3KB
AsyncProcThread.cpp 3KB
TarsNodeF.cpp 3KB
tc_file_mutex.cpp 3KB
tc_thread_cond.cpp 3KB
PropertyReport.cpp 2KB
ECommonStatement.cpp 2KB
tc_dyn_object.cpp 2KB
Global.cpp 2KB
ServantProxyFactory.cpp 2KB
ObjectProxyFactory.cpp 2KB
tc_shm.cpp 2KB
ServantHelper.cpp 2KB
tc_fifo.cpp 2KB
tc_option.cpp 2KB
BaseNotify.cpp 2KB
EResultSetMetaData.cpp 2KB
tc_ex.cpp 1KB
AppProtocol.cpp 1KB
AdminServant.cpp 1KB
ESavepoint.cpp 1KB
testedb.cpp 913B
EDatabaseMetaData.cpp 372B
main.cpp 98B
CxxConet 15B
CxxJDK 12B
CxxLog4j 15B
MYSQL.dll 4.48MB
共 444 条
- 1
- 2
- 3
- 4
- 5
资源评论
JJJ69
- 粉丝: 6233
- 资源: 5778
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功