so if absOff=5000k he reads 2000k, then again the same 2000k adn then the remaining 1000k which is again the same ;) hmm no so lets say absOff = 5k you ar3e a moron and u dont start logging until many hours.. then u start logging.. read(buf, len=2k, offset=0) this is the first read.. * sabor . o O ( so much for exploding brains =) damn.. u stil here?? ur supposed to have shot urself by now fdamnit * T` always screwing up my evil plans.. grr well.. so the read goes and asks for 2k bytes from offset 0 we see offset < 5k - (BUFFER_SIZE=2k) so we do offset = (absOff - 2k) and read from offset 3k to 5k.. and return in the first read, i update an open handle's data structure with the latest offset .. 3k so when you do next.. 2k read you are trying to read... offset: 2k+3k, length: 2k so then it will block until you get enough data makes sense? Log_GetBufferBlocking(data, &length, &absOffset, TRUE); if (!handleData->offsetInit) { handleData->startOffset = absOffset; handleData->offsetInit = 1; } oops.. and in the beginning i have: uint32 absOffset = handleData->startOffset + offset; Log_GetBufferBlocking will immediately return if there is any data.. and it will overwrite absOffset with latest starting offset of the log buffer