Skip to content
New issue

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

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

Already on GitHub? Sign in 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合并进来。

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

No branches or pull requests

2 participants