summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2008-04-02 19:52:33 +0000
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2008-04-02 19:52:33 +0000
commit7dadb07a19280936147b91144f27d8528ba35c7c (patch)
tree806ce6c1e2506606b2b88531a9714a0241b521ec
parent0ba0beb0c465cd7bfbd98b6f51429d3147c362eb (diff)
Fix peavey and w00ts bug they found by removing the nonblocking part of the logger. This stuff was hackish and isnt required. If your hard disk locks up, then you have bigger worries.
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@9276 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r--include/logger.h8
-rw-r--r--src/logger.cpp59
-rw-r--r--src/socketengines/socketengine_kqueue.cpp11
3 files changed, 10 insertions, 68 deletions
diff --git a/include/logger.h b/include/logger.h
index 384e38c1a..79914ac98 100644
--- a/include/logger.h
+++ b/include/logger.h
@@ -38,10 +38,6 @@ class CoreExport FileWriter : public EventHandler
*/
FILE* log;
- /** Buffer of pending log lines to be written
- */
- std::string buffer;
-
/** Number of write operations that have occured
*/
int writeops;
@@ -51,10 +47,6 @@ class CoreExport FileWriter : public EventHandler
*/
FileWriter(InspIRCd* Instance, FILE* logfile);
- /** This returns false, logfiles are writeable.
- */
- virtual bool Readable();
-
/** Handle pending write events.
* This will flush any waiting data to disk.
* If any data remains after the fprintf call,
diff --git a/src/logger.cpp b/src/logger.cpp
index 20235a826..8e887830d 100644
--- a/src/logger.cpp
+++ b/src/logger.cpp
@@ -333,57 +333,17 @@ void LogManager::Log(const std::string &type, int loglevel, const std::string &m
FileWriter::FileWriter(InspIRCd* Instance, FILE* logfile)
: ServerInstance(Instance), log(logfile), writeops(0)
{
- if (log)
- {
- Instance->SE->NonBlocking(fileno(log));
- SetFd(fileno(log));
- buffer.clear();
- }
}
-bool FileWriter::Readable()
+void FileWriter::HandleEvent(EventType ev, int)
{
- return false;
-}
-
-void FileWriter::HandleEvent(EventType, int)
-{
- WriteLogLine("");
- if (log)
- {
- ServerInstance->SE->DelFd(this);
- }
}
void FileWriter::WriteLogLine(const std::string &line)
{
- if (line.length())
- {
- buffer.append(line);
- }
-
if (log)
{
- int written = fprintf(log,"%s",buffer.c_str());
-#ifdef WINDOWS
- buffer.clear();
-#else
- if ((written >= 0) && (written < (int)buffer.length()))
- {
- buffer.erase(0, buffer.length());
- ServerInstance->SE->AddFd(this);
- }
- else if (written == -1)
- {
- if (errno == EAGAIN)
- ServerInstance->SE->AddFd(this);
- }
- else
- {
- /* Wrote the whole buffer, and no need for write callback */
- buffer.clear();
- }
-#endif
+ fprintf(log,"%s",line.c_str());
if (writeops++ % 20)
{
fflush(log);
@@ -395,25 +355,12 @@ void FileWriter::Close()
{
if (log)
{
- ServerInstance->SE->Blocking(fileno(log));
-
- if (buffer.size())
- {
- fprintf(log,"%s",buffer.c_str());
- }
-
-#ifndef WINDOWS
- ServerInstance->SE->DelFd(this);
-#endif
-
fflush(log);
fclose(log);
}
-
- buffer.clear();
}
FileWriter::~FileWriter()
{
- this->Close();
}
+
diff --git a/src/socketengines/socketengine_kqueue.cpp b/src/socketengines/socketengine_kqueue.cpp
index f21d2e710..214afc71c 100644
--- a/src/socketengines/socketengine_kqueue.cpp
+++ b/src/socketengines/socketengine_kqueue.cpp
@@ -104,7 +104,7 @@ bool KQueueEngine::DelFd(EventHandler* eh, bool force)
CurrentSetSize--;
ref[fd] = NULL;
- ServerInstance->Logs->Log("SOCKET",DEBUG,"Remove file descriptor: %d", fd);
+ //ServerInstance->Logs->Log("SOCKET",DEBUG,"Remove file descriptor: %d", fd);
return true;
}
@@ -169,9 +169,12 @@ int KQueueEngine::DispatchEvents()
/* This looks wrong but its right. As above, theres no modify
* call in kqueue. See the manpage.
*/
- struct kevent ke;
- EV_SET(&ke, ke_list[j].ident, EVFILT_READ, EV_ADD, 0, 0, NULL);
- kevent(EngineHandle, &ke, 1, 0, 0, NULL);
+ if (ref[ke_list[j].ident]->Readable())
+ {
+ struct kevent ke;
+ EV_SET(&ke, ke_list[j].ident, EVFILT_READ, EV_ADD, 0, 0, NULL);
+ kevent(EngineHandle, &ke, 1, 0, 0, NULL);
+ }
WriteEvents++;
if (ref[ke_list[j].ident])
ref[ke_list[j].ident]->HandleEvent(EVENT_WRITE);