cameron314 / cameron314/concurrentqueue
loop panic
Open
Nobody has claimed this yet.
- Dominant language
- C++
- Stars
- 12.5k
- Forks
- 1.9k
- PR merge metrics
- No merged PRs in 30d
Description
code:
struct LogEvent {
std::string fmt;
void *udata;
std::string file_path;
int line;
SlogLevel level;
std::string tag;
int syslog_triger;
explicit LogEvent(std::string fmt, void *udata, std::string file_path, int line, SlogLevel level, std::string tag,
int syslog_triger = 0)
: fmt(std::move(fmt)),
udata(udata),
file_path(std::move(file_path)),
line(line),
level(level),
tag(std::move(tag)),
syslog_triger(syslog_triger) {}
};
moodycamel::ConcurrentQueue<LogEvent> log_buffer_;
static void LogToSyslog(const LogEvent &lev) {
auto log_t = fmt::format("{}: {}", lev.tag, lev.fmt);
syslog(LoggerTools::LevelSyslog(lev.level), "%s", log_t.c_str());
}
int main() {
const LogEvent lev{
formatted, nullptr, file, line, level, tag,
};
log_buffer_.enqueue(lev);
while (log_buffer_.size_approx() > 0) {
LogEvent lev{"", nullptr, "", 0, SlogLevel::DEBUG, ""};
auto ret = log_buffer_.try_dequeue(lev);
if (!ret) {
continue;
}
if (lev.level >= default_level_) {
LogToSyslog(lev);
}
}
}
panic info:
#0 std::__atomic_base<unsigned long>::load (__m=std::memory_order_relaxed, this=0x8c618a53ab61cf75) at /home/sinsegye/.conan/data/gcc/8.4.0/_/_/package/c36389a16c86a80fda9a30c45330b881d7951813/include/c++/8.4.0/bits/atomic_base.h:396
#1 moodycamel::ConcurrentQueue<slog::LogEvent, moodycamel::ConcurrentQueueDefaultTraits>::ProducerBase::size_approx (this=0x8c618a53ab61cf55) at /home/sinsegye/.conan/data/concurrentqueue/1.0.4/_/_/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include/moodycamel/concurrentqueue.h:1739
#2 0x000000000041721a in moodycamel::ConcurrentQueue<slog::LogEvent, moodycamel::ConcurrentQueueDefaultTraits>::size_approx (this=0x4a3860 <slog::Logger::instance()::inst>)
at /home/sinsegye/.conan/data/concurrentqueue/1.0.4/_/_/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include/moodycamel/concurrentqueue.h:1329
#3 0x0000000000406b36 in slog::Logger::Worker (this=0x4a3860 <slog::Logger::instance()::inst>) at /home/sinsegye/workspace/apps/src/logger/logger.cc:75
#4 0x000000000041b54f in std::__invoke_impl<void, void (slog::Logger::*)(), slog::Logger*> (__f=@0x1397bd0: (void (slog::Logger::*)(slog::Logger * const)) 0x406acc <slog::Logger::Worker()>, __t=@0x1397bc8: 0x4a3860 <slog::Logger::instance()::inst>)
at /home/sinsegye/.conan/data/gcc/8.4.0/_/_/package/c36389a16c86a80fda9a30c45330b881d7951813/include/c++/8.4.0/bits/invoke.h:73
#5 0x0000000000417a95 in std::__invoke<void (slog::Logger::*)(), slog::Logger*> (__fn=@0x1397bd0: (void (slog::Logger::*)(slog::Logger * const)) 0x406acc <slog::Logger::Worker()>)
at /home/sinsegye/.conan/data/gcc/8.4.0/_/_/package/c36389a16c86a80fda9a30c45330b881d7951813/include/c++/8.4.0/bits/invoke.h:95
#6 0x000000000045ddae in std::thread::_Invoker<std::tuple<void (slog::Logger::*)(), slog::Logger*> >::_M_invoke<0ul, 1ul> (this=0x1397bc8) at /home/sinsegye/.conan/data/gcc/8.4.0/_/_/package/c36389a16c86a80fda9a30c45330b881d7951813/include/c++/8.4.0/thread:244
#7 0x000000000045d92e in std::thread::_Invoker<std::tuple<void (slog::Logger::*)(), slog::Logger*> >::operator() (this=0x1397bc8) at /home/sinsegye/.conan/data/gcc/8.4.0/_/_/package/c36389a16c86a80fda9a30c45330b881d7951813/include/c++/8.4.0/thread:253
#8 0x000000000045c50e in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (slog::Logger::*)(), slog::Logger*> > >::_M_run (this=0x1397bc0) at /home/sinsegye/.conan/data/gcc/8.4.0/_/_/package/c36389a16c86a80fda9a30c45330b881d7951813/include/c++/8.4.0/thread:196
#9 0x00007ac349537253 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#10 0x00007ac3491bfac3 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442
#11 0x00007ac349250a04 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:100
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the reported access in concurrentqueue.h at lines 1329 and 1739, then inspect the caller at logger.cc:75. Reproduce the enqueue and dequeue loop from the issue and determine why size_approx reaches invalid state. Done means the loop no longer panics under the reported usage, with a regression test covering the case.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cpp
- Domain
- distributed-systems
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 38/100