53.4. РазлиÑнÑе ÑоглаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ оÑоÑÐ¼Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð°
53.4.1. СÑандаÑÑ C
Ðод в PostgreSQL должен иÑполÑзоваÑÑ ÑолÑко Ñе возможноÑÑи ÑзÑка, ÑÑо опиÑÐ°Ð½Ñ Ð² ÑÑандаÑÑе C89. ÐÑо ознаÑаеÑ, ÑÑо код postgres должен ÑÑпеÑно компилиÑоваÑÑÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑоÑом, поддеÑживаÑÑим C89, возможно, за иÑклÑÑением неÑколÑÐºÐ¸Ñ Ð¿Ð»Ð°ÑÑоÑмозавиÑимÑÑ Ð¼ÐµÑÑ. ÐозможноÑÑи более Ð¿Ð¾Ð·Ð´Ð½Ð¸Ñ Ñевизий ÑÑандаÑÑа C или ÑпеÑиÑиÑеÑкие оÑобенноÑÑи компилÑÑоÑа могÑÑ Ð¸ÑполÑзоваÑÑÑÑ, ÑолÑко еÑли пÑедÑÑмоÑÑен и ваÑÐ¸Ð°Ð½Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑии без Ð½Ð¸Ñ .
ÐапÑимеÑ, в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð¸ÑполÑзÑÑÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑии static inline и _Static_assert(), Ñ
оÑÑ Ð¾Ð½Ð¸ оÑноÑÑÑÑÑ Ðº более новÑм ÑевизиÑм ÑÑандаÑÑа C. Ðо еÑли они недоÑÑÑпнÑ, Ð¼Ñ ÑооÑвеÑÑÑвенно пеÑеÑ
одим к опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑнкÑий без inline и к иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð°Ð»ÑÑеÑнаÑивÑ, коÑоÑÐ°Ñ ÑовмеÑÑима Ñ C89 и вÑполнÑÐµÑ Ñе же пÑовеÑки, но вÑдаÑÑ Ð´Ð¾Ð²Ð¾Ð»Ñно непонÑÑнÑе ÑообÑениÑ.
53.4.2. ÐнедÑÑннÑе ÑÑнкÑии и макÑоÑÑ, подобнÑе ÑÑнкÑиÑм
ÐопÑÑкаеÑÑÑ Ð¸ÑполÑзование и макÑоÑов Ñ Ð°ÑгÑменÑами, и ÑÑнкÑий static inline. ÐоÑледний ваÑÐ¸Ð°Ð½Ñ Ð¿ÑедпоÑÑиÑелÑнее, еÑли Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ ÑиÑк множеÑÑвенного вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð²ÑÑажений в макÑоÑе, как напÑÐ¸Ð¼ÐµÑ Ð² ÑлÑÑае Ñ
#define Max(x, y) ((x) > (y) ? (x) : (y))
или когда макÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑлиÑком обÑÑмнÑм. РдÑÑÐ³Ð¸Ñ ÑлÑÑаÑÑ Ð¸ÑполÑзоваÑÑ Ð¼Ð°ÐºÑоÑÑ â единÑÑвеннÑй, или как минимÑм более пÑоÑÑой ваÑианÑ. ÐапÑимеÑ, Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð° возможноÑÑÑ Ð¿ÐµÑедаваÑÑ Ð¼Ð°ÐºÑоÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑазлиÑнÑÑ Ñипов.
Ðогда опÑеделение внедÑÑнной ÑÑнкÑии обÑаÑаеÑÑÑ Ðº Ñимволам (пеÑеменнÑм, ÑÑнкÑиÑм), доÑÑÑпнÑм ÑолÑко в ÑеÑвеÑном коде, ÑÐ°ÐºÐ°Ñ ÑÑнкÑÐ¸Ñ Ð½Ðµ должна бÑÑÑ Ð²Ð¸Ð´Ð½Ð° пÑи вклÑÑении в клиенÑÑкий код.
#ifndef FRONTEND
static inline MemoryContext
MemoryContextSwitchTo(MemoryContext context)
{
MemoryContext old = CurrentMemoryContext;
CurrentMemoryContext = context;
return old;
}
#endif /* FRONTEND */ Ð ÑÑом пÑимеÑе вÑзÑваеÑÑÑ ÑÑнкÑÐ¸Ñ CurrentMemoryContext, ÑÑÑеÑÑвÑÑÑÐ°Ñ ÑолÑко на ÑÑоÑоне ÑеÑвеÑа, и поÑÑÐ¾Ð¼Ñ ÑÑнкÑÐ¸Ñ ÑкÑÑÑа диÑекÑивой #ifndef FRONTEND. ÐÑо пÑавило введено, поÑÐ¾Ð¼Ñ ÑÑо некоÑоÑÑе компилÑÑоÑÑ Ð³ÐµÐ½ÐµÑиÑÑÑÑ ÑказаÑели на ÑимволÑ, ÑигÑÑиÑÑÑÑие во внедÑÑннÑÑ
ÑÑнкÑиÑÑ
, даже когда ÑÑи ÑÑнкÑии не иÑполÑзÑÑÑÑÑ.
53.4.3. ÐапиÑание обÑабоÑÑиков Ñигналов
ЧÑÐ¾Ð±Ñ ÐºÐ¾Ð´ мог вÑполнÑÑÑÑÑ Ð²Ð½ÑÑÑи обÑабоÑÑика Ñигналов, его нÑжно напиÑаÑÑ Ð¾ÑÐµÐ½Ñ Ð°ÐºÐºÑÑаÑно. ФÑндаменÑалÑÐ½Ð°Ñ ÑложноÑÑÑ ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо обÑабоÑÑик Ñигнала Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑеÑваÑÑ ÐºÐ¾Ð´ в лÑбой моменÑ, еÑли он не оÑклÑÑÑн. ÐÑли код внÑÑÑи обÑабоÑÑика Ñигнала иÑполÑзÑÐµÑ Ñо же ÑоÑÑоÑние, ÑÑо и внеÑний оÑновной код, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к Ñ Ð°Ð¾ÑÑ. РкаÑеÑÑве пÑимеÑа пÑедÑÑавÑÑе, ÑÑо пÑоизойдÑÑ, еÑли обÑабоÑÑик Ñигнала попÑÑаеÑÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ ÑÑ Ð¶Ðµ блокиÑовкÑ, коÑоÑой Ñже Ð²Ð»Ð°Ð´ÐµÐµÑ Ð¿ÑеÑваннÑй код.
ÐÑли не пÑедпÑинимаÑÑ ÑпеÑиалÑнÑÑ
меÑ, код в обÑабоÑÑикаÑ
Ñигналов Ð¼Ð¾Ð¶ÐµÑ Ð²ÑзÑваÑÑ ÑолÑко безопаÑнÑе Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ Ð°ÑинÑ
ÑоннÑÑ
Ñигналов ÑÑнкÑии (как ÑÑо опÑеделÑеÑÑÑ Ð² POSIX) и обÑаÑаÑÑÑÑ Ðº пеÑеменнÑм Ñипа volatile sig_atomic_t. Также безопаÑнÑми Ð´Ð»Ñ Ð¾Ð±ÑабоÑÑиков Ñигналов ÑÑиÑаÑÑÑÑ Ð½ÐµÑколÑко ÑÑнкÑий в postgres, в Ñом ÑиÑле, ÑÑо важно, SetLatch().
РболÑÑинÑÑве ÑлÑÑаев обÑабоÑÑики ÑобÑÑий Ð´Ð¾Ð»Ð¶Ð½Ñ ÑолÑко ÑообÑиÑÑ Ð¾ поÑÑÑплении Ñигнала и пÑобÑдиÑÑ ÐºÐ¾Ð´ ÑнаÑÑжи обÑабоÑÑика, иÑполÑзÑÑ Ð·Ð°ÑÑлкÑ. ÐапÑимеÑ, обÑабоÑÑик Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñаким:
static void
handle_sighup(SIGNAL_ARGS)
{
int save_errno = errno;
got_SIGHUP = true;
SetLatch(MyLatch);
errno = save_errno;
} ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ errno ÑоÑ
ÑанÑеÑÑÑ Ð¸ воÑÑÑанавливаеÑÑÑ, Ñак как ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ SetLatch(). ÐÑли ÑÑого не ÑделаÑÑ, пÑеÑваннÑй код, ÑÑиÑÑÐ²Ð°Ñ errno, мог Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð½ÐµÐºÐ¾ÑÑекÑное знаÑение.