*/
FILE* log;
- /** Buffer of pending log lines to be written
- */
- std::string buffer;
-
/** Number of write operations that have occured
*/
int writeops;
*/
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,
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);
{
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();
}
+
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;
}
/* 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);