55.4. РазлиÑнÑе ÑоглаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ оÑоÑÐ¼Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð° #
55.4.1. СÑандаÑÑ C #
Ðод в PostgreSQL должен иÑполÑзоваÑÑ ÑолÑко Ñе возможноÑÑи ÑзÑка, ÑÑо опиÑÐ°Ð½Ñ Ð² ÑÑандаÑÑе C99. ÐÑо ознаÑаеÑ, ÑÑо код postgres должен ÑÑпеÑно компилиÑоваÑÑÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑоÑом, поддеÑживаÑÑим C99, возможно, за иÑклÑÑением неÑколÑÐºÐ¸Ñ Ð¿Ð»Ð°ÑÑоÑмозавиÑимÑÑ Ð¼ÐµÑÑ.
ÐекоÑоÑÑе возможноÑÑи, воÑедÑие в ÑÑандаÑÑ C99, в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð¸ÑполÑзоваÑÑ Ð² коде ÑдÑа PostgreSQL нелÑзÑ. РданнÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑÑо маÑÑÐ¸Ð²Ñ Ð¿ÐµÑеменного ÑазмеÑа, пеÑемежаÑÑиеÑÑ Ñ ÐºÐ¾Ð´Ð¾Ð¼ обÑÑвлениÑ, комменÑаÑии // и ÑнивеÑÑалÑнÑе ÑимволÑнÑе имена. ÐаннÑй запÑÐµÑ Ð¾Ð±ÑÑÑнÑеÑÑÑ ÑообÑажениÑми пеÑеноÑимоÑÑи и иÑÑоÑиÑеÑки ÑложивÑейÑÑ Ð¿ÑакÑикой.
ÐозможноÑÑи более Ð¿Ð¾Ð·Ð´Ð½Ð¸Ñ Ñевизий ÑÑандаÑÑа C или ÑпеÑиÑиÑеÑкие оÑобенноÑÑи компилÑÑоÑа могÑÑ Ð¸ÑполÑзоваÑÑÑÑ, ÑолÑко еÑли пÑедÑÑмоÑÑен и ваÑÐ¸Ð°Ð½Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑии без Ð½Ð¸Ñ .
ÐапÑимеÑ, в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð¸ÑполÑзÑÑÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑии _Static_assert() и __builtin_constant_p, Ñ
оÑÑ Ð¾Ð½Ð¸ оÑноÑÑÑÑÑ Ðº более новÑм ÑевизиÑм ÑÑандаÑÑа C и ÑаÑÑиÑÐµÐ½Ð¸Ñ GCC, ÑооÑвеÑÑÑвенно. Ðо еÑли они недоÑÑÑпнÑ, Ð¼Ñ Ð¿ÐµÑеÑ
одим к ÑовмеÑÑимой Ñ C99 замене, коÑоÑÐ°Ñ Ð²ÑполнÑÐµÑ Ñе же пÑовеÑки, но вÑдаÑÑ Ð´Ð¾Ð²Ð¾Ð»Ñно непонÑÑнÑе ÑообÑениÑ, и не иÑполÑзÑем __builtin_constant_p.
55.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. ÐÑо пÑавило введено, поÑÐ¾Ð¼Ñ ÑÑо некоÑоÑÑе компилÑÑоÑÑ Ð³ÐµÐ½ÐµÑиÑÑÑÑ ÑказаÑели на ÑимволÑ, ÑигÑÑиÑÑÑÑие во внедÑÑннÑÑ
ÑÑнкÑиÑÑ
, даже когда ÑÑи ÑÑнкÑии не иÑполÑзÑÑÑÑÑ.
55.4.3. ÐапиÑание обÑабоÑÑиков Ñигналов #
ЧÑÐ¾Ð±Ñ ÐºÐ¾Ð´ мог вÑполнÑÑÑÑÑ Ð²Ð½ÑÑÑи обÑабоÑÑика Ñигналов, его нÑжно напиÑаÑÑ Ð¾ÑÐµÐ½Ñ Ð°ÐºÐºÑÑаÑно. ФÑндаменÑалÑÐ½Ð°Ñ ÑложноÑÑÑ ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо обÑабоÑÑик Ñигнала Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑеÑваÑÑ ÐºÐ¾Ð´ в лÑбой моменÑ, еÑли он не оÑклÑÑÑн. ÐÑли код внÑÑÑи обÑабоÑÑика Ñигнала иÑполÑзÑÐµÑ Ñо же ÑоÑÑоÑние, ÑÑо и внеÑний оÑновной код, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к Ñ Ð°Ð¾ÑÑ. РкаÑеÑÑве пÑимеÑа пÑедÑÑавÑÑе, ÑÑо пÑоизойдÑÑ, еÑли обÑабоÑÑик Ñигнала попÑÑаеÑÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ ÑÑ Ð¶Ðµ блокиÑовкÑ, коÑоÑой Ñже Ð²Ð»Ð°Ð´ÐµÐµÑ Ð¿ÑеÑваннÑй код.
ÐÑли не пÑедпÑинимаÑÑ ÑпеÑиалÑнÑÑ
меÑ, код в обÑабоÑÑикаÑ
Ñигналов Ð¼Ð¾Ð¶ÐµÑ Ð²ÑзÑваÑÑ ÑолÑко безопаÑнÑе Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ Ð°ÑинÑ
ÑоннÑÑ
Ñигналов ÑÑнкÑии (как ÑÑо опÑеделÑеÑÑÑ Ð² POSIX) и обÑаÑаÑÑÑÑ Ðº пеÑеменнÑм Ñипа volatile sig_atomic_t. Также безопаÑнÑми Ð´Ð»Ñ Ð¾Ð±ÑабоÑÑиков Ñигналов ÑÑиÑаÑÑÑÑ Ð½ÐµÑколÑко ÑÑнкÑий в postgres, в Ñом ÑиÑле, ÑÑо важно, SetLatch().
РболÑÑинÑÑве ÑлÑÑаев обÑабоÑÑики ÑобÑÑий Ð´Ð¾Ð»Ð¶Ð½Ñ ÑолÑко ÑообÑиÑÑ Ð¾ поÑÑÑплении Ñигнала и пÑобÑдиÑÑ ÐºÐ¾Ð´ ÑнаÑÑжи обÑабоÑÑика, иÑполÑзÑÑ Ð·Ð°ÑÑлкÑ. ÐапÑимеÑ, обÑабоÑÑик Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñаким:
static void
handle_sighup(SIGNAL_ARGS)
{
got_SIGHUP = true;
SetLatch(MyLatch);
}55.4.4. ÐÑзов ÑÑнкÑий по ÑказаÑелÑм #
ÐÑзов ÑÑнкÑии по ÑказаÑÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¿Ð¸ÑÑваÑÑÑÑ Ð¿Ð¾-ÑазномÑ. ЯÑноÑÑи Ñади, когда ÑказаÑÐµÐ»Ñ Ð½Ð° ÑÑнкÑÐ¸Ñ â пÑоÑÑÐ°Ñ Ð¿ÐµÑеменнаÑ, пÑедпоÑÑиÑелÑнÑм ваÑианÑом ÑÑиÑаеÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ñ ÑвнÑм ÑазÑменованием ÑказаÑелÑ, напÑимеÑ:
(*emit_log_hook) (edata);
(Ñ
оÑÑ Ð±ÑÐ´ÐµÑ ÑабоÑаÑÑ Ð¸ пÑоÑÑо emit_log_hook(edata)). Ðогда ÑказаÑÐµÐ»Ñ Ð½Ð° ÑÑнкÑии ÑвлÑеÑÑÑ ÑаÑÑÑÑ ÑÑÑÑкÑÑÑÑ, дополниÑелÑнÑе знаки пÑнкÑÑаÑии можно и обÑÑно даже нÑжно опÑÑкаÑÑ, напÑимеÑ:
paramInfo->paramFetch(paramInfo, paramId);