From 07019b51614118003dea3d535b369b411ca31280 Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Thu, 5 Oct 2017 23:02:38 +0200 Subject: [PATCH] auth: Use std::thread instead of pthread in the signing pipe --- pdns/signingpipe.cc | 99 +++++++-------------------------------------- pdns/signingpipe.hh | 12 +++--- 2 files changed, 20 insertions(+), 91 deletions(-) diff --git a/pdns/signingpipe.cc b/pdns/signingpipe.cc index 6cd81097d..ffe5b2996 100644 --- a/pdns/signingpipe.cc +++ b/pdns/signingpipe.cc @@ -45,34 +45,19 @@ int readn(int fd, void* buffer, unsigned int len) } } - -// used to pass information to the new thread -struct StartHelperStruct -{ - StartHelperStruct(ChunkedSigningPipe* csp, int id, int fd) : d_csp(csp), d_id(id), d_fd(fd){} - ChunkedSigningPipe* d_csp; - int d_id; - int d_fd; -}; - -// used to launch the new thread -void* ChunkedSigningPipe::helperWorker(void* p) -try -{ - StartHelperStruct shs=*(StartHelperStruct*)p; - delete (StartHelperStruct*)p; - - shs.d_csp->worker(shs.d_id, shs.d_fd); - return 0; +void* ChunkedSigningPipe::helperWorker(ChunkedSigningPipe* csp, int fd) +try { + csp->worker(fd); + return nullptr; } catch(...) { L<()); // load an empty chunk @@ -87,7 +72,7 @@ ChunkedSigningPipe::ChunkedSigningPipe(const DNSName& signerName, bool mustSign, throw runtime_error("Unable to create communication socket in for ChunkedSigningPipe"); setCloseOnExec(fds[0]); setCloseOnExec(fds[1]); - pthread_create(&d_tids[n], 0, helperWorker, (void*) new StartHelperStruct(this, n, fds[1])); + d_threads[n] = std::thread(helperWorker, this, fds[1]); setNonBlocking(fds[0]); d_sockets.push_back(fds[0]); } @@ -96,15 +81,16 @@ ChunkedSigningPipe::ChunkedSigningPipe(const DNSName& signerName, bool mustSign, ChunkedSigningPipe::~ChunkedSigningPipe() { delete d_rrsetToSign; + if(!d_mustSign) return; + for(int fd : d_sockets) { close(fd); // this will trigger all threads to exit } - - void* res; - for(pthread_t& tid : d_tids) { - pthread_join(tid, &res); + + for(auto& thread : d_threads) { + thread.join(); } //cout<<"Did: "< ChunkedSigningPipe::getChunk(bool final) return front; } -#if 0 - - ServiceTuple st; - ComboAddress remote; - if(!servers.empty()) { - st.port=2000; - parseService(servers, st); - remote=ComboAddress(st.host, st.port); - } - - /// - if(!servers.empty()) { - fds[0] = socket(AF_INET, SOCK_STREAM, 0); - fds[1] = -1; - - if(connect(fds[0], (struct sockaddr*)&remote, remote.getSocklen()) < 0) - unixDie("Connecting to signing server"); - } - else { -///// - signal(SIGCHLD, SIG_IGN); - if(!fork()) { // child - dup2(fds[1], 0); - execl("./pdnsutil", "./pdnsutil", "--config-dir=./", "signing-slave", NULL); - // helperWorker(new StartHelperStruct(this, n)); - return; - } - else - close(fds[1]); -#endif - -#if 0 -bool readLStringFromSocket(int fd, string& msg) -{ - msg.clear(); - uint32_t len; - if(!readn(fd, &len, sizeof(len))) - return false; - - len = ntohl(len); - - scoped_array buf(new char[len]); - readn(fd, buf.get(), len); - - msg.assign(buf.get(), len); - return true; -} -void writeLStringToSocket(int fd, const string& msg) -{ - string realmsg; - uint32_t len = htonl(msg.length()); - string tot((char*)&len, 4); - tot+=msg; - - writen2(fd, tot.c_str(), tot.length()); -} - -#endif diff --git a/pdns/signingpipe.hh b/pdns/signingpipe.hh index 50c8c93e5..7bea5c269 100644 --- a/pdns/signingpipe.hh +++ b/pdns/signingpipe.hh @@ -21,9 +21,10 @@ */ #ifndef PDNS_SIGNINGPIPE #define PDNS_SIGNINGPIPE -#include -#include #include +#include +#include + #include "dnsseckeeper.hh" #include "dns.hh" @@ -56,9 +57,8 @@ private: void addSignedToChunks(chunk_t* signedChunk); pair, vector > waitForRW(bool rd, bool wr, int seconds); - void worker(int n, int fd); - - static void* helperWorker(void* p); + static void* helperWorker(ChunkedSigningPipe* csp, int fd); + void worker(int fd); unsigned int d_numworkers; int d_submitted; @@ -71,7 +71,7 @@ private: std::vector d_sockets; std::set d_eof; - vector d_tids; + vector d_threads; bool d_mustSign; bool d_final; }; -- 2.40.0