Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

m_BufferSize设置时机可能导致LogBuffer中的bufferSize与Cache的bufferSize不一致 #13

Open
1623040547 opened this issue Oct 12, 2024 · 3 comments

Comments

@1623040547
Copy link

1623040547 commented Oct 12, 2024

DataTransHub::SetBufferSize将修改m_BufferSize放到了主线程中,如果此时初始化执行顺序是DataTransHub::SetBufferSize->DataTransHub::Start。LogBuffer中PtrBuffer的max_length_可能仍为默认取值,而非修改取值。
这里的size修改为什么要放到主线程,有什么写法能避免这个问题吗?

下载
output

@lixiaoyu0123
Copy link

DataTransHub::SetBufferSize将修改m_BufferSize放到了主线程中,如果此时初始化执行顺序是DataTransHub::SetBufferSize->DataTransHub::Start。LogBuffer中PtrBuffer的max_length_可能仍为默认取值,而非修改取值。 这里的size修改为什么要放到主线程,有什么写法能避免这个问题吗?

下载 output

m_BufferSize 涉及到mmap缓冲区的调整,而缓冲区创建是要在组件使用之前就要准备好,否则传进来的数据没有安全地方存储。
整个组件使用方式是需要先进行整体的配置和初始化,这些都是在调用线程完成。 数据的打入一定是要在组件初始化之后,
如果采用异步初始化,调用数据进来可能缓冲区还没有初始化,这时候杀进程,数据就丢失了。

@1623040547
Copy link
Author

1623040547 commented Oct 14, 2024

DataTransHub::SetBufferSize将修改m_BufferSize放到了主线程中,如果此时初始化执行顺序是DataTransHub::SetBufferSize->DataTransHub::Start。LogBuffer中PtrBuffer的max_length_可能仍为默认取值,而非修改取值。 这里的size修改为什么要放到主线程,有什么写法能避免这个问题吗?
下载 output

m_BufferSize 涉及到mmap缓冲区的调整,而缓冲区创建是要在组件使用之前就要准备好,否则传进来的数据没有安全地方存储。 整个组件使用方式是需要先进行整体的配置和初始化,这些都是在调用线程完成。 数据的打入一定是要在组件初始化之后, 如果采用异步初始化,调用数据进来可能缓冲区还没有初始化,这时候杀进程,数据就丢失了。

嗯,我的表述可能没能让你理解到我的意思。配置和初始化我都是在写入数据之前进行的,这里的问题是,我先执行了DataTransHub::SetBufferSize,再执行了DataTransHub::Start,我采用了同步逻辑。但因为 m_ThreadManager->CallOnMainThread的存在,PtrBuffer绑定的buffer size是76800(默认值),而在绑定完成之后,m_BufferSize才赋值为153600(我设置的值),这样,就导致了PtrBuffer中的max_length与缓存文件的实际大小153600不一致。而我本身的调用顺序是DataTransHub::SetBufferSize,然后DataTransHub::Start,且没有使用异步逻辑。
而PtrBuffer::Attach会比时机的buffer设置时机早,原因可能是在于DataTransHub::Start中的Open方法并不是在m_ThreadManager->CallOnMainThread中的,导致DataTransHub::Start中的Open方法先于m_ThreadManager->CallOnMainThread执行。

  • PtrBuffer先被Attach
    image

  • m_BufferSize后被赋值
    image

  • PtrBuffer::Attach从Open处进入执行
    image

  • 安卓调用顺序
    d371912b-e548-46c7-9353-9e5d105470fd

  • c++初始化实现
    img_v3_02fl_0081f526-be6d-4a45-9dc9-941b8509993g

@lixiaoyu0123
Copy link

DataTransHub::SetBufferSize将修改m_BufferSize放到了主线程中,如果此时初始化执行顺序是DataTransHub::SetBufferSize->DataTransHub::Start。LogBuffer中PtrBuffer的max_length_可能仍为默认取值,而非修改取值。 这里的size修改为什么要放到主线程,有什么写法能避免这个问题吗?
下载 output

m_BufferSize 涉及到mmap缓冲区的调整,而缓冲区创建是要在组件使用之前就要准备好,否则传进来的数据没有安全地方存储。 整个组件使用方式是需要先进行整体的配置和初始化,这些都是在调用线程完成。 数据的打入一定是要在组件初始化之后, 如果采用异步初始化,调用数据进来可能缓冲区还没有初始化,这时候杀进程,数据就丢失了。

嗯,我的表述可能没能让你理解到我的意思。配置和初始化我都是在写入数据之前进行的,这里的问题是,我先执行了DataTransHub::SetBufferSize,再执行了DataTransHub::Start,我采用了同步逻辑。但因为 m_ThreadManager->CallOnMainThread的存在,PtrBuffer绑定的buffer size是76800(默认值),而在绑定完成之后,m_BufferSize才赋值为153600(我设置的值),这样,就导致了PtrBuffer中的max_length与缓存文件的实际大小153600不一致。而我本身的调用顺序是DataTransHub::SetBufferSize,然后DataTransHub::Start,且没有使用异步逻辑。 而PtrBuffer::Attach会比时机的buffer设置时机早,原因可能是在于DataTransHub::Start中的Open方法并不是在m_ThreadManager->CallOnMainThread中的,导致DataTransHub::Start中的Open方法先于m_ThreadManager->CallOnMainThread执行。

  • PtrBuffer先被Attach
    image
  • m_BufferSize后被赋值
    image
  • PtrBuffer::Attach从Open处进入执行
    image
  • 安卓调用顺序
    d371912b-e548-46c7-9353-9e5d105470fd
  • c++初始化实现
    img_v3_02fl_0081f526-be6d-4a45-9dc9-941b8509993g

对的, 这里是有问题。
SetBufferSize应该在调用线程设置,不应该抛一次线程。 这里是有问题的。
感谢提交宝贵意见。期望能提交一个pr合并进来。

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants