[Tarantool-patches] [PATCH v2 05/10] sql: make BtCursor's memory aligned
Timur Safin
tsafin at tarantool.org
Thu May 28 23:20:18 MSK 2020
Quite tricky case, thanks!
LGTM!
Timur
: -----Original Message-----
: From: Vladislav Shpilevoy <v.shpilevoy at tarantool.org>
: Sent: Thursday, May 28, 2020 2:32 AM
: To: tarantool-patches at dev.tarantool.org; alyapunov at tarantool.org;
: korablev at tarantool.org; tsafin at tarantool.org
: Subject: [PATCH v2 05/10] sql: make BtCursor's memory aligned
:
: Vdbe at runtime allocates VdbeCursor structure using
: allocateCursor() function. Inside there is a pointer at BtCursor
: structure. To make the allocation faster and improve cache
: locality, both cursors are allocated in one memory block + some
: extra memory for uint32_t array, where BtCursor followed
: VdbeCursor and the array without any padding:
:
: VdbeCursor + uint32_t * N + BtCursor
:
: The problem is that BtCursor needs 8 byte alignment. When it
: followed VdbeCursor (aligned by 8) + some uint32_t values, its
: actual alignment could become 4 bytes. That led to a crash when
: alignment sanitizer is enabled in clang.
:
: The patch makes BtCursor offset aligned by 8 bytes.
:
: Part of #4609
: ---
: src/box/sql/vdbe.c | 8 +++-----
: 1 file changed, 3 insertions(+), 5 deletions(-)
:
: diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c
: index 724bc188b..7a42602a2 100644
: --- a/src/box/sql/vdbe.c
: +++ b/src/box/sql/vdbe.c
: @@ -234,10 +234,9 @@ allocateCursor(
: */
: Mem *pMem = iCur>0 ? &p->aMem[p->nMem-iCur] : p->aMem;
:
: - int nByte;
: VdbeCursor *pCx = 0;
: - nByte =
: - ROUND8(sizeof(VdbeCursor)) + sizeof(u32)*nField +
: + int bt_offset = ROUND8(sizeof(VdbeCursor) + sizeof(uint32_t) *
: nField);
: + int nByte = bt_offset +
: (eCurType==CURTYPE_TARANTOOL ? ROUND8(sizeof(BtCursor)) : 0);
:
: assert(iCur>=0 && iCur<p->nCursor);
: @@ -251,8 +250,7 @@ allocateCursor(
: pCx->eCurType = eCurType;
: pCx->nField = nField;
: if (eCurType==CURTYPE_TARANTOOL) {
: - pCx->uc.pCursor = (BtCursor*)
: - &pMem-
: >z[ROUND8(sizeof(VdbeCursor))+sizeof(u32)*nField];
: + pCx->uc.pCursor = (BtCursor*)&pMem->z[bt_offset];
: sqlCursorZero(pCx->uc.pCursor);
: }
: }
: --
: 2.21.1 (Apple Git-122.3)
More information about the Tarantool-patches
mailing list