Probleme mit einem Ringpuffer

Buba235

Erfahrenes Mitglied
Hallo Leute!

Ich hoffe ihr könnt mir helfen. Ich habe, wie der Titel schon sagt, Probleme mit der Implementierung eines Ringpuffers. Und zwar ist mir die Abfrage der verschiedenen Fälle des Puffers nicht ganz klar. Ich habe folgenden Fall (wobei der Lesezeiger für das Eingelesene im Puffer zuständig ist und der Schreibzeiger für das was rausgeschrieben wird verantwortlich ist):

Code:
    if(a_bIsClient != MWEB_FALSE)
    {
        /* Check for buffer overflow in the ringbuffer (Client) */
        if(MWEB_pConnection->sClient.dwReadPosition >= MWEB_pConnection->sClient.dwWritePosition)
        {
            *a_pbyBuffer = (MWEB_LPBYTE)MWEB_pConnection->sClient.dwBufferSize;
            a_nLen = ((MWEB_LONG)a_pbyBuffer - MWEB_pConnection->sClient.dwReadPosition);
            return a_nLen;
        }
    }

Ich überprüfe zuerst ob es ein Client oder Server ist. Wobei dann die Verarbeitung identisch ist. Danach checke ich ob es einen Überlauf gibt oder nicht. Jetzt zu meinem Problem. Ich habe leider keine Ahnung wie ich weiter machen soll. Also mir ist klar, dass ich überprüfen muss, ob ich aus versehen Daten, die noch gebraucht werden überschreibe oder nicht. Nur ich kann mir das ganze nicht mehr vorstellen. Kann mir jemand vielleicht bitte eine Erklärung geben wie das auszusehen hat? Also ein Pseudocode würde mir schon reichen.

Danke schonmal an alle!

Gruß
Buba
 
Problem gelöst!

Für alle die es interessiert:

Code:
    if(     pBufferContext->dwReadPosition == pBufferContext->dwBufferSize
        &&  pBufferContext->dwWritePosition != 0)
    {
        pBufferContext->dwReadPosition = 0;
    }

    *a_ppbyBuffer = pBufferContext->pbyBuffer[pBufferContext->dwReadPosition];

    /* Check for buffer overflow in the ringbuffer */
    if(pBufferContext->dwReadPosition >= pBufferContext->dwWritePosition)
    {
        *a_pnLen = pBufferContext->dwBufferSize - pBufferContext->dwReadPosition;
    }
    else /* wrap around */
    {
        *a_pnLen = (pBufferContext->dwWritePosition - pBufferContext->dwReadPosition) - 1;
    }

    /* Buffer is full */
    if(*a_pnLen <= 1) /* keep read position from overtaking write position - 1 byte distance */
    {
        MWEB_TRACE(MWEB_DEBUG_LEVEL_WARNING, "Can not write into buffer -> Buffer is full!\n");
        *a_pnLen = 0;
    }
 
Zurück