From 0ab87296f3626007ad27fd1a59cf9abff6e9482b Mon Sep 17 00:00:00 2001 From: Pixel Date: Fri, 13 Nov 2009 18:18:48 -0800 Subject: BigClean: adding a round of thread netsafes. --- include/Action.h | 2 +- include/Domain.h | 2 ++ include/MailServer.h | 2 ++ lib/Action.cc | 1 + lib/Buffer.cc | 7 ++++--- lib/Domain.cc | 11 ++++++++++- lib/Handle.cc | 7 ++++--- lib/MailServer.cc | 13 ++++++++++++- lib/Output.cc | 5 +++-- 9 files changed, 39 insertions(+), 11 deletions(-) diff --git a/include/Action.h b/include/Action.h index ad71566..2d0e3c0 100644 --- a/include/Action.h +++ b/include/Action.h @@ -77,7 +77,7 @@ class Action : public Base { String URL; bool hastoclean, accessed; HtmlSkinner * skin; - iLock lock; + static iLock lock; }; #endif diff --git a/include/Domain.h b/include/Domain.h index 9cd8483..7276ade 100644 --- a/include/Domain.h +++ b/include/Domain.h @@ -22,6 +22,7 @@ #include #include +#include class Domain : public Base { public: @@ -38,6 +39,7 @@ class Domain : public Base { static Domain * head; Domain * next, * prev; Regex pattern; + static iLock lock; }; #endif diff --git a/include/MailServer.h b/include/MailServer.h index f3444b6..e931671 100644 --- a/include/MailServer.h +++ b/include/MailServer.h @@ -27,6 +27,7 @@ #include #include #include +#include class MailHandler : public Base { public: @@ -38,6 +39,7 @@ class MailHandler : public Base { private: static MailHandler * head; MailHandler * next, * prev; + static iLock lock; }; class MailServer : public Task { diff --git a/lib/Action.cc b/lib/Action.cc index 7cffc70..dbd6d05 100644 --- a/lib/Action.cc +++ b/lib/Action.cc @@ -25,6 +25,7 @@ #include "HttpServ.h" Action * Action::start = 0; +iLock Action::lock; static int counter = 0; static HtmlSkinner default_skinner; diff --git a/lib/Buffer.cc b/lib/Buffer.cc index 447f883..eb97e4d 100644 --- a/lib/Buffer.cc +++ b/lib/Buffer.cc @@ -23,6 +23,7 @@ #endif #include "Buffer.h" #include "generic.h" +#include "Atomic.h" int Buffer::nb_buffer = 0; @@ -31,18 +32,18 @@ int Buffer::GetNbBuffer() { } Buffer::Buffer(bool _seekable) : Handle(-1), buffer(0), zero(0), realsiz(0), bufsiz(0), ptr(0), wptr(0), seekable(_seekable), got_eof(false) { - nb_buffer++; + Atomic::Increment(&nb_buffer); } Buffer::~Buffer() { free(buffer); - nb_buffer--; + Atomic::Decrement(&nb_buffer); } Buffer::Buffer(const Buffer & b) : Handle(-1), buffer(0), zero(b.zero), realsiz(b.realsiz), bufsiz(b.bufsiz), ptr(b.ptr), wptr(b.wptr), seekable(b.seekable), got_eof(b.got_eof) { buffer = (Byte *) malloc(bufsiz); memcpy(buffer, b.buffer, bufsiz); - nb_buffer++; + Atomic::Increment(&nb_buffer); } ssize_t Buffer::write(const void *buf, size_t count) throw (GeneralException) { diff --git a/lib/Domain.cc b/lib/Domain.cc index 6114e90..c7af1f1 100644 --- a/lib/Domain.cc +++ b/lib/Domain.cc @@ -20,6 +20,7 @@ #include "Domain.h" Domain * Domain::head = 0; +iLock Domain::lock; Domain * Domain::First() { return head; @@ -36,22 +37,27 @@ String Domain::GetPattern() { Domain::Domain(const Regex & _pattern) : pattern(_pattern) { printm(M_INFO, "Creating Domain with pattern = " + pattern.GetPattern() + "\n"); prev = 0; + lock.lock(); next = head; head = this; if (next) next->prev = this; + lock.unlock(); } Domain::~Domain() { + lock.lock(); if (head == this) head = next; if (next) next->prev = prev; if (prev) prev->next = next; + lock.unlock(); } void Domain::OnTop() { + lock.lock(); if (next) next->prev = prev; if (prev) @@ -61,13 +67,16 @@ void Domain::OnTop() { next = head; head = this; next->prev = this; + lock.unlock(); } Domain * Domain::find_domain(const String & url, int nmatches, regmatch_t * pmatches) { Domain * r = 0; + lock.lock(); if (head) r = head->find_domain_r(url, nmatches, pmatches); + lock.unlock(); return r; } @@ -77,7 +86,7 @@ Domain * Domain::find_domain_r(const String & url, int nmatches, regmatch_t * pm return this; if (next) - return next->find_domain_r(url); + return next->find_domain_r(url, nmatches, pmatches); return 0; } diff --git a/lib/Handle.cc b/lib/Handle.cc index efe2e15..81c72e7 100644 --- a/lib/Handle.cc +++ b/lib/Handle.cc @@ -56,6 +56,7 @@ inline Uint32 bswap_32(Uint32 w) { #endif #include "Handle.h" +#include "Atomic.h" #include "gettext.h" enum { @@ -73,7 +74,7 @@ Handle::Handle(const Handle & nh) : itell(0), hFile(0), h(nh.h >= 0 ? nh.ndup() if ((h >= 0) && (nh.z)) { SetZ(nh.z); } - nb_handles++; + Atomic::Increment(&nb_handles); } Handle::~Handle() { @@ -81,7 +82,7 @@ Handle::~Handle() { printm(M_INFO, String(_("Destroying handle ")) + h + "\n"); #endif close(); - nb_handles--; + Atomic::Decrement(&nb_handles); } Handle::Handle(int nh) : itell(0), h(nh), closed(false), nonblock(false), zfile(0), z(0), hMapObject(0), mapped(0) @@ -89,7 +90,7 @@ Handle::Handle(int nh) : itell(0), h(nh), closed(false), nonblock(false), zfile( #ifdef DEBUG printm(M_INFO, String(_("Initialising handle ")) + h + "\n"); #endif - nb_handles++; + Atomic::Increment(&nb_handles); } int Handle::GetHandle() { diff --git a/lib/MailServer.cc b/lib/MailServer.cc index 2c394cc..b4eac77 100644 --- a/lib/MailServer.cc +++ b/lib/MailServer.cc @@ -185,38 +185,48 @@ int ProcessSMTPRequest::Do() throw (GeneralException) { } MailHandler * MailHandler::head = 0; +iLock MailHandler::lock; MailHandler::MailHandler() { + lock.lock(); prev = 0; next = head; head = this; if (next) next->prev = this; + lock.unlock(); } MailHandler::~MailHandler() { + lock.lock(); if (prev) prev->next = next; if (next) next->prev = prev; if (head == this) head = next; + lock.unlock(); } Task * MailHandler::ProcessMail(Handle * in, const String & from, std::vector tos) { MailHandler * cur; Task * r; + lock.lock(); for (cur = head; cur; cur = cur->next) { - if (( r = cur->ProcessMail(in, from, tos))) + if (( r = cur->doProcessMail(in, from, tos))) { + lock.unlock(); return r; + } } + lock.unlock(); return 0; } void MailHandler::OnTop() { if (head == this) return; + lock.lock(); if (prev) prev->next = next; if (next) @@ -226,6 +236,7 @@ void MailHandler::OnTop() { head = this; if (next) next->prev = this; + lock.unlock(); } MailServer::MailServer(int _port, const String & _name) throw (GeneralException) : name(_name), localport(_port) { diff --git a/lib/Output.cc b/lib/Output.cc index caabfa5..1222ead 100644 --- a/lib/Output.cc +++ b/lib/Output.cc @@ -33,6 +33,7 @@ #include #include "Output.h" #include "Exceptions.h" +#include "Atomic.h" #include "gettext.h" #ifndef S_ISREG @@ -52,7 +53,7 @@ Output::Output(String no, int create, int trunc) throw (GeneralException) : throw IOGeneral(String(_("Error opening file ")) + no + _(" for writing: ") + strerror(errno)); } - nb_output++; + Atomic::Increment(&nb_output); size = lseek(GetHandle(), 0, SEEK_END); if (trunc) @@ -107,7 +108,7 @@ int Output::wrapopen(const String & n, int create, int trunc) { } Output::Output(const Output & o) : Handle(o), n(o.n) { - nb_output++; + Atomic::Increment(&nb_output); } bool Output::CanWrite() const { -- cgit v1.2.3