Skip to content

Commit

Permalink
Merge branch 'master' of github.com:chenshuo/recipes
Browse files Browse the repository at this point in the history
  • Loading branch information
chenshuo committed Jul 30, 2017
2 parents b5bf061 + e251289 commit b181e94
Show file tree
Hide file tree
Showing 5 changed files with 141 additions and 3 deletions.
69 changes: 69 additions & 0 deletions tpc/bin/footprint.cc
@@ -0,0 +1,69 @@
#include <stdio.h>

#include "Acceptor.h"
#include "InetAddress.h"
#include "Socket.h"
#include "TcpStream.h"


void dump(const char* filename)
{
char buf[65536];
FILE* fp = fopen(filename, "r");
if (fp)
{
ssize_t nr;
while ( (nr = fread(buf, 1, sizeof buf, fp)) > 0)
fwrite(buf, 1, nr, stdout);

fclose(fp);
}
}

void snapshot(const char* name)
{
printf("===== %s =====\n", name);
dump("/proc/meminfo");
dump("/proc/slabinfo");
}

int main(int argc, char* argv[])
{
const int N = argc > 1 ? atoi(argv[1]) : 1000;

{
char buf[32];
snprintf(buf, sizeof buf, "start N=%d", N);
snapshot(buf);
}

InetAddress listenAddr(2222);
Acceptor acceptor(listenAddr);
snapshot("acceptor created");

std::vector<Socket> clients;
for (int i = 0; i < N; ++i)
clients.push_back(Socket::createTCP());
snapshot("clients created");

std::vector<Socket> servers;
InetAddress serverAddr("127.0.0.1", 2222);
for (int i = 0; i < N; ++i)
{
if (clients[i].connect(serverAddr))
{
perror("connect");
break;
}
servers.push_back(acceptor.acceptSocketOrDie());
}
snapshot("clients connected");

// TODO: epoll

servers.clear();
snapshot("servers disconnected");

clients.clear();
snapshot("clients disconnected");
}
55 changes: 55 additions & 0 deletions tpc/bin/footprint.py
@@ -0,0 +1,55 @@
#!/usr/bin/python

from collections import OrderedDict
import re, sys

slabs = {}

sections = []

section = None

for line in sys.stdin:
m = re.match('===== (.*) =====', line)
if m:
section_name = m.group(1)
# print section_name
if (section):
sections.append(section)
section = (section_name, OrderedDict(), OrderedDict())
meminfo = True
continue
if re.match('slabinfo -', line):
meminfo = False
continue
if meminfo:
m = re.match('(.*): *(\\d+) kB', line)
if m:
section[1][m.group(1)] = int(m.group(2))
else:
if line[0] == '#':
continue
(slab, active, total, objsize) = line.split()[:4]
slabs[slab] = int(objsize)
section[2][slab] = int(active)


sections.append(section)

for i in range(1, len(sections)):
print '=====', sections[i][0]
meminfo = sections[i][1]
old = sections[i-1][1]
for key in meminfo:
diff = meminfo[key]-old[key]
if diff:
print key, diff

print '-----'
slab = sections[i][2]
old = sections[i-1][2]
for key in slab:
diff = slab[key]-old[key]
if diff:
print key, slabs[key], diff

1 change: 1 addition & 0 deletions tpc/include/Acceptor.h
Expand Up @@ -20,6 +20,7 @@ class Acceptor : noncopyable

// thread safe
TcpStreamPtr accept();
Socket acceptSocketOrDie();

private:
Socket listenSock_;
Expand Down
14 changes: 14 additions & 0 deletions tpc/lib/Acceptor.cc
Expand Up @@ -28,3 +28,17 @@ TcpStreamPtr Acceptor::accept()
}
}

Socket Acceptor::acceptSocketOrDie()
{
// FIXME: use accept4
int sockfd = ::accept(listenSock_.fd(), NULL, NULL);
if (sockfd >= 0)
{
return Socket(sockfd);
}
else
{
perror("Acceptor::acceptSocketOrDie");
abort();
}
}
5 changes: 2 additions & 3 deletions tpc/lib/InetAddress.cc
Expand Up @@ -6,13 +6,12 @@
#include <strings.h> // bzero
#include <arpa/inet.h>

/*
InetAddress::InetAddress(StringArg ip, uint16_t port)
: InetAddress(port, false)
{
::inet_pton();
if (::inet_pton(AF_INET, ip.c_str(), &saddr_.sin_addr) != 1)
assert("Invalid IP format");
}
*/

InetAddress::InetAddress(uint16_t port, bool loopbackOnly)
{
Expand Down

0 comments on commit b181e94

Please sign in to comment.