Skip to content

Conversation

aafemt
Copy link
Contributor

@aafemt aafemt commented Sep 8, 2025

No description provided.

// If it succeed then the next record exists.

JRD_receive(tdbb, request, message->msg_number, outMsgLength, message_buffer.get());
std::unique_ptr<UCHAR[]> message_buffer(new UCHAR[outMsgLength]);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

HalfStaticArray, pls

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Size of the message is known at this point, so usage of HalfStaticArray will just waste space on stack or cause stack overflow if this size is used as InlineCapacity.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you think that outMsgLength could be used as InlineCapacity template argument ?
Looks like you not understand purpose and usage of HalfStaticArray.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you think that outMsgLength could be used as InlineCapacity template argument ?

No.

Looks like you not understand purpose and usage of HalfStaticArray.

Yes. Especially in this place which is executed exactly once per query.

Copy link
Member

@hvlad hvlad left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use HalfStaticArray to avoid unnecessary pool allocation in most cases

@AlexPeshkoff
Copy link
Member

Use HalfStaticArray to avoid unnecessary pool allocation in most cases

+1

{
// Create a temp message buffer and try one more receive.
// If it succeed then the next record exists.
if (outMsgLength > 0)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand why there is check for outMsgLength > 0 - is it possible to be false when singleton == true ?
Even if out message with zero length is possible (???), what should happens for the singleton && outMsgLength == 0 case ?
This place is very unclear for me.
In v5 there was just check for singleton == true, btw

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just in case. If the function was called with outMetadata == nullptr - just assume success. The difference from v5 is that buffers here are provided by application rather than of engine itself.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it possible to have singleton == true && outMetadata == nullptr ?
In any case, why two nested if here ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Initially check for request's activity was out of inner if. Then I realized that some BLR code can intentionally run to the end without entering blr_send and an application aware of it can provide no output buffer.

If you are sure that I'm wrong feel free to change this piece later.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm sure that this code is not clear. And you changed it this way.
Formally,

if (a) {
  if (b) {
...
  }
}

is the same as

if (a && b) {
...
}

thus I ask why you choose first one. If there is no real reason, change it.
If there is a reasons - provide it, and put in comments to avoid similar misunderstanding for the future readers.

Copy link
Member

@hvlad hvlad left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Much better now.

@dyemanov dyemanov merged commit 3e9cf8d into FirebirdSQL:master Sep 14, 2025
23 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants