Bruce Momjian <br...@momjian.us> writes: > Tom Lane wrote: >> (The error message seems to be suffering from a bad case of copy-and- >> paste-itis, too.)
> Actually, it is accurate. The code is: > #ifdef WIN32 > h1 = CreateFile(TEMP_FILENAME_1, GENERIC_WRITE, 0, NULL, > OPEN_ALWAYS, 0, NULL); > h2 = CreateFile(TEMP_FILENAME_1, GENERIC_WRITE, 0, NULL, > CREATE_NEW, 0, NULL); > if (h1 == INVALID_HANDLE_VALUE || GetLastError() != > ERROR_FILE_EXISTS) > #else > if (open(TEMP_FILENAME_1, O_RDWR | O_CREAT, 0600) < 0 || > open(TEMP_FILENAME_1, O_RDWR | O_CREAT | O_EXCL, 0600) >= 0) > #endif > { > fprintf(stderr, "Could not create file in current directory > or\n"); > fprintf(stderr, "could not generate failure for create file in > current directory **\nexiting\n"); > exit(1); > } > This code generates an errno == EEXIST in one thread, while another > thread generates errno == ENOENT, and this is how we test for errno > being thread-safe. If you have a cleaner way to do this, please let me > know. mkdir()? The problem with that is you're trying to make one error message serve for two extremely different failure conditions. I think this should be coded more like if (open(TEMP_FILENAME_1, O_RDWR | O_CREAT, 0600) < 0) { report suitable failure message; exit(1); } if (open(TEMP_FILENAME_1, O_RDWR | O_CREAT | O_EXCL, 0600) >= 0) { report suitable failure message; exit(1); } You would probably find that the messages could be a lot more clear and specific if they were done like that. Also, a file-related error message that doesn't provide the filename nor strerror(errno) is pretty much wrong on its face, in my book. regards, tom lane -- Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-bugs