Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit d9cb34a

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 parent 84ae1af commit d9cb34a

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed

doc/src/sgml/sources.sgml

+105
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)