1
0
mirror of https://github.com/wfjm/w11.git synced 2026-01-14 07:50:08 +00:00

use std::thread instead of boost; final boost cleanup

- no boost:: classes used anymore
- no boost/*.hpp headers included anymore
- significantly improved compilation speed
This commit is contained in:
wfjm 2018-12-19 11:53:54 +01:00
parent dcaf39ff84
commit 4e2f1c3d19
16 changed files with 71 additions and 70 deletions

View File

@ -31,6 +31,8 @@ The full set of tests is only run for tagged releases.
- the Coverity results triggered a general backend code review
- fix coverity detected defects
- get backend code `-Wall -Wextra -Wpedantic` clean
- exploit c++11 language constructs (e.g. emplace,lambda,auto,move,...)
- completely replace boost with std
- add KW11-P (programmable clock) to all w11 systems. It is usefull in test
benches (fast interrupt source) and enables on the long run to port the
2.10BSD kernel profiling code to 2.11BSD.
@ -102,11 +104,12 @@ The full set of tests is only run for tagged releases.
- use auto, emplace() and range loops
- use unique_ptr instead of free pointers, avoid explicit `delete`
- add and use move semantic in RlinkCommandExpect
- replace boost with std
- completely replace boost with std
- use std::unique_ptr instead of boost::scoped_ptr
- use std::shared_ptr instead of boost
- use std::function instead of boost
- use std::bind or in most cases a lambda instead of boost::bind
- use std::bind or in most cases a lambda, instead of boost::bind
- use std::thread instead of boost
- use mutex and friends from std:: instead from boost::
- use std::mutex
- use std::recursive_mutex

View File

@ -57,9 +57,6 @@ distributions should be straight forward.
- building and using the rlink backend software requires:
- full C/C++ development chain (gcc,g++,cpp,make)
-> package: `build-essential`
- Boost C++ library (>= 1.40), with date-time, thread, and regex
-> package: `libboost-dev` `libboost-date-time-dev` `libboost-thread-dev`
`libboost-regex-dev`
- libusb 1.0 (>= 1.0.6)
-> package: `libusb-1.0-0-dev`
- Perl (>= 5.10) (usually included in base installations)
@ -108,8 +105,9 @@ For bash and alike use
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$RETROBASE/tools/lib
export MANPATH=$MANPATH:$RETROBASE/tools/man
In most cases the boost library version coming with the distribution will
work, similar for Tcl, in those cases simply use
Boost was essential in the pre-c++11 times, but has been completely replaced
by std:: classes provided by c++11. In most cases the Tcl version coming with
the distribution will work, in those cases simply use
export TCLINC=/usr/include/tcl8.6
export TCLLIBNAME=tcl8.6
@ -147,7 +145,6 @@ A C++ compiler with full `c++11` support is therefore needed, so either
Required tools and libraries:
g++ >= 4.8.1 (see c++11 usage above)
boost >= 1.35 (boost::thread api changed, new one is used)
libusb >= 1.0.5 (timerfd support)
Build was tested under:

View File

@ -1,4 +1,4 @@
// $Id: RlinkPortCuff.cpp 1081 2018-12-14 22:29:42Z mueller $
// $Id: RlinkPortCuff.cpp 1088 2018-12-17 17:37:00Z mueller $
//
// Copyright 2012-2018 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@ -13,6 +13,7 @@
//
// Revision History:
// Date Rev Version Comment
// 2018-12-17 1088 1.1.9 use std::thread instead of boost
// 2018-12-14 1081 1.1.8 use std::bind instead of boost
// 2018-11-09 1066 1.1.7 use auto
// 2018-10-27 1059 1.1.6 coverity fixup (uncaught exception in dtor)
@ -244,7 +245,7 @@ bool RlinkPortCuff::Open(const std::string& url, RerrMsg& emsg)
libusb_set_pollfd_notifiers(fpUsbContext, ThunkPollfdAdd,
ThunkPollfdRemove, this);
fDriverThread = boost::thread(std::bind(&RlinkPortCuff::Driver, this));
fDriverThread = thread([this](){ Driver(); });
fIsOpen = true;
@ -275,13 +276,7 @@ void RlinkPortCuff::Cleanup()
CloseFd(fFdWrite);
// wait till driver thread terminates
// use timed join, throw in case driver doesn't stop
if (fDriverThread.get_id() != boost::thread::id()) {
if (!fDriverThread.timed_join(boost::posix_time::milliseconds(500))) {
throw Rexception("RlinkPortCuff::Cleanup()",
"driver thread failed to stop");
}
}
if (fDriverThread.joinable()) fDriverThread.join();
// cleanup pipes
CloseFd(fFdRead);
@ -332,7 +327,7 @@ bool RlinkPortCuff::OpenPipe(int& fdread, int& fdwrite, RerrMsg& emsg)
//------------------------------------------+-----------------------------------
//! FIXME_docs
// executed in separate boost thread !!
// executed in separate thread !!
void RlinkPortCuff::Driver()
{
try {

View File

@ -1,4 +1,4 @@
// $Id: RlinkPortCuff.hpp 1060 2018-10-27 11:32:39Z mueller $
// $Id: RlinkPortCuff.hpp 1088 2018-12-17 17:37:00Z mueller $
//
// Copyright 2012-2018 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@ -13,6 +13,7 @@
//
// Revision History:
// Date Rev Version Comment
// 2018-12-17 1088 1.0.2 use std::thread instead of boost
// 2013-01-02 467 1.0.1 get cleanup code right; add USBErrorName()
// 2012-12-26 465 1.0 Initial version
// ---------------------------------------------------------------------------
@ -33,8 +34,7 @@
#include <vector>
#include <deque>
#include "boost/thread/thread.hpp"
#include <thread>
namespace Retro {
@ -72,7 +72,7 @@ namespace Retro {
protected:
int fFdReadDriver; //!< fd for read (driver end)
int fFdWriteDriver; //!< fd for write (driver end)
boost::thread fDriverThread; //!< driver thread
std::thread fDriverThread; //!< driver thread
libusb_context* fpUsbContext;
libusb_device** fpUsbDevList;
ssize_t fUsbDevCount;

View File

@ -1,4 +1,4 @@
// $Id: RlinkServer.cpp 1085 2018-12-16 14:11:16Z mueller $
// $Id: RlinkServer.cpp 1088 2018-12-17 17:37:00Z mueller $
//
// Copyright 2013-2018 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@ -13,7 +13,7 @@
//
// Revision History:
// Date Rev Version Comment
// 2018-12-17 1085 1.2.8 use std::lock_guard instead of boost
// 2018-12-17 1088 2.2.8 use std::lock_guard, std::thread instead of boost
// 2018-12-15 1083 2.2.7 for std::function setups: use rval ref and move
// 2018-12-14 1081 2.2.6 use std::bind instead of boost
// 2018-12-07 1078 2.2.5 use std::shared_ptr instead of boost
@ -36,6 +36,8 @@
\brief Implemenation of RlinkServer.
*/
#include <unistd.h>
#include "librtools/Rexception.hpp"
#include "librtools/RosFill.hpp"
#include "librtools/RosPrintf.hpp"
@ -188,7 +190,7 @@ void RlinkServer::GetAttnInfo(AttnArgs& args)
//! FIXME_docs
void RlinkServer::RemoveAttnHandler(uint16_t mask, void* cdata)
{
{
lock_guard<RlinkConnect> lock(*fspConn);
AttnId id(mask, cdata);
@ -269,7 +271,8 @@ void RlinkServer::Start()
//! FIXME_docs
void RlinkServer::Stop()
{
{
if (!IsActive()) return;
fELoop.Stop();
Wakeup();
fServerThread.join();
@ -280,7 +283,7 @@ void RlinkServer::Stop()
//! FIXME_docs
void RlinkServer::Resume()
{
{
StartOrResume(true);
return;
}
@ -289,9 +292,9 @@ void RlinkServer::Resume()
//! FIXME_docs
void RlinkServer::Wakeup()
{
{
uint64_t one(1);
int irc = write(fWakeupEvent, &one, sizeof(one));
int irc = ::write(fWakeupEvent, &one, sizeof(one));
if (irc < 0)
throw Rexception("RlinkServer::Wakeup()",
"write() to eventfd failed: ", errno);
@ -302,7 +305,7 @@ void RlinkServer::Wakeup()
//! FIXME_docs
void RlinkServer::SignalAttnNotify(uint16_t apat)
{
{
// only called under lock !!
if (apat & fAttnNotiPatt) {
RlogMsg lmsg(LogFile(), 'W');
@ -322,8 +325,8 @@ void RlinkServer::SignalAttnNotify(uint16_t apat)
*/
bool RlinkServer::IsActive() const
{
return fServerThread.get_id() != boost::thread::id();
{
return fServerThread.joinable();
}
//------------------------------------------+-----------------------------------
@ -334,7 +337,7 @@ bool RlinkServer::IsActive() const
bool RlinkServer::IsActiveInside() const
{
return IsActive() && boost::this_thread::get_id() == fServerThread.get_id();
return IsActive() && this_thread::get_id() == fServerThread.get_id();
}
//------------------------------------------+-----------------------------------
@ -346,7 +349,7 @@ bool RlinkServer::IsActiveInside() const
bool RlinkServer::IsActiveOutside() const
{
return IsActive() && boost::this_thread::get_id() != fServerThread.get_id();
return IsActive() && this_thread::get_id() != fServerThread.get_id();
}
//------------------------------------------+-----------------------------------
@ -421,8 +424,7 @@ void RlinkServer::StartOrResume(bool resume)
// and start server thread
fELoop.UnStop();
fServerThread = boost::thread(std::bind(&RlinkServerEventLoop::EventLoop,
&fELoop));
fServerThread = thread([this](){ fELoop.EventLoop(); });
if (resume) {
RerrMsg emsg;
@ -557,7 +559,7 @@ int RlinkServer::WakeupHandler(const pollfd& pfd)
if (pfd.revents & (~pfd.events)) return -1;
uint64_t buf;
int irc = read(fWakeupEvent, &buf, sizeof(buf));
int irc = ::read(fWakeupEvent, &buf, sizeof(buf));
if (irc < 0)
throw Rexception("RlinkServer::WakeupHandler()",
"read() from eventfd failed: ", errno);

View File

@ -1,4 +1,4 @@
// $Id: RlinkServer.hpp 1084 2018-12-16 12:23:53Z mueller $
// $Id: RlinkServer.hpp 1088 2018-12-17 17:37:00Z mueller $
//
// Copyright 2013-2018 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@ -13,6 +13,7 @@
//
// Revision History:
// Date Rev Version Comment
// 2018-12-17 1088 2.2.6 use std::thread instead of boost
// 2018-12-16 1084 2.2.5 use =delete for noncopyable instead of boost
// 2018-12-15 1083 2.2.4 for std::function setups: use rval ref and move
// 2018-12-14 1081 2.2.3 use std::function instead of boost
@ -42,8 +43,7 @@
#include <list>
#include <memory>
#include <functional>
#include "boost/thread/thread.hpp"
#include <thread>
#include "librtools/Rstats.hpp"
@ -179,7 +179,7 @@ namespace Retro {
std::list<actnhdl_t> fActnList;
ReventFd fWakeupEvent;
RlinkServerEventLoop fELoop;
boost::thread fServerThread;
std::thread fServerThread;
uint16_t fAttnPatt; //!< current attn pattern
uint16_t fAttnNotiPatt; //!< attn notifier pattern
uint32_t fTraceLevel; //!< trace level

View File

@ -1,4 +1,4 @@
// $Id: RtclAttnShuttle.cpp 1082 2018-12-15 13:56:20Z mueller $
// $Id: RtclAttnShuttle.cpp 1088 2018-12-17 17:37:00Z mueller $
//
// Copyright 2013-2018 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@ -28,6 +28,7 @@
\brief Implemenation of class RtclAttnShuttle.
*/
#include <unistd.h>
#include <errno.h>
#include "librtools/Rexception.hpp"

View File

@ -1,4 +1,4 @@
// $Id: RtclRlinkServer.cpp 1087 2018-12-17 08:25:37Z mueller $
// $Id: RtclRlinkServer.cpp 1088 2018-12-17 17:37:00Z mueller $
//
// Copyright 2013-2018 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@ -140,11 +140,13 @@ int RtclRlinkServer::M_server(RtclArgs& args)
if (args.NextOpt(opt, optset)) {
if (opt == "-start") { // server -start
if (!args.AllDone()) return kERR;
if (Obj().IsActive()) return args.Quit("-E: server already running");
Obj().Start();
} else if (opt == "-stop") { // server -stop
if (!args.AllDone()) return kERR;
Obj().Stop();
} else if (opt == "-resume") { // server -resume
if (Obj().IsActive()) return args.Quit("-E: server already running");
if (!args.AllDone()) return kERR;
Obj().Resume();
} else if (opt == "-test") { // server -test

View File

@ -1,4 +1,4 @@
// $Id: RtclGetBase.hpp 983 2018-01-02 20:35:59Z mueller $
// $Id: RtclGetBase.hpp 1088 2018-12-17 17:37:00Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@ -29,8 +29,6 @@
#include <cstdint>
#include <string>
#include "boost/function.hpp"
namespace Retro {
class RtclGetBase {

View File

@ -1,4 +1,4 @@
// $Id: RtclGetList.hpp 1084 2018-12-16 12:23:53Z mueller $
// $Id: RtclGetList.hpp 1088 2018-12-17 17:37:00Z mueller $
//
// Copyright 2013-2018 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@ -34,6 +34,7 @@
#include <cstdint>
#include <string>
#include <map>
#include <memory>
#include <functional>
#include "RtclGet.hpp"

View File

@ -1,4 +1,4 @@
// $Id: RtclSetBase.hpp 983 2018-01-02 20:35:59Z mueller $
// $Id: RtclSetBase.hpp 1088 2018-12-17 17:37:00Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@ -29,8 +29,6 @@
#include <cstdint>
#include <string>
#include "boost/function.hpp"
#include "RtclArgs.hpp"
namespace Retro {

View File

@ -1,4 +1,4 @@
// $Id: RtclSetList.hpp 1084 2018-12-16 12:23:53Z mueller $
// $Id: RtclSetList.hpp 1088 2018-12-17 17:37:00Z mueller $
//
// Copyright 2013-2018 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@ -34,6 +34,7 @@
#include <cstdint>
#include <string>
#include <map>
#include <memory>
#include <functional>
#include "RtclSet.hpp"

View File

@ -1,4 +1,4 @@
// $Id: Rtools.cpp 1063 2018-10-29 18:37:42Z mueller $
// $Id: Rtools.cpp 1088 2018-12-17 17:37:00Z mueller $
//
// Copyright 2011-2018 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@ -186,7 +186,7 @@ void Catch2Cerr(const char* msg, std::function<void()> func)
<< " caught and dropped in " << msg << endl;
} catch (exception& e) {
cerr << "Catch2Cerr-E: exception '" << e.what()
<< " caught and dropped in " << msg << endl;
<< "' caught and dropped in " << msg << endl;
} catch(...) {
cerr << "Catch2Cerr-E: non std::exception"
<< " caught and dropped in " << msg << endl;

View File

@ -1,4 +1,4 @@
// $Id: Rw11Cpu.cpp 1085 2018-12-16 14:11:16Z mueller $
// $Id: Rw11Cpu.cpp 1088 2018-12-17 17:37:00Z mueller $
//
// Copyright 2013-2018 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@ -48,6 +48,7 @@
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <vector>
#include <map>
@ -573,7 +574,7 @@ bool Rw11Cpu::LoadAbs(const std::string& fname, RerrMsg& emsg, bool trace)
while (go) {
uint8_t byte;
int irc = read(fd, &byte, 1);
int irc = ::read(fd, &byte, 1);
if (irc == 0) {
if (state == s_chr0) {
ok = true;
@ -701,7 +702,7 @@ bool Rw11Cpu::LoadAbs(const std::string& fname, RerrMsg& emsg, bool trace)
} // switch(state)
} // while(go)
close(fd);
::close(fd);
return ok;
}

View File

@ -1,4 +1,4 @@
// $Id: Rw11VirtEthTap.cpp 1082 2018-12-15 13:56:20Z mueller $
// $Id: Rw11VirtEthTap.cpp 1088 2018-12-17 17:37:00Z mueller $
//
// Copyright 2014-2018 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@ -31,6 +31,7 @@
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <sys/ioctl.h>
#include <net/if.h>

View File

@ -1,4 +1,4 @@
// $Id: Rw11VirtTermTcp.cpp 1082 2018-12-15 13:56:20Z mueller $
// $Id: Rw11VirtTermTcp.cpp 1088 2018-12-17 17:37:00Z mueller $
//
// Copyright 2013-2018 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@ -35,6 +35,7 @@
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
#include <sstream>
@ -152,7 +153,7 @@ bool Rw11VirtTermTcp::Open(const std::string& url, RerrMsg& emsg)
int on = 1;
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) {
emsg.InitErrno("Rw11VirtTermTcp::Open","setsockop() failed: ", errno);
close(fd);
::close(fd);
return false;
}
@ -164,13 +165,13 @@ bool Rw11VirtTermTcp::Open(const std::string& url, RerrMsg& emsg)
// Note: ::bind needed below to avoid collision with std::bind...
if (::bind(fd, (sockaddr*) &sa, sizeof(sa)) < 0) {
emsg.InitErrno("Rw11VirtTermTcp::Open","bind() failed: ", errno);
close(fd);
::close(fd);
return false;
}
if (listen(fd, 1) <0) {
emsg.InitErrno("Rw11VirtTermTcp::Open","listen() failed: ", errno);
close(fd);
::close(fd);
return false;
}
@ -219,7 +220,7 @@ bool Rw11VirtTermTcp::Snd(const uint8_t* data, size_t count, RerrMsg& /*emsg*/)
*pobuf++ = *pdata++;
}
int irc = write(fFd, obuf, pobuf-obuf);
int irc = ::write(fFd, obuf, pobuf-obuf);
if (irc < 0) {
RlogMsg lmsg(LogFile(),'E');
RerrMsg emsg("Rw11VirtTermTcp::Snd",
@ -295,11 +296,11 @@ int Rw11VirtTermTcp::ListenPollHandler(const pollfd& pfd)
int nerr = 0;
// send initial negotiation WILLs and DOs
if (write(fFd, buf_1, sizeof(buf_1)) < 0) nerr += 1;
if (write(fFd, buf_2, sizeof(buf_2)) < 0) nerr += 1;
if (write(fFd, buf_3, sizeof(buf_3)) < 0) nerr += 1;
if (write(fFd, buf_4, sizeof(buf_4)) < 0) nerr += 1;
if (write(fFd, buf_5, sizeof(buf_5)) < 0) nerr += 1;
if (::write(fFd, buf_1, sizeof(buf_1)) < 0) nerr += 1;
if (::write(fFd, buf_2, sizeof(buf_2)) < 0) nerr += 1;
if (::write(fFd, buf_3, sizeof(buf_3)) < 0) nerr += 1;
if (::write(fFd, buf_4, sizeof(buf_4)) < 0) nerr += 1;
if (::write(fFd, buf_5, sizeof(buf_5)) < 0) nerr += 1;
// send connect message
if (nerr==0) {
@ -322,7 +323,7 @@ int Rw11VirtTermTcp::ListenPollHandler(const pollfd& pfd)
}
if (nerr) {
close(fFd);
::close(fFd);
fFd = -1;
RlogMsg lmsg(LogFile(),'E');
RerrMsg emsg("Rw11VirtTermTcp::ListenPollHandler",
@ -360,7 +361,7 @@ int Rw11VirtTermTcp::RcvPollHandler(const pollfd& pfd)
uint8_t obuf[1024];
uint8_t* pobuf = obuf;
irc = read(fFd, ibuf, 1024);
irc = ::read(fFd, ibuf, 1024);
if (irc < 0 && (errno == EAGAIN || errno == EWOULDBLOCK)) return 0;
@ -425,7 +426,7 @@ int Rw11VirtTermTcp::RcvPollHandler(const pollfd& pfd)
RlogMsg lmsg(LogFile(),'I');
lmsg << "TermTcp: close on " << fChannelId << " for " << Unit().Name();
}
close(fFd);
::close(fFd);
fFd = -1;
Server().AddPollHandler([this](const pollfd& pfd)
{ return ListenPollHandler(pfd); },