Muduo is a multithreaded C++ network library based on the reactor pattern. http://github.com/chenshuo/muduo Copyright (c) 2010, Shuo Chen. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the License file. Requires: Linux kernel version >= 2.6.28. GCC >= 4.7 or Clang >= 3.5 Boost (for boost::any only.) Tested on: Debian 7 and above Unbuntu 14.04 and above CentOS 7 and above To build, run: ./build.sh See https://github.com/chenshuo/muduo-tutorial for how to use muduo in your project. __ __ _ | \/ | | | | \ / |_ _ __| |_ _ ___ | |\/| | | | |/ _` | | | |/ _ \ | | | | |_| | (_| | |_| | (_) | |_| |_|\__,_|\__,_|\__,_|\___/
Event-driven network library for multi-threaded Linux server in C++11
Muduo is a multithreaded C++ network library based on the reactor pattern. http://github.com/chenshuo/muduo Copyright (c) 2010, Shuo Chen. All rights reserved. Use of this source code is governed by a BSD-style license that can be foundCategory: C/C++ / Networking and Internet |
Watchers: 781 |
Star: 11.7k |
Fork: 4.7k |
Last update: Aug 3, 2022 |
在Singleton类中的init函数中的::atexit(destroy)如果调用失败呢? #108
server端一开始是监听reading事件的, 当应用层读完所有数据的时候,应用层可能会调用 channel->disableReading() EPollPoller.cc:updateChannel 逻辑会将该 channel->fd_ 从 epoll 中移出。
当Client端断开连接时,会依次调用 TcpConnection::handleClose()、channel->disableReading()、EPollPoller.cc:updateChannel等 然而 EPollPoller.cc:updateChannel 这里的状态机不满足这种调用场景,又会将该 channel::fd_ 放入 epoll 中, 这样会造成不必要的系统调用,同时状态也更复杂。
因此做一个基本的检查,如果没有事件要监听的话,就不添加到epoll中。
I can not find a function(or method) to detect the connection failure with a server when TcpClient try to connect with a server. How to know connection failure?
硕神你好,你的linux多线程服务端编程我拜读过了,你的网课也上过,muduo 也看了两遍,对我帮助非常大,很感谢你的的分享。 最近在读 nginx,两者都为事件驱动,不禁做了些比较,也有一些疑惑,想请教一下:
1.nginx 对于一次 loop 返回的多个事件,前面先处理的事件可能会导致后面事件的失效(比如第一个处理的事件在某些条件下关闭了这次返回的事件列表中排在第二位的事件对应的链接),其通过 event 中的 instance 字段基本实现了可以跳过这种失效的事件的情况,但是貌似在 muduo 中做不到,本来我以为 muduo 的 channel.tie 方法可以做到,但是仔细看了代码加上试验后发现并不能组织在这次 loop 中处理后面失效事件的问题(即使是使用单线程模型也是,因为 removeConnection 中调用了 queueInLoop,所以一个 connptr 的析构是不可能发生在一次 loop 的 eventhandling 阶段的),这个是否可以作为一个改进点呢?
2.这个也是由前面的问题引出的,muduo 中 mainthread(listen thread)保存了一份 conn_map,所以在多线程模式下, connptr 的处理显得很复杂,需要先在 conn's ioloop 中关闭对读写事件的关注,然后通过回调,在 mainthread erase map 中的数据,最后再通过回调,在 conn's ioloop 将 channel 从 eventloop 中移除掉。我主要不解的是 a.为什么一定要在 mainthread 保存一份 conn_map 呢,如果 conn 也仅有其所属的 eventloop 去处理,那么就更容易避免多线程 race 了? b.handleClose 中先 disable 了全部事件,但是没有 remove channel,而是在 mainthread erase 之后在通过回调做这个事情,这两个步骤拆开的原因是?
生产环境出现这样的问题: TcpConnection::handleRead里面的readFd在同一个连接上面死循环返回-1,errno=EAGAIN,导致日志写满磁盘,请问这种问题怎么解决?
Discussed in https://github.com/chenshuo/muduo/discussions/626
Originally posted by HelloWorld-9527 July 28, 2022 看了muduo日志相关的,想请教一下,日志类中的cookieStart、cookieEnd,作用是什么呢,具体是怎么用的呢? 可否举个具体的例子呢?
感谢
GitHub issues are for tracking bugs, not for general discussing like a forum.
If you have a general question to ask, send it to mailing list:
Or visit: https://groups.google.com/forum/#!forum/muduo-library
When file an issue muduo, please provide a SSCCE: Short, Self Contained, Correct (Compilable), Example.
If you can't compile muduo, make sure you install cmake
and boost
from the
official package repository, e.g. apt
or yum
, before opening a bug.
Don't open a bug if you installed boost from a third-party source or
downloaded it by yourself, and couldn't compile muduo, thank you.
Also specify the exact environment where the issue occurs:
Linux distro and version? x86 or ARM? 32-bit or 64-bit?
Linux Ubuntu 18.04.6 LTS 64-bit
Branch (cpp98/cpp11/cpp17) and version of muduo?
cpp11 muduo-2.0.2
Version of cmake, gcc and boost? (If not from distro.)
cmake 3.10.2 gcc 7.5.0 boost 1.65.1 protoc --version libprotoc 2.6.1
运行 :./build.sh -j2 ++ pwd
- SOURCE_DIR=/muduo-2.0.0
- BUILD_DIR=../build
- BUILD_TYPE=release
- INSTALL_DIR=../release-install-cpp11
- CXX=g++
- ln -sf ../build/release-cpp11/compile_commands.json
- mkdir -p ../build/release-cpp11
- cd ../build/release-cpp11
- cmake -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX=../release-install-cpp11 -DCMAKE_EXPORT_COMPILE_COMMANDS=ON /muduo-2.0.0 -- The C compiler identification is GNU 7.5.0 -- The CXX compiler identification is GNU 7.5.0 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Boost version: 1.65.1 -- Looking for pthread.h -- Looking for pthread.h - found -- Looking for pthread_create -- Looking for pthread_create - not found -- Looking for pthread_create in pthreads -- Looking for pthread_create in pthreads - not found -- Looking for pthread_create in pthread -- Looking for pthread_create in pthread - found -- Found Threads: TRUE -- Found Protobuf: /usr/local/lib/libprotobuf.so;-lpthread (found version "2.6.1") -- Found CURL: /usr/lib/x86_64-linux-gnu/libcurl.so (found version "7.58.0") -- Found ZLIB: /usr/lib/x86_64-linux-gnu/libz.so (found version "1.2.11") -- found cares -- found curl -- found protobuf -- found zlib -- CXX_FLAGS = -g -DCHECK_PTHREAD_RETURN_VALUE -D_FILE_OFFSET_BITS=64 -Wall -Wextra -Werror -Wconversion -Wno-unused-parameter -Wold-style-cast -Woverloaded-virtual -Wpointer-arith -Wshadow -Wwrite-strings -march=native -std=c++11 -rdynamic -O2 -DNDEBUG -- Looking for accept4 -- Looking for accept4 - found -- Configuring done -- Generating done -- Build files have been written to: /build/release-cpp11
- make -j2
Scanning dependencies of target atomic_unittest
Scanning dependencies of target muduo_base
[ 0%] Building CXX object muduo/base/tests/CMakeFiles/atomic_unittest.dir/Atomic_unittest.cc.o
[ 0%] Building CXX object muduo/base/CMakeFiles/muduo_base.dir/AsyncLogging.cc.o
...
[ 20%] Building CXX object examples/sudoku/CMakeFiles/sudoku_stat_unittest.dir/stat_unittest.cc.o
[ 20%] Building CXX object muduo/net/CMakeFiles/muduo_net.dir/Buffer.cc.o
[ 20%] Building CXX object muduo/net/CMakeFiles/muduo_net.dir/Channel.cc.o
[ 21%] Building CXX object muduo/net/CMakeFiles/muduo_net.dir/Connector.cc.o
[ 21%] Building CXX object muduo/net/CMakeFiles/muduo_net.dir/EventLoop.cc.o
[ 21%] Building CXX object muduo/net/CMakeFiles/muduo_net.dir/EventLoopThread.cc.o
[ 22%] Linking CXX executable ../../bin/sudoku_stat_unittest
[ 22%] Built target sudoku_stat_unittest
Scanning dependencies of target protobuf_dispatcher_lite_test
[ 22%] Building CXX object examples/protobuf/codec/CMakeFiles/protobuf_dispatcher_lite_test.dir/dispatcher_lite_test.cc.o
[ 22%] Building CXX object muduo/net/CMakeFiles/muduo_net.dir/EventLoopThreadPool.cc.o
[ 23%] Building CXX object muduo/net/CMakeFiles/muduo_net.dir/InetAddress.cc.o
[ 23%] Linking CXX executable ../../../bin/protobuf_dispatcher_lite_test
../../../lib/libquery_proto.a(query.pb.cc.o): In function
muduo::Empty::~Empty()': /build/release-cpp11/examples/protobuf/codec/query.pb.cc:911: undefined reference to
google::protobuf::UnknownFieldSet::~UnknownFieldSet()' ../../../lib/libquery_proto.a(query.pb.cc.o): In functionmuduo::Empty::~Empty()': /build/release-cpp11/examples/protobuf/codec/query.pb.cc:911: undefined reference to
google::protobuf::UnknownFieldSet::~UnknownFieldSet()' /build/release-cpp11/examples/protobuf/codec/query.pb.cc:911: undefined reference togoogle::protobuf::Message::~Message()' ../../../lib/libquery_proto.a(query.pb.cc.o): In function
muduo::Empty::SerializeWithCachedSizesToArray(unsigned char*) const': /usr/local/include/google/protobuf/io/coded_stream.h:1015: undefined reference togoogle::protobuf::io::CodedOutputStream::WriteVarint32FallbackToArray(unsigned int, unsigned char*)' ../../../lib/libquery_proto.a(query.pb.cc.o): In function
void google::protobuf::internal::RepeatedPtrFieldBase::Destroy<google::protobuf::RepeatedPtrField<std::__cxx11::basic_string<char, std::char_traits, std::allocator > >::TypeHandler>() [clone .isra.44]': /usr/local/include/google/protobuf/repeated_field.h:869: undefined reference to google::protobuf::internal::StringTypeHandlerBase::Delete(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)' ../../../lib/libquery_proto.a(query.pb.cc.o): In function
muduo::Answer::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*)': /usr/local/include/google/protobuf/io/coded_stream.h:924: undefined reference togoogle::protobuf::io::CodedInputStream::ReadTagFallback()' ../../../lib/libquery_proto.a(query.pb.cc.o): In function
muduo::Answer::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*)': /build/release-cpp11/examples/protobuf/codec/query.pb.cc:607: undefined reference togoogle::protobuf::internal::WireFormatLite::ReadString(google::protobuf::io::CodedInputStream*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)' /build/release-cpp11/examples/protobuf/codec/query.pb.cc:624: undefined reference to
google::protobuf::internal::WireFormatLite::ReadString(google::protobuf::io::CodedInputStream*, std::__cxx11::basic_string<char, std::char_traits, std::allocator >)' ../../../lib/libquery_proto.a(query.pb.cc.o): In function muduo::Answer::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*)': /usr/local/include/google/protobuf/repeated_field.h:905: undefined reference to
google::protobuf::internal::StringTypeHandlerBase::Newabi:cxx11' ../../../lib/libquery_proto.a(query.pb.cc.o): In functionmuduo::Answer::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*)': /build/release-cpp11/examples/protobuf/codec/query.pb.cc:641: undefined reference to
google::protobuf::internal::WireFormatLite::ReadString(google::protobuf::io::CodedInputStream, std::__cxx11::basic_string<char, std::char_traits, std::allocator >)' /build/release-cpp11/examples/protobuf/codec/query.pb.cc:641: undefined reference to google::protobuf::internal::WireFormatLite::ReadString(google::protobuf::io::CodedInputStream*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)' ../../../lib/libquery_proto.a(query.pb.cc.o): In function
muduo::Answer::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream)': /usr/local/include/google/protobuf/io/coded_stream.h:809: undefined reference togoogle::protobuf::io::CodedInputStream::ReadVarint64Fallback(unsigned long*)' ../../../lib/libquery_proto.a(query.pb.cc.o): In function
muduo::Empty::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*)': /usr/local/include/google/protobuf/io/coded_stream.h:924: undefined reference togoogle::protobuf::io::CodedInputStream::ReadTagFallback()' /usr/local/include/google/protobuf/io/coded_stream.h:799: undefined reference to
google::protobuf::io::CodedInputStream::ReadVarint32Fallback(unsigned int*)' ../../../lib/libquery_proto.a(query.pb.cc.o): In functionmuduo::Query::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*)': /usr/local/include/google/protobuf/io/coded_stream.h:924: undefined reference to
google::protobuf::io::CodedInputStream::ReadTagFallback()' ../../../lib/libquery_proto.a(query.pb.cc.o): In functionmuduo::Query::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*)': /usr/local/include/google/protobuf/repeated_field.h:905: undefined reference to
google::protobuf::internal::StringTypeHandlerBase::Newabi:cxx11' ../../../lib/libquery_proto.a(query.pb.cc.o): In functionmuduo::Query::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*)': /build/release-cpp11/examples/protobuf/codec/query.pb.cc:279: undefined reference to
google::protobuf::internal::WireFormatLite::ReadString(google::protobuf::io::CodedInputStream*, std::__cxx11::basic_string<char, std::char_traits, std::allocator >)' /build/release-cpp11/examples/protobuf/codec/query.pb.cc:279: undefined reference to google::protobuf::internal::WireFormatLite::ReadString(google::protobuf::io::CodedInputStream*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)' /build/release-cpp11/examples/protobuf/codec/query.pb.cc:262: undefined reference to
google::protobuf::internal::WireFormatLite::ReadString(google::protobuf::io::CodedInputStream, std::__cxx11::basic_string<char, std::char_traits, std::allocator >)' ../../../lib/libquery_proto.a(query.pb.cc.o): In function muduo::Query::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*)': /usr/local/include/google/protobuf/io/coded_stream.h:809: undefined reference to
google::protobuf::io::CodedInputStream::ReadVarint64Fallback(unsigned long)' ../../../lib/libquery_proto.a(query.pb.cc.o): In functionmuduo::Query::Query()': /build/release-cpp11/examples/protobuf/codec/query.pb.cc:163: undefined reference to
google::protobuf::UnknownFieldSet::UnknownFieldSet()' /build/release-cpp11/examples/protobuf/codec/query.pb.cc:163: undefined reference togoogle::protobuf::Message::~Message()' /build/release-cpp11/examples/protobuf/codec/query.pb.cc:163: undefined reference to
google::protobuf::UnknownFieldSet::~UnknownFieldSet()' ../../../lib/libquery_proto.a(query.pb.cc.o): In functionmuduo::Query::~Query()': /build/release-cpp11/examples/protobuf/codec/query.pb.cc:186: undefined reference to
google::protobuf::UnknownFieldSet::~UnknownFieldSet()' ../../../lib/libquery_proto.a(query.pb.cc.o): In functionmuduo::Query::MergeFrom(muduo::Query const&)': /usr/local/include/google/protobuf/repeated_field.h:905: undefined reference to
google::protobuf::internal::StringTypeHandlerBase::Newabi:cxx11' ../../../lib/libquery_proto.a(query.pb.cc.o): In functionmuduo::Query::Query(muduo::Query const&)': /build/release-cpp11/examples/protobuf/codec/query.pb.cc:172: undefined reference to
google::protobuf::UnknownFieldSet::UnknownFieldSet()' /build/release-cpp11/examples/protobuf/codec/query.pb.cc:172: undefined reference togoogle::protobuf::Message::~Message()' /build/release-cpp11/examples/protobuf/codec/query.pb.cc:172: undefined reference to
google::protobuf::UnknownFieldSet::~UnknownFieldSet()' ../../../lib/libquery_proto.a(query.pb.cc.o): In functionmuduo::Query::Swap(muduo::Query*)': /usr/local/include/google/protobuf/repeated_field.h:1188: undefined reference to
google::protobuf::internal::RepeatedPtrFieldBase::Swap(google::protobuf::internal::RepeatedPtrFieldBase*)' ../../../lib/libquery_proto.a(query.pb.cc.o): In functionmuduo::Answer::Answer()': /build/release-cpp11/examples/protobuf/codec/query.pb.cc:499: undefined reference to
google::protobuf::UnknownFieldSet::UnknownFieldSet()' /build/release-cpp11/examples/protobuf/codec/query.pb.cc:499: undefined reference togoogle::protobuf::Message::~Message()' /build/release-cpp11/examples/protobuf/codec/query.pb.cc:499: undefined reference to
google::protobuf::UnknownFieldSet::~UnknownFieldSet()' ../../../lib/libquery_proto.a(query.pb.cc.o): In functionmuduo::Answer::~Answer()': /build/release-cpp11/examples/protobuf/codec/query.pb.cc:523: undefined reference to
google::protobuf::UnknownFieldSet::~UnknownFieldSet()' ../../../lib/libquery_proto.a(query.pb.cc.o): In functionmuduo::Answer::MergeFrom(muduo::Answer const&)': /usr/local/include/google/protobuf/repeated_field.h:905: undefined reference to
google::protobuf::internal::StringTypeHandlerBase::Newabi:cxx11' ../../../lib/libquery_proto.a(query.pb.cc.o): In functionmuduo::Answer::Answer(muduo::Answer const&)': /build/release-cpp11/examples/protobuf/codec/query.pb.cc:508: undefined reference to
google::protobuf::UnknownFieldSet::UnknownFieldSet()' /build/release-cpp11/examples/protobuf/codec/query.pb.cc:508: undefined reference togoogle::protobuf::Message::~Message()' /build/release-cpp11/examples/protobuf/codec/query.pb.cc:508: undefined reference to
google::protobuf::UnknownFieldSet::~UnknownFieldSet()' ../../../lib/libquery_proto.a(query.pb.cc.o): In functionmuduo::Answer::Swap(muduo::Answer*)': /usr/local/include/google/protobuf/repeated_field.h:1188: undefined reference to
google::protobuf::internal::RepeatedPtrFieldBase::Swap(google::protobuf::internal::RepeatedPtrFieldBase*)' ../../../lib/libquery_proto.a(query.pb.cc.o): In functionmuduo::Empty::Empty()': /build/release-cpp11/examples/protobuf/codec/query.pb.cc:890: undefined reference to
google::protobuf::UnknownFieldSet::UnknownFieldSet()' /build/release-cpp11/examples/protobuf/codec/query.pb.cc:890: undefined reference togoogle::protobuf::Message::~Message()' ../../../lib/libquery_proto.a(query.pb.cc.o): In function
muduo::protobuf_AssignDesc_query_2eproto()': /build/release-cpp11/examples/protobuf/codec/query.pb.cc:58: undefined reference togoogle::protobuf::internal::GeneratedMessageReflection::GeneratedMessageReflection(google::protobuf::Descriptor const*, google::protobuf::Message const*, int const*, int, int, int, google::protobuf::DescriptorPool const*, google::protobuf::MessageFactory*, int)' /build/release-cpp11/examples/protobuf/codec/query.pb.cc:76: undefined reference to
google::protobuf::internal::GeneratedMessageReflection::GeneratedMessageReflection(google::protobuf::Descriptor const*, google::protobuf::Message const*, int const*, int, int, int, google::protobuf::DescriptorPool const*, google::protobuf::MessageFactory*, int)' /build/release-cpp11/examples/protobuf/codec/query.pb.cc:91: undefined reference togoogle::protobuf::internal::GeneratedMessageReflection::GeneratedMessageReflection(google::protobuf::Descriptor const*, google::protobuf::Message const*, int const*, int, int, int, google::protobuf::DescriptorPool const*, google::protobuf::MessageFactory*, int)' ../../../lib/libquery_proto.a(query.pb.cc.o): In function
muduo::Empty::Empty(muduo::Empty const&)': /build/release-cpp11/examples/protobuf/codec/query.pb.cc:899: undefined reference togoogle::protobuf::UnknownFieldSet::UnknownFieldSet()' /build/release-cpp11/examples/protobuf/codec/query.pb.cc:899: undefined reference to
google::protobuf::Message::~Message()' /build/release-cpp11/examples/protobuf/codec/query.pb.cc:899: undefined reference togoogle::protobuf::UnknownFieldSet::~UnknownFieldSet()' ../../../lib/libquery_proto.a(query.pb.cc.o): In function
muduo::Empty::~Empty()': /build/release-cpp11/examples/protobuf/codec/query.pb.cc:911: undefined reference togoogle::protobuf::Message::~Message()' ../../../lib/libquery_proto.a(query.pb.cc.o): In function
muduo::Query::~Query()': /build/release-cpp11/examples/protobuf/codec/query.pb.cc:186: undefined reference togoogle::protobuf::Message::~Message()' ../../../lib/libquery_proto.a(query.pb.cc.o): In function
muduo::Answer::~Answer()': /build/release-cpp11/examples/protobuf/codec/query.pb.cc:523: undefined reference to `google::protobuf::Message::~Message()' collect2: error: ld returned 1 exit status examples/protobuf/codec/CMakeFiles/protobuf_dispatcher_lite_test.dir/build.make:95: recipe for target 'bin/protobuf_dispatcher_lite_test' failed make[2]: *** [bin/protobuf_dispatcher_lite_test] Error 1 CMakeFiles/Makefile2:6142: recipe for target 'examples/protobuf/codec/CMakeFiles/protobuf_dispatcher_lite_test.dir/all' failed make[1]: *** [examples/protobuf/codec/CMakeFiles/protobuf_dispatcher_lite_test.dir/all] Error 2 make[1]: *** Waiting for unfinished jobs.... [ 23%] Building CXX object muduo/net/CMakeFiles/muduo_net.dir/Poller.cc.o [ 23%] Building CXX object muduo/net/CMakeFiles/muduo_net.dir/poller/DefaultPoller.cc.o [ 24%] Building CXX object muduo/net/CMakeFiles/muduo_net.dir/poller/EPollPoller.cc.o [ 24%] Building CXX object muduo/net/CMakeFiles/muduo_net.dir/poller/PollPoller.cc.o [ 24%] Building CXX object muduo/net/CMakeFiles/muduo_net.dir/Socket.cc.o [ 24%] Building CXX object muduo/net/CMakeFiles/muduo_net.dir/SocketsOps.cc.o [ 25%] Building CXX object muduo/net/CMakeFiles/muduo_net.dir/TcpClient.cc.o [ 25%] Building CXX object muduo/net/CMakeFiles/muduo_net.dir/TcpConnection.cc.o [ 25%] Building CXX object muduo/net/CMakeFiles/muduo_net.dir/TcpServer.cc.o [ 25%] Building CXX object muduo/net/CMakeFiles/muduo_net.dir/Timer.cc.o [ 26%] Building CXX object muduo/net/CMakeFiles/muduo_net.dir/TimerQueue.cc.o [ 26%] Linking CXX static library ../../lib/libmuduo_net.a [ 26%] Built target muduo_net Makefile:140: recipe for target 'all' failed make: *** [all] Error 2
Muduo failed to build with bazel because we missed to declare boost dependencies in several targets. This MR would help to fix these issues.
Adds CIFuzz to muduo's OSS-fuzz integration. In short, CIFuzz is a service offered by OSS-fuzz to run muduo's fuzzers during the CI to prevent bugs from being introduced. In this PR the fuzz time is set to 600 seconds but can be changed.
More about CIFuzz can be found here: https://google.github.io/oss-fuzz/getting-started/continuous-integration/
v2.0.2(Jun 30, 2020)
v2.0.1(Jun 30, 2020)
v2.0.0(Oct 25, 2018)
v2.0.0-rc(Oct 24, 2018)
v1.1.1(Oct 22, 2018)
v2.0.0-beta(Jan 18, 2018)
First release of C++11 version of muduo.