summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);