diff options
author | ChrisTX <chris@rev-crew.info> | 2012-10-12 22:31:38 +0200 |
---|---|---|
committer | ChrisTX <chris@rev-crew.info> | 2012-10-12 22:31:38 +0200 |
commit | 5b9682275e384635a1fd9f7320cf4d9a604a43b4 (patch) | |
tree | 8cd47480717046cbf0fa9beeb3ef0fe65e193ec5 /win/inspircd_namedpipe.cpp | |
parent | 152bf4946c3cdee3e8b66cb2babbf3182840d054 (diff) |
Windows: In-depth cleanup (see details)
-Fix x64 builds for Windows. Now all configurations compile.
-Remove the non-working rebase stuff.
-Remove the Windows fork hack and instead use FreeConsole() to emulate the behavior. This directly allows us to compile with ASLR, which is turned on now.
-Remove the old IPC mechanism for the removed GUI. This is not needed anymore as the GUI wasn't ever supported on anything newer than 1.2
-Remove the WIN32/WINDOWS macros. _WIN32 is supported on all x86-based VC++ targets, so that's what we need.
-Enable optimizations for release builds.
-De-duplicate printf_c(), it was previously copy-pasted into colors.h for configure
-Add the VC++ specific bad files in .gitignore
-Disable PID writing on Windows. This is only making sense for *nix builds.
-Replace the CPU usage retrieval with an algorithm analogous to the *nix behavior. Also supports separated now/total values. (Tested with a dummy busy loop - seems working)
-Removed certain unused functions and variables
-Remove stdint defines from the windows wrapper
-Remove CRT debug alloc. This is a bad idea as it would define a macro to replace free which breaks builds.
-Re-evaluated the warnings list, commented it.
-Moved inspircd_config/_version to include/ to match *nix
-Removed the creation of inspircd_se_config, as it isn't used at all.
-Made non-git builds show as "r0" instead of "r" (thanks to @SaberUK for pointing this out)
-Fixed up m_spanningtree's project paths. Now all configurations (debug/release x86/x64) have been tested and build properly.
-Moved FindDNS out of the wrapper and matched its log behavior with *nix. (It's pointless having it in the wrapper after the recent slimming down)
-Replaced random/srandom wrappers with a mechanism that tries to use Windows' Random API first is no SSL module is loaded.
-Removed more old junk from support for compilers older than VC++ 2010 (we don't have project files for these, so compiling them would be hard anyways)
-Removed the unused ClearConsole()
-Removed unused includes from the wrapper. Also, do not include psapi.h here if we don't link psapi.lib. This should be done where appropriate.
-Made inet_aton an inline function for increased performance
-C4800, performance warning about bool forcing, resolved at all occurrences.
-C4701, uninitialized variable 'cached', resolved at all occurrences.
-dlerror() was migrated out of the wrapper for more thread safety (no global buffer being shared) and increased performance.
-Removed the wrong CRT debug flags. This drains a lot of performance.
-Removed the clock_gettime/gettimeofday wrappers
-Replaced all TCHAR/ANSI mix-ups of functions with the correct respective function.
-Added a block of C4355 for < VS2012
-Update project files for c870714
Diffstat (limited to 'win/inspircd_namedpipe.cpp')
-rw-r--r-- | win/inspircd_namedpipe.cpp | 196 |
1 files changed, 0 insertions, 196 deletions
diff --git a/win/inspircd_namedpipe.cpp b/win/inspircd_namedpipe.cpp deleted file mode 100644 index 632c2cca0..000000000 --- a/win/inspircd_namedpipe.cpp +++ /dev/null @@ -1,196 +0,0 @@ -/* - * InspIRCd -- Internet Relay Chat Daemon - * - * Copyright (C) 2008 Craig Edwards <craigedwards@brainbox.cc> - * - * This file is part of InspIRCd. InspIRCd is free software: you can - * redistribute it and/or modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -
-#include "inspircd.h"
-#include "threadengine.h"
-#include "inspircd_namedpipe.h"
-#include "exitcodes.h"
-#include <windows.h>
-#include <psapi.h>
-
-
-IPCThread::IPCThread()
-{
- if (!initwmi())
- ServerInstance->Logs->Log("IPC", DEBUG, "Could not initialise WMI. CPU percantage reports will not be available.");
-}
-
-IPCThread::~IPCThread()
-{
- donewmi();
-}
-
-void IPCThread::Run()
-{
- LPTSTR Pipename = "\\\\.\\pipe\\InspIRCdStatus";
-
- while (GetExitFlag() == false)
- {
- Pipe = CreateNamedPipe (Pipename,
- PIPE_ACCESS_DUPLEX, // read/write access
- PIPE_TYPE_MESSAGE | // message type pipe
- PIPE_READMODE_MESSAGE | // message-read mode
- PIPE_WAIT, // blocking mode
- PIPE_UNLIMITED_INSTANCES, // max. instances
- MAXBUF, // output buffer size
- MAXBUF, // input buffer size
- 1000, // client time-out
- NULL); // no security attribute
-
- if (Pipe == INVALID_HANDLE_VALUE)
- {
- SleepEx(10, true);
- continue;
- }
-
- Connected = ConnectNamedPipe(Pipe, NULL) ? TRUE : (GetLastError() == ERROR_PIPE_CONNECTED);
-
- if (Connected)
- {
- Success = ReadFile (Pipe, // handle to pipe
- this->status, // buffer to receive data
- 1, // size of buffer
- &BytesRead, // number of bytes read
- NULL); // not overlapped I/O
-
- if (!Success || !BytesRead)
- {
- CloseHandle(Pipe);
- continue;
- }
-
- const char oldrequest = this->GetStatus();
-
- /* Wait for main thread to pick up status change */
- while (this->GetStatus())
- SleepEx(10, true);
-
- std::stringstream stat;
- DWORD Written = 0;
- float kbitpersec_in, kbitpersec_out, kbitpersec_total;
-
- PROCESS_MEMORY_COUNTERS MemCounters;
-
- ServerInstance->SE->GetStats(kbitpersec_in, kbitpersec_out, kbitpersec_total);
-
- bool HaveMemoryStats = GetProcessMemoryInfo(GetCurrentProcess(), &MemCounters, sizeof(MemCounters));
-
- stat << "name " << ServerInstance->Config->ServerName << std::endl;
- stat << "gecos " << ServerInstance->Config->ServerDesc << std::endl;
- stat << "numlocalusers " << ServerInstance->Users->LocalUserCount() << std::endl;
- stat << "numusers " << ServerInstance->Users->clientlist->size() << std::endl;
- stat << "numchannels " << ServerInstance->chanlist->size() << std::endl;
- stat << "numopers " << ServerInstance->Users->OperCount() << std::endl;
- stat << "timestamp " << ServerInstance->Time() << std::endl;
- stat << "pid " << GetProcessId(GetCurrentProcess()) << std::endl;
- stat << "request " << oldrequest << std::endl;
- stat << "result " << this->GetResult() << std::endl;
- stat << "kbitspersectotal " << kbitpersec_total << std::endl;
- stat << "kbitspersecout " << kbitpersec_out << std::endl;
- stat << "kbitspersecin " << kbitpersec_in << std::endl;
- stat << "uptime " << ServerInstance->Time() - ServerInstance->startup_time << std::endl;
- stat << "cpu " << getcpu() << std::endl;
- if (HaveMemoryStats)
- {
- stat << "workingset " << MemCounters.WorkingSetSize << std::endl;
- stat << "pagefile " << MemCounters.PagefileUsage << std::endl;
- stat << "pagefaults " << MemCounters.PageFaultCount << std::endl;
- }
-
- stat << "END" << std::endl;
-
- /* This is a blocking call and will succeed, so long as the client doesnt disconnect */
- Success = WriteFile(Pipe, stat.str().data(), stat.str().length(), &Written, NULL);
-
- FlushFileBuffers(Pipe);
- DisconnectNamedPipe(Pipe);
- }
- CloseHandle(Pipe);
- }
-}
-
-const char IPCThread::GetStatus()
-{
- return *status;
-}
-
-void IPCThread::ClearStatus()
-{
- *status = '\0';
-}
-
-int IPCThread::GetResult()
-{
- return result;
-}
-
-void IPCThread::SetResult(int newresult)
-{
- result = newresult;
-}
-
-
-IPC::IPC()
-{
- /* The IPC pipe is threaded */
- thread = new IPCThread();
- ServerInstance->Threads->Start(thread);
-}
-
-void IPC::Check()
-{
- switch (thread->GetStatus())
- {
- case 'N':
- /* No-Operation */
- thread->SetResult(0);
- thread->ClearStatus();
- break;
- case '1':
- /* Rehash */
- ServerInstance->Rehash("due to rehash command from GUI");
- thread->SetResult(0);
- thread->ClearStatus();
- break;
- case '2':
- /* Shutdown */
- thread->SetResult(0);
- thread->ClearStatus();
- ServerInstance->Exit(EXIT_STATUS_NOERROR);
- break;
- case '3':
- /* Restart */
- thread->SetResult(0);
- thread->ClearStatus();
- ServerInstance->Restart("Restarting due to command from GUI");
- break;
- case '4':
- /* Toggle debug */
- thread->SetResult(0);
- thread->ClearStatus();
- ServerInstance->Config->cmdline.forcedebug = !ServerInstance->Config->cmdline.forcedebug;
- break;
- }
-}
-
-IPC::~IPC()
-{
- thread->SetExitFlag();
- delete thread;
-}
|