mirror of
https://github.com/postgres/postgres.git
synced 2026-04-20 22:00:13 -04:00
Move the content lock directly into the BufferDesc, so that locking and pinning a buffer touches only one cache line rather than two. Adjust the definition of BufferDesc slightly so that this doesn't make the BufferDesc any larger than one cache line (at least on platforms where a spinlock is only 1 or 2 bytes). We can't fit the I/O locks into the BufferDesc and stay within one cache line, so move those to a completely separate tranche. This leaves a relatively limited number of LWLocks in the main tranche, so increase the padding of those remaining locks to a full cache line, rather than allowing adjacent locks to share a cache line, hopefully reducing false sharing. Performance testing shows that these changes make little difference on laptop-class machines, but help significantly on larger servers, especially those with more than 2 sockets. Andres Freund, originally based on an earlier patch by Simon Riggs. Review and cosmetic adjustments (including heavy rewriting of the comments) by me. |
||
|---|---|---|
| .. | ||
| exclude_file_patterns | ||
| indent.bsd.patch | ||
| perltidyrc | ||
| pgcppindent | ||
| pgindent | ||
| pgindent.man | ||
| README | ||
| typedefs.list | ||
pgindent
========
This can format all PostgreSQL *.c and *.h files, but excludes *.y, and
*.l files.
1) Install pg_bsd_indent (see below for details).
2) Install entab (src/tools/entab/).
3) Change directory to the top of the build tree.
4) Remove all derived files (pgindent has trouble with one of the flex macros):
make maintainer-clean
Or:
git clean -fdx
5) Download the typedef file from the buildfarm:
wget -O src/tools/pgindent/typedefs.list http://buildfarm.postgresql.org/cgi-bin/typedefs.pl
(see http://www.pgbuildfarm.org/cgi-bin/typedefs.pl?show_list for a full list of typedefs,
also http://adpgtech.blogspot.com/2015/05/running-pgindent-on-non-core-code-or.html)
6) Run pgindent:
src/tools/pgindent/pgindent
7) Remove any files that generate errors and restore their original
versions.
8) Indent the Perl code:
(
find . -name \*.pl -o -name \*.pm
find . -type f -exec file {} \; |
egrep -i ':.*perl[0-9]*\>' |
cut -d: -f1
) |
sort -u |
xargs perltidy --profile=src/tools/pgindent/perltidyrc
9) Do a full test build:
> run configure
# stop is only necessary if it's going to install in a location with an
# already running server
pg_ctl stop
run configure
make -C src install
make -C contrib install
run initdb
pg_ctl start
make installcheck-world
10) Remove Perl backup files after testing (*.bak)
---------------------------------------------------------------------------
BSD indent
----------
We have standardized on NetBSD's indent, and renamed it pg_bsd_indent.
We have fixed a few bugs which requre the NetBSD source to be patched
with indent.bsd.patch patch. A fully patched version is available at
ftp://ftp.postgresql.org/pub/dev.
GNU indent, version 2.2.6, has several problems, and is not recommended.
These bugs become pretty major when you are doing >500k lines of code.
If you don't believe me, take a directory and make a copy. Run pgindent
on the copy using GNU indent, and do a diff -r. You will see what I
mean. GNU indent does some things better, but mangles too. For details,
see:
http://archives.postgresql.org/pgsql-hackers/2003-10/msg00374.php
http://archives.postgresql.org/pgsql-hackers/2011-04/msg01436.php
---------------------------------------------------------------------------
Notes about excluded files
--------------------------
src/include/storage/s_lock.h and src/include/port/atomics/ are excluded
because they contain assembly code that pgindent tends to mess up.
src/include/snowball/libstemmer/ and src/backend/snowball/libstemmer/
are excluded because those files are imported from an external project,
not maintained locally, and are machine-generated anyway.
src/interfaces/ecpg/test/expected/ is excluded to avoid breaking the ecpg
regression tests. Several *.h files are included in regression output so
should not be changed.
---------------------------------------------------------------------------
Obsolete typedef list creation instructions
-------------------------------------------
To use pgindent:
1) Build the source tree with _debug_ symbols and all possible configure options
2) Install to /usr/local/pgsql
3) Install all contrib modules
4) Save a list of typedefs by running:
src/tools/find_typedef /usr/local/pgsql/bin /usr/local/pgsql/lib > /tmp/pgtypedefs