Цитата(starter48 @ Oct 28 2005, 13:39)
Да, если BUFFER_SIZE=64k, но тогда можно написать просто size = wr_ptr -rd_ptr;
Так можно делать при любом буфере размера степени 2.
Ещё раз прошу взять листик в клеточку и убедиться самостоятельно.
Или убедить меня - привести хотя бы один пример конкретных и
корректных значений wr_ptr, rd_ptr и BUFFER_SIZE, при которых size = wr_ptr - rd_ptr; даёт неправильное значение.
Под корректными понимаются - BUFFER_SIZE есть (1 shl n) n=0,15; буфер
не переполнен.
Цитата(starter48 @ Oct 28 2005, 13:39)
Но ReAl говорил, что буфер может быть 1/2/4/8k, тогда так писать нельзя.
Допустим, wr_ptr = 0;rd_ptr = 1; т.е. циклицеский буфер весь заполнен.
Если wr_ptr и rd_ptr такие, то он не заполнен, а очень много раз
переполнен (65535 для буфера размером 64К).
Ещё раз. wr_ptr и rd_ptr это не столько указатели, сколько IP "номера последовательности". Про то, что они - IP, а не указатели в буфере, я уже писал. Они же 32-битные.
Ну подумай сам. Пусть было rd_ptr ==1, wr_ptr == 1 (буфер пуст).
Сколько байт надо записать, чтобы
32-битный wr_ptr свернулся в колечко?
Я это и имел ввиду под параноидальным вариантом - но и тогда никакие BUFFER_SIZE при вычислении size не нужны.
Цитата(starter48 @ Oct 28 2005, 13:39)
Чтобы этого избежать можно сделать так:
Код
size = BUFFER_SIZE - rd_ptr + wr_ptr;//size = BUFFER_SIZE - 1
Вот и залетели. Не поймали переполнение, так как на самом деле в буфер
было записано 0xFFFFFFFF байт, в результате которых wr_ptr из 1 превратился в 0.
Цитата(starter48 @ Oct 28 2005, 13:39)
Код
или
size = (wr_ptr - rd_ptr) % BUFFER_SIZE;
//size = 0xFFFFFFF % BUFFER_SIZE = BUFFER_SIZE - 1
или
size = (wr_ptr - rd_ptr) & (BUFFER_SIZE-1);
//size = 0xFFFFFFF & (BUFFER_SIZE-1) = BUFFER_SIZE - 1
По этой причине и все эти % млм & не просто не нужны, а
вредныЦитата(starter48 @ Oct 28 2005, 13:39)
Скажи plz, где взять исходник оригинальный? А то у меня складывается ощущение, что я чего-то не понимаю

.
Имеем 1/2/4/8 - килобайтный буфер и 32-битные "указатели", которые наращиваются без учёта самого буфера (IP sequence numbers или как их там).
Младшие биты этих величин можно рассматривать как указатели в буфере, старшие - как число "сворачиваний" младших битов по модулю размера буфера.