diff --git a/headers/os/net/NetworkRequest.h b/headers/os/net/NetworkRequest.h index 8684f248b1..7158dab182 100644 --- a/headers/os/net/NetworkRequest.h +++ b/headers/os/net/NetworkRequest.h @@ -22,9 +22,13 @@ public: BUrlContext* context, const char* threadName, const char* protocolName); + + virtual status_t Stop(); + protected: bool _ResolveHostName(uint16_t port); + void _ProtocolSetup(); status_t _GetLine(BString& destString); protected: diff --git a/headers/os/net/UrlRequest.h b/headers/os/net/UrlRequest.h index 206b2126ec..64a0e7d663 100644 --- a/headers/os/net/UrlRequest.h +++ b/headers/os/net/UrlRequest.h @@ -48,6 +48,7 @@ public: protected: static int32 _ThreadEntry(void* arg); + virtual void _ProtocolSetup() {}; virtual status_t _ProtocolLoop() = 0; virtual void _EmitDebug(BUrlProtocolDebugMessage type, const char* format, ...); diff --git a/src/kits/network/libnetapi/GopherRequest.cpp b/src/kits/network/libnetapi/GopherRequest.cpp index 9d0f15b29c..3092adf5ab 100644 --- a/src/kits/network/libnetapi/GopherRequest.cpp +++ b/src/kits/network/libnetapi/GopherRequest.cpp @@ -219,7 +219,7 @@ BGopherRequest::Stop() fSocket->Disconnect(); // Unlock any pending connect, read or write operation. } - return BUrlRequest::Stop(); + return BNetworkRequest::Stop(); } diff --git a/src/kits/network/libnetapi/HttpRequest.cpp b/src/kits/network/libnetapi/HttpRequest.cpp index e45614552b..8e065c0079 100644 --- a/src/kits/network/libnetapi/HttpRequest.cpp +++ b/src/kits/network/libnetapi/HttpRequest.cpp @@ -278,7 +278,7 @@ BHttpRequest::Stop() fSocket->Disconnect(); // Unlock any pending connect, read or write operation. } - return BUrlRequest::Stop(); + return BNetworkRequest::Stop(); } diff --git a/src/kits/network/libnetapi/NetworkRequest.cpp b/src/kits/network/libnetapi/NetworkRequest.cpp index 3c7a6fd323..43e64b0011 100644 --- a/src/kits/network/libnetapi/NetworkRequest.cpp +++ b/src/kits/network/libnetapi/NetworkRequest.cpp @@ -21,6 +21,20 @@ BNetworkRequest::BNetworkRequest(const BUrl& url, BUrlProtocolListener* listener } +status_t +BNetworkRequest::Stop() +{ + status_t threadStatus = BUrlRequest::Stop(); + + if (threadStatus != B_OK) + return threadStatus; + + send_signal(fThreadId, SIGUSR1); // unblock blocking syscalls. + wait_for_thread(fThreadId, &threadStatus); + return threadStatus; +} + + bool BNetworkRequest::_ResolveHostName(uint16_t port) { @@ -48,6 +62,27 @@ BNetworkRequest::_ResolveHostName(uint16_t port) } +static void +empty(int) +{ +} + + +void +BNetworkRequest::_ProtocolSetup() +{ + // Setup an (empty) signal handler so we can be stopped by a signal, + // without the whole process being killed. + // TODO make connect() properly unlock when close() is called on the + // socket, and remove this. + struct sigaction action; + action.sa_handler = empty; + action.sa_mask = 0; + action.sa_flags = 0; + sigaction(SIGUSR1, &action, NULL); +} + + status_t BNetworkRequest::_GetLine(BString& destString) { diff --git a/src/kits/network/libnetapi/UrlRequest.cpp b/src/kits/network/libnetapi/UrlRequest.cpp index 7e467793ef..51dc7a0f46 100644 --- a/src/kits/network/libnetapi/UrlRequest.cpp +++ b/src/kits/network/libnetapi/UrlRequest.cpp @@ -87,12 +87,8 @@ BUrlRequest::Stop() if (!fRunning) return B_ERROR; - status_t threadStatus = B_OK; fQuit = true; - - send_signal(fThreadId, SIGUSR1); // unblock blocking syscalls. - wait_for_thread(fThreadId, &threadStatus); - return threadStatus; + return B_OK; } @@ -184,27 +180,12 @@ BUrlRequest::Status() const // #pragma mark Thread management -static void -empty(int) -{ -} - - /*static*/ int32 BUrlRequest::_ThreadEntry(void* arg) { - // Setup an (empty) signal handler so we can be stopped by a signal, - // without the whole process being killed. - // TODO make connect() properly unlock when close() is called on the - // socket, and remove this. - struct sigaction action; - action.sa_handler = empty; - action.sa_mask = 0; - action.sa_flags = 0; - sigaction(SIGUSR1, &action, NULL); - BUrlRequest* request = reinterpret_cast(arg); request->fThreadStatus = B_BUSY; + request->_ProtocolSetup(); status_t protocolLoopExitStatus = request->_ProtocolLoop();