In copy_file, use a palloc'd buffer instead of just a local char array;
authorTom Lane
Fri, 2 Sep 2005 18:55:32 +0000 (18:55 +0000)
committerTom Lane
Fri, 2 Sep 2005 18:55:32 +0000 (18:55 +0000)
a local array isn't guaranteed to have any particular alignment, and
so it could slow down the data transfer.

src/port/copydir.c

index a9339e79f9036b9af7f7cda47e23f69b5f658d58..4820917cda4b9093732f57996ab7d1776075b94f 100644 (file)
@@ -11,7 +11,7 @@
  * as a service.
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/port/copydir.c,v 1.12 2005/08/02 19:02:32 tgl Exp $
+ *   $PostgreSQL: pgsql/src/port/copydir.c,v 1.13 2005/09/02 18:55:32 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -88,11 +88,16 @@ copydir(char *fromdir, char *todir, bool recurse)
 static void
 copy_file(char *fromfile, char *tofile)
 {
-   char        buffer[8 * BLCKSZ];
+   char       *buffer;
    int         srcfd;
    int         dstfd;
    int         nbytes;
 
+   /* Use palloc to ensure we get a maxaligned buffer */
+#define COPY_BUF_SIZE (8 * BLCKSZ)
+
+   buffer = palloc(COPY_BUF_SIZE);
+
    /*
     * Open the files
     */
@@ -114,7 +119,7 @@ copy_file(char *fromfile, char *tofile)
     */
    for (;;)
    {
-       nbytes = read(srcfd, buffer, sizeof(buffer));
+       nbytes = read(srcfd, buffer, COPY_BUF_SIZE);
        if (nbytes < 0)
            ereport(ERROR,
                    (errcode_for_file_access(),
@@ -147,4 +152,6 @@ copy_file(char *fromfile, char *tofile)
                 errmsg("could not close file \"%s\": %m", tofile)));
 
    close(srcfd);
+
+   pfree(buffer);
 }