MCPcopy Create free account
hub / github.com/apache/cloudberry / pqCheckOutBufferSpace

Function pqCheckOutBufferSpace

src/interfaces/libpq/fe-misc.c:330–386  ·  view source on GitHub ↗

* Make sure conn's output buffer can hold bytes_needed bytes (caller must * include already-stored data into the value!) * * Returns 0 on success, EOF if failed to enlarge buffer */

Source from the content-addressed store, hash-verified

328 * Returns 0 on success, EOF if failed to enlarge buffer
329 */
330int
331pqCheckOutBufferSpace(size_t bytes_needed, PGconn *conn)
332{
333 int newsize = conn->outBufSize;
334 char *newbuf;
335
336 /* Quick exit if we have enough space */
337 if (bytes_needed <= (size_t) newsize)
338 return 0;
339
340 /*
341 * If we need to enlarge the buffer, we first try to double it in size; if
342 * that doesn't work, enlarge in multiples of 8K. This avoids thrashing
343 * the malloc pool by repeated small enlargements.
344 *
345 * Note: tests for newsize > 0 are to catch integer overflow.
346 */
347 do
348 {
349 newsize *= 2;
350 } while (newsize > 0 && bytes_needed > (size_t) newsize);
351
352 if (newsize > 0 && bytes_needed <= (size_t) newsize)
353 {
354 newbuf = realloc(conn->outBuffer, newsize);
355 if (newbuf)
356 {
357 /* realloc succeeded */
358 conn->outBuffer = newbuf;
359 conn->outBufSize = newsize;
360 return 0;
361 }
362 }
363
364 newsize = conn->outBufSize;
365 do
366 {
367 newsize += 8192;
368 } while (newsize > 0 && bytes_needed > (size_t) newsize);
369
370 if (newsize > 0 && bytes_needed <= (size_t) newsize)
371 {
372 newbuf = realloc(conn->outBuffer, newsize);
373 if (newbuf)
374 {
375 /* realloc succeeded */
376 conn->outBuffer = newbuf;
377 conn->outBufSize = newsize;
378 return 0;
379 }
380 }
381
382 /* realloc failed. Probably out of memory */
383 appendPQExpBufferStr(&conn->errorMessage,
384 "cannot allocate memory for output buffer\n");
385 return EOF;
386}
387

Callers 3

pqPutMsgStartFunction · 0.85
pqPutMsgBytesFunction · 0.85
PQputCopyDataFunction · 0.85

Calls 1

appendPQExpBufferStrFunction · 0.85

Tested by

no test coverage detected