PG中的临界区

critical section 关键区的作用

引子

gtm.h文件

1
2
3
4
5
6
#define START_CRIT_SECTION() (CritSectionCount++)

#define END_CRIT_SECTION() do { \
Assert(CritSectionCount > 0); \
CritSectionCount--; \
} while (0)

在代码中我们可以看到这样一些调用:

1
2
3
START_CRIT_SECTION() 
...
END_CRIT_SECTION()

这两行代码不过是对一个CritSectionCount进行加减,怎么起到对关键区的保护?

解释

在errstart中,如果发生问题,有一个判断:

1
2
3
4
5
6
7
8
9
10
11
/*
* Check some cases in which we want to promote an error into a more
* severe error. None of this logic applies for non-error messages.
*/
if (elevel >= ERROR && u_sess != NULL) {
/*
* If we are inside a critical section, all errors become PANIC
* errors. See miscadmin.h.
*/
if (t_thrd.int_cxt.CritSectionCount > 0)
elevel = PANIC;

如果 CritSectionCount 没有清0,说明错误发生在临界区内,于是把错误级别置为 PANIC 严重错误。

PANIC错误不会返回false,因此会进行整个错误处理过程。

作者

Desirer

发布于

2024-08-11

更新于

2024-11-15

许可协议