CDbManager::PutThread nQueryMode Invalid

Newbie Spellweaver
Joined
Jul 31, 2024
Messages
35
Reaction score
7
I encounter this error don`t have the db crash.exe cause it not showing.. any idea what is the cause

1750170048924 - CDbManager::PutThread nQueryMode Invalid - RaGEZONE Forums
1750170129658 - CDbManager::PutThread nQueryMode Invalid - RaGEZONE Forums
 
Short answer: using the wrong iocp handle probably for certain functions.

Long answer:
It's using the IoCompletionPort Windows system as a way to systematically queue objects. The following code creating it without being associated with a socket/file/handle and then a thread being created.
C++:
m_hIOCPGuild = CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, 0, 0 );    // 길드용
    m_hThreadGuild = chBEGINTHREADEX( NULL, 0, _GuildThread, (LPVOID)this, 0, &dwThreadId );


Which the GetQueuedCompletionStatus function waits and blocks until it gets posted to.
C++:
bReturnValue = GetQueuedCompletionStatus(m_hIOCPGuild, &dwBytesTransferred, &dwCompletionKey, (LPOVERLAPPED*)&lpDbOverlappedPlus, INFINITE);
if (FALSE == bReturnValue)
{
    Error("GetQueuedCompletionStatus return FALSE. Error:[%d]", ::GetLastError());
    SAFE_DELETE_FREEREQUEST(lpDbOverlappedPlus);
    continue;
}

And example of it being posted.
C++:
void CDPTrans::OnQueryGuildBank(CAr& ar, DPID dpid, DPID dpidCache, DPID dpidUser, LPBYTE lpBuf, u_long uBufSize)
{
    LPDB_OVERLAPPED_PLUS lpDbOverlappedPlus = g_DbManager.AllocRequest();
    g_DbManager.MakeRequest(lpDbOverlappedPlus, lpBuf, uBufSize);
    lpDbOverlappedPlus->dpid = dpid;
    lpDbOverlappedPlus->dpidCache = dpidCache;
    lpDbOverlappedPlus->dpidUser = dpidUser;
    lpDbOverlappedPlus->nQueryMode = GUILD_BANK_QUERY;
    PostQueuedCompletionStatus(g_DbManager.m_hIOCPGuild, 1, NULL, &lpDbOverlappedPlus->Overlapped);
}

C++:
DB_OVERLAPPED_PLUS*        CDbManager::AllocRequest( void )
{
#ifdef __TRANS_0413
    DB_OVERLAPPED_PLUS* ptr    = new DB_OVERLAPPED_PLUS;
    memset( ptr, 0, sizeof(DB_OVERLAPPED_PLUS) );
    return ptr;
#else    // __TRANS_0413
    //    return    m_pDbIOData->Alloc();
    DB_OVERLAPPED_PLUS* ptr    = m_pDbIOData->Alloc();
    memset( ptr, 0, sizeof(DB_OVERLAPPED_PLUS) );
    return ptr;
#endif    // __TRANS_0413
}
C++:
void    CDbManager::MakeRequest( DB_OVERLAPPED_PLUS* pOverlappedPlus,  LPBYTE lpBuf, u_long uBufSize )
{
    //    mulcom    BEGIN100415
    if( uBufSize < 0 || uBufSize >= (1024*1024) )
    {
        Error( _T( "MakeRequest uBufSize Error. [%d]" ), uBufSize );
        
        uBufSize = 0;
    }
    //    mulcom    END100415

#ifdef __TRANS_0413
    pOverlappedPlus->lpBuf    = new BYTE[uBufSize];
#else
    pOverlappedPlus->lpBuf    = new BYTE[uBufSize];
    ::memset( pOverlappedPlus->lpBuf, 0, uBufSize );
#endif    // __TRANS_0413


    memcpy( pOverlappedPlus->lpBuf, lpBuf, uBufSize );
    pOverlappedPlus->uBufSize    = uBufSize;

    return;
}

It allocates some data, and moves some stuff, so it can handle it later.

The error you're getting is because the variable nQueryMode is set to a value that doesnt have a case statement for it within the retrospective thread.
 
Upvote 0
Back