Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd9cb34a

Browse files
committed
Add some notes about coding conventions do the docs.
This deserves to be greatly expanded and improved, but it's a start.Discussion: 20150827145219.GI2435@awork2.anarazel.de
1 parent84ae1af commitd9cb34a

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed

‎doc/src/sgml/sources.sgml

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -851,4 +851,109 @@ BETTER: unrecognized node type: 42
851851

852852
</sect1>
853853

854+
<sect1 id="source-conventions">
855+
<title>Miscellaneous Coding Conventions</title>
856+
857+
<simplesect>
858+
<title>C Standard</title>
859+
<para>
860+
Code in <productname>PostgreSQL</> should only rely on language
861+
features available in the C89 standard. That means a conforming
862+
C89 compiler has to be able to compile postgres, at least aside
863+
from a few platform dependant pieces. Features from later
864+
revision of the C standard or compiler specific features can be
865+
used, if a fallback is provided.
866+
</para>
867+
<para>
868+
For example <literal>static inline</> and
869+
<literal>_StaticAssert()</literal> are currently used, even
870+
though they are from newer revisions of the C standard. If not
871+
available we respectively fall back to defining the functions
872+
without inline, and to using a C89 compatible replacement that
873+
performs the same checks, but emits rather cryptic messages.
874+
</para>
875+
</simplesect>
876+
877+
<simplesect>
878+
<title>Function-Like Macros and Inline Functions</title>
879+
<para>
880+
Both, macros with arguments and <literal>static inline</>
881+
functions, may be used. The latter are preferable if there are
882+
multiple-evaluation hazards when written as a macro, as e.g. the
883+
case with
884+
<programlisting>
885+
#define Max(x, y) ((x) > (y) ? (x) : (y))
886+
</programlisting>
887+
or when the macro would be very long. In other cases it's only
888+
possible to use macros, or at least easier. For example because
889+
expressions of various types need to be passed to the macro.
890+
</para>
891+
<para>
892+
When the definition an inline function references symbols
893+
(i.e. variables, functions) that are only available as part of the
894+
backend, the function may not be visible when included from frontend
895+
code.
896+
<programlisting>
897+
#ifndef FRONTEND
898+
static inline MemoryContext
899+
MemoryContextSwitchTo(MemoryContext context)
900+
{
901+
MemoryContext old = CurrentMemoryContext;
902+
903+
CurrentMemoryContext = context;
904+
return old;
905+
}
906+
#endif /* FRONTEND */
907+
</programlisting>
908+
In this example <literal>CurrentMemoryContext</>, which is only
909+
available in the backend, is referenced and the function thus
910+
hidden with a <literal>#ifndef FRONTEND</literal>. This rule
911+
exists because some compilers emit references to symbols
912+
contained in inline functions even if the function is not used.
913+
</para>
914+
</simplesect>
915+
916+
<simplesect>
917+
<title>Writing Signal Handlers</title>
918+
<para>
919+
To be suitable to run inside a signal handler code has to be
920+
written very carefully. The fundamental problem is that, unless
921+
blocked, a signal handler can interrupt code at any time. If code
922+
inside the signal handler uses the same state as code outside
923+
chaos may ensue. As an example consider what happens if a signal
924+
handler tries to acquire a lock that's already held in the
925+
interrupted code.
926+
</para>
927+
<para>
928+
Barring special arrangements code in signal handlers may only
929+
call async-signal safe functions (as defined in posix) and access
930+
variables of type <literal>volatile sig_atomic_t</literal>. A few
931+
functions in postgres are also deemed signal safe, importantly
932+
<literal>SetLatch()</literal>.
933+
</para>
934+
<para>
935+
In most cases signal handlers should do nothing more than note
936+
that a signal has arrived, and wake up code running outside of
937+
the handler using a latch. An example of such a handler is the
938+
following:
939+
<programlisting>
940+
static void
941+
handle_sighup(SIGNAL_ARGS)
942+
{
943+
int save_errno = errno;
944+
945+
got_SIGHUP = true;
946+
SetLatch(MyLatch);
947+
948+
errno = save_errno;
949+
}
950+
</programlisting>
951+
<literal>errno</> is safed and restored because
952+
<literal>SetLatch()</> might change it. If that were not done
953+
interrupted code that's currently inspecting errno might see the wrong
954+
value.
955+
</para>
956+
</simplesect>
957+
958+
</sect1>
854959
</chapter>

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp