//-------------------------------------------------------------------------- void VeJob::End(bool bSuccess) noexcept { VeVector<VeJobPtr> kRelatedJobs; { std::lock_guard<vtd::spin_lock> lock(m_kLock); VE_ASSERT(!m_u32Wait); m_u32Pointer = 0; kRelatedJobs = std::move(m_kRelatedJobs); } if (bSuccess) { for (auto& job : kRelatedJobs) { job->Resume(); } } else { for (auto& job : kRelatedJobs) { job->End(false); } } OnEnd(bSuccess); DecRefCount(); }
MojoId& MojoId::operator= ( const char* c_string ) { uint64_t old_hash_value = m_HashValue; m_HashValue = g_MojoIdManager.Insert( c_string ); DecRefCount( old_hash_value ); return *this; }
void MojoId::SetNull() { if( m_HashValue ) { DecRefCount( m_HashValue ); } m_HashValue = 0; }
MojoId& MojoId::operator= ( const MojoId& other ) { if( m_HashValue != other.m_HashValue ) { if( !other.IsNull() ) IncRefCount( other.m_HashValue ); if( !IsNull() ) DecRefCount( m_HashValue ); m_HashValue = other.m_HashValue; } return *this; }
//-------------------------------------------------------------------------- VeFilePath::WriteTask::WriteTask(const VeChar8* pcFullPath, const VeMemoryOStreamPtr& spContent, VeRefNode<WriteCallback>& kCallback, bool bAppend) noexcept : m_kFullPath(pcFullPath), m_spData(spContent) { IncRefCount(); m_kNode.m_Content = this; ve_sys.Collect(m_kNode); m_kCallback.attach_back(kCallback); m_kTask.m_Content = [this,bAppend](VeTaskQueue& kMgr) noexcept { FILE* pkFile(nullptr); const VeChar8* pcMode = bAppend ? "ab" : "wb"; # ifdef VE_PLATFORM_WIN fopen_s(&pkFile, m_kFullPath, pcMode); # else pkFile = fopen(m_kFullPath, pcMode); # endif if (pkFile) { VeSizeT stWrite = fwrite(m_spData->GetDataForRead(), 1, m_spData->RemainingLength(), pkFile); fclose(pkFile); if (stWrite == m_spData->RemainingLength()) { m_eResult = VE_S_OK; } else { m_eResult = VE_E_FILE_WRITE; } m_spData->AfterReadData(stWrite); } else { m_eResult = VE_E_FILE_CREATE; } m_kTask.m_Content = [this](VeTaskQueue& kMgr) noexcept { for (auto call : m_kCallback) { call(m_eResult); } DecRefCount(); }; kMgr.AddFGTask(m_kTask); }; ve_res_mgr.GetTaskQueue(VeResourceManager::TASK_FILE).AddBGTask(m_kTask); }
//-------------------------------------------------------------------------- VeFilePath::ReadTask::ReadTask(const VeChar8* pcFullPath, VeRefNode<ReadCallback>& kCallback) noexcept : m_kFullPath(pcFullPath) { IncRefCount(); m_kNode.m_Content = this; ve_sys.Collect(m_kNode); m_kCallback.attach_back(kCallback); m_kTask.m_Content = [this](VeTaskQueue& kMgr) noexcept { if (VE_SUCCEEDED(VeAccess(m_kFullPath, ACCESS_R_OK))) { FILE* pkFile(nullptr); # ifdef VE_PLATFORM_WIN fopen_s(&pkFile, m_kFullPath, "rb"); # else pkFile = fopen(m_kFullPath, "rb"); # endif if (pkFile) { fseek(pkFile, 0, SEEK_END); VeSizeT stLen = ftell(pkFile); fseek(pkFile, 0, SEEK_SET); VeBlobPtr spBlob = VE_NEW VeBlob(stLen); VeSizeT stRead = fread(spBlob->GetBuffer(), 1, stLen, pkFile); fclose(pkFile); if (stRead == stLen) { m_spData = VE_NEW VeMemoryIStream(spBlob); } } } m_kTask.m_Content = [this](VeTaskQueue& kMgr) noexcept { for (auto call : m_kCallback) { call(m_spData); } DecRefCount(); }; kMgr.AddFGTask(m_kTask); }; ve_res_mgr.GetTaskQueue(VeResourceManager::TASK_FILE).AddBGTask(m_kTask); }
//-------------------------------------------------------------------------- VeAssetPath::ReadTask::ReadTask(const VeChar8* pcFullPath, VeRefNode<ReadCallback>& kCallback) noexcept : m_kFullPath(pcFullPath) { IncRefCount(); m_kNode.m_Content = this; ve_sys.Collect(m_kNode); m_kCallback.attach_back(kCallback); m_kTask.m_Content = [this](VeTaskQueue& kMgr) noexcept { AAsset* pkAsset = AAssetManager_open(s_pkAssetManager, m_kFullPath, AASSET_MODE_UNKNOWN); if (pkAsset) { VeInt32 i32Len = AAsset_getLength(pkAsset); if (i32Len) { VeBlobPtr spBlob = VE_NEW VeBlob(i32Len); VeInt32 i32Read = AAsset_read(pkAsset, spBlob->GetBuffer(), i32Len); if (i32Read == i32Len) { m_spData = VE_NEW VeMemoryIStream(spBlob); } } AAsset_close(pkAsset); } m_kTask.m_Content = [this](VeTaskQueue& kMgr) noexcept { for (auto call : m_kCallback) { call(m_spData); } DecRefCount(); }; kMgr.AddFGTask(m_kTask); }; ve_res_mgr.GetTaskQueue(VeResourceManager::TASK_FILE).AddBGTask(m_kTask); }
BOOL CSocketObj::ConnectSer(CCustomIOCPBaseList &IOCPList, LPCTSTR SerAddr, int Port, int IncRefNumber) { BOOL resu = FALSE; ADDRINFOT _Hints; int _Retval; PADDRINFOT _ResultAddInfo; PADDRINFOT _NextAddInfo; DWORD _AddrStringLen; LPTSTR _AddrString; assert(mIsSerSocket == FALSE); ZeroMemory(&_Hints, sizeof(_Hints)); _Hints.ai_family = AF_UNSPEC; _Hints.ai_socktype = SOCK_STREAM; _Hints.ai_protocol = IPPROTO_TCP; _Retval = GetAddrInfo(SerAddr, to_tstring(Port).c_str(), &_Hints, &_ResultAddInfo); if (_Retval != 0) { return FALSE; } _NextAddInfo = _ResultAddInfo; // 申请缓冲区 _AddrString = new TCHAR[ADDR_STRING_MAX_LEN]; while (_NextAddInfo != NULL) { _AddrStringLen = ADDR_STRING_MAX_LEN; // 获取 #ifdef _DEBUG if (WSAAddressToString(_NextAddInfo->ai_addr, (DWORD)_NextAddInfo->ai_addrlen, NULL, _AddrString, &_AddrStringLen) == 0) { // 改为真实长度,这里的_AddrStringLen包含了末尾的字符#0,所以要减去这个#0的长度 _AddrStringLen--; OutputDebugStr(_T("ai_addr:%s,ai_flags:%d,ai_canonname=%s\n"), _AddrString, _NextAddInfo->ai_flags, _NextAddInfo->ai_canonname); } else { OutputDebugStr(_T("WSAAddressToString Error:%d\n"), WSAGetLastError()); } #endif mSock = WSASocket(_NextAddInfo->ai_family, _NextAddInfo->ai_socktype, _NextAddInfo->ai_protocol, NULL, 0, WSA_FLAG_OVERLAPPED); if (mSock != INVALID_SOCKET) { if (connect(mSock, _NextAddInfo->ai_addr, (INT)_NextAddInfo->ai_addrlen) == SOCKET_ERROR) { DWORD LastError = WSAGetLastError(); OutputDebugStr(_T("连接%s失败:%d\n"), _AddrString, LastError); closesocket(mSock); WSASetLastError(LastError); mSock = INVALID_SOCKET; } else { mOwner = &IOCPList; // 增加引用 IncRefCount(IncRefNumber); resu = IOCPList.AddSockBase(this); if (!resu) { DWORD LastError = WSAGetLastError(); OutputDebugStr(_T("添加%s到列表中失败:%d\n"), _AddrString, LastError); closesocket(mSock); WSASetLastError(LastError); mSock = INVALID_SOCKET; // 减少引用 DecRefCount(IncRefNumber); } break; } } _NextAddInfo = _NextAddInfo->ai_next; } delete[] _AddrString; FreeAddrInfo(_ResultAddInfo); return resu; }