Heikki Linnakangas <hlinn...@iki.fi>, 14 Mar 2024 Per, 15:46 tarihinde şunu yazdı:
> On 14/03/2024 13:22, Melih Mutlu wrote: > > @@ -1282,14 +1283,32 @@ internal_putbytes(const char *s, size_t len) > > if (internal_flush()) > > return EOF; > > } > > - amount = PqSendBufferSize - PqSendPointer; > > - if (amount > len) > > - amount = len; > > - memcpy(PqSendBuffer + PqSendPointer, s, amount); > > - PqSendPointer += amount; > > - s += amount; > > - len -= amount; > > + > > + /* > > + * If the buffer is empty and data length is larger than > the buffer > > + * size, send it without buffering. Otherwise, put as much > data as > > + * possible into the buffer. > > + */ > > + if (!pq_is_send_pending() && len >= PqSendBufferSize) > > + { > > + int start = 0; > > + > > + socket_set_nonblocking(false); > > + if (internal_flush_buffer(s, &start, (int *)&len)) > > + return EOF; > > + } > > + else > > + { > > + amount = PqSendBufferSize - PqSendPointer; > > + if (amount > len) > > + amount = len; > > + memcpy(PqSendBuffer + PqSendPointer, s, amount); > > + PqSendPointer += amount; > > + s += amount; > > + len -= amount; > > + } > > } > > + > > return 0; > > } > > Two small bugs: > > - the "(int *) &len)" cast is not ok, and will break visibly on > big-endian systems where sizeof(int) != sizeof(size_t). > > - If internal_flush_buffer() cannot write all the data in one call, it > updates 'start' for how much it wrote, and leaves 'end' unchanged. You > throw the updated 'start' value away, and will send the same data again > on next iteration. > There are two possible options for internal_flush_buffer() in internal_putbytes() case: 1- Write all the data and return 0. We don't need start or end of the data in this case. 2- Cannot write all and return EOF. In this case internal_putbytes() also returns EOF immediately and does not really retry. There will be no next iteration. If it was non-blocking, then we may need to keep the new value. But I think we do not need the updated start value in both cases here. What do you think? Thanks, -- Melih Mutlu Microsoft