add very simple (but already exposing many problems) wxIPC benchmark
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56360 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
169
tests/benchmarks/ipcclient.cpp
Normal file
169
tests/benchmarks/ipcclient.cpp
Normal file
@@ -0,0 +1,169 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: tests/benchmarks/ipcclient.cpp
|
||||
// Purpose: wxIPC client side benchmarks
|
||||
// Author: Vadim Zeitlin
|
||||
// Created: 2008-10-13
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 2008 Vadim Zeitlin <vadim@wxwidgets.org>
|
||||
// Licence: wxWindows license
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "bench.h"
|
||||
|
||||
#include "wx/evtloop.h"
|
||||
|
||||
#include "wx/ipc.h"
|
||||
#include "../../samples/ipc/ipcsetup.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
class PokeAdviseConn : public wxConnection
|
||||
{
|
||||
public:
|
||||
PokeAdviseConn() { m_gotAdvised = false; }
|
||||
|
||||
bool GotAdvised()
|
||||
{
|
||||
if ( !m_gotAdvised )
|
||||
return false;
|
||||
|
||||
m_gotAdvised = false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
const wxString& GetItem() const { return m_item; }
|
||||
|
||||
virtual bool OnAdvise(const wxString& topic,
|
||||
const wxString& item,
|
||||
const void *data,
|
||||
size_t size,
|
||||
wxIPCFormat format)
|
||||
{
|
||||
m_gotAdvised = true;
|
||||
|
||||
if ( topic != IPC_BENCHMARK_TOPIC ||
|
||||
item != IPC_BENCHMARK_ITEM ||
|
||||
!IsTextFormat(format) )
|
||||
{
|
||||
m_item = "ERROR";
|
||||
return false;
|
||||
}
|
||||
|
||||
m_item = GetTextFromData(data, size, format);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
wxString m_item;
|
||||
bool m_gotAdvised;
|
||||
|
||||
DECLARE_NO_COPY_CLASS(PokeAdviseConn)
|
||||
};
|
||||
|
||||
class PokeAdviseClient : public wxClient
|
||||
{
|
||||
public:
|
||||
// provide a convenient helper taking care of connecting to the right
|
||||
// server/service/topic and returning the connection of the derived type
|
||||
// (or NULL if we failed to connect)
|
||||
PokeAdviseConn *Connect()
|
||||
{
|
||||
wxString host = Bench::GetStringParameter();
|
||||
if ( host.empty() )
|
||||
host = IPC_HOST;
|
||||
|
||||
wxString service;
|
||||
int port = Bench::GetNumericParameter();
|
||||
if ( !port )
|
||||
service = IPC_SERVICE;
|
||||
else
|
||||
service.Printf("%d", port);
|
||||
|
||||
return static_cast<PokeAdviseConn *>(
|
||||
MakeConnection(host, service, IPC_BENCHMARK_TOPIC));
|
||||
}
|
||||
|
||||
|
||||
// override base class virtual to use a custom connection class
|
||||
virtual wxConnectionBase *OnMakeConnection()
|
||||
{
|
||||
return new PokeAdviseConn;
|
||||
}
|
||||
};
|
||||
|
||||
class PokeAdvisePersistentConnection
|
||||
{
|
||||
public:
|
||||
PokeAdvisePersistentConnection()
|
||||
{
|
||||
m_client = new PokeAdviseClient;
|
||||
m_conn = m_client->Connect();
|
||||
if ( m_conn )
|
||||
m_conn->StartAdvise(IPC_BENCHMARK_ITEM);
|
||||
}
|
||||
|
||||
~PokeAdvisePersistentConnection()
|
||||
{
|
||||
if ( m_conn )
|
||||
{
|
||||
m_conn->StopAdvise(IPC_BENCHMARK_ITEM);
|
||||
m_conn->Disconnect();
|
||||
}
|
||||
|
||||
delete m_client;
|
||||
}
|
||||
|
||||
PokeAdviseConn *Get() const { return m_conn; }
|
||||
|
||||
private:
|
||||
PokeAdviseClient *m_client;
|
||||
PokeAdviseConn *m_conn;
|
||||
bool m_initDone;
|
||||
|
||||
DECLARE_NO_COPY_CLASS(PokeAdvisePersistentConnection)
|
||||
};
|
||||
|
||||
PokeAdvisePersistentConnection *theConnection = NULL;
|
||||
|
||||
bool ConnInit()
|
||||
{
|
||||
theConnection = new PokeAdvisePersistentConnection;
|
||||
if ( !theConnection->Get() )
|
||||
{
|
||||
delete theConnection;
|
||||
theConnection = NULL;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void ConnDone()
|
||||
{
|
||||
delete theConnection;
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
BENCHMARK_FUNC_WITH_INIT(IPCPokeAdvise, ConnInit, ConnDone)
|
||||
{
|
||||
wxEventLoop loop;
|
||||
|
||||
PokeAdviseConn * const conn = theConnection->Get();
|
||||
|
||||
const wxString s(1024, '@');
|
||||
|
||||
if ( !conn->Poke(IPC_BENCHMARK_ITEM, s) )
|
||||
return false;
|
||||
|
||||
while ( !conn->GotAdvised() )
|
||||
loop.Dispatch();
|
||||
|
||||
if ( conn->GetItem() != s )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
Reference in New Issue
Block a user