1#include <stdio.h>
2#include <kernel/OS.h>
3#include <string.h>
4#include <sys/time.h>
5#include <errno.h>
6
7#include "sys/socket.h"
8#include "netinet/in.h"
9#include "arpa/inet.h"
10#include "sys/select.h"
11
12#include "ufunc.h"
13
14#define THREADS	2
15#define MIN_SOCK	10
16#define MAX_SOCK	100
17#define TIME	10
18
19int32 test_thread(void *data)
20{
21	int tnum = *(int*)data;
22	int sock[MAX_SOCK];
23	int qty = MIN_SOCK;
24	struct sockaddr_in sa;
25	int i, rv, totsock = 0;
26
27	sa.sin_family = AF_INET;
28	sa.sin_port = 0;
29	sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
30	sa.sin_len = sizeof(sa);
31	memset(&sa.sin_zero, 0, sizeof(sa.sin_zero));
32
33	printf("Thread %d, starting test\n", tnum + 1);
34
35	while (qty <= MAX_SOCK) {
36		for (i=0;i < qty;i++) {
37			if (i >= MAX_SOCK)
38				break;
39			sock[i] = socket(AF_INET, SOCK_DGRAM , 0);
40			totsock++;
41			if (sock[i] < 0) {
42				printf("Total of %d sockets created\n", totsock);
43				err(errno, "Socket creation failed");
44			}
45		}
46		printf("Thread %d: completed creating %d sockets...\n", tnum+1, qty);
47		for (i=0;i < qty;i++) {
48			if (i >= MAX_SOCK)
49				break;
50			rv = bind(sock[i],	(struct sockaddr*)&sa, sizeof(sa));
51			if (rv < 0)
52				err(errno, "Failed to bind!");
53		}
54		for (i=0;i < qty;i++) {
55			if (i >= MAX_SOCK)
56				break;
57			rv = close(sock[i]);
58			if (rv < 0)
59				err(errno, "Failed to close socket!");
60		}
61		qty += (MAX_SOCK - MIN_SOCK) / 10;
62	}
63
64	printf( "Thread %d complete\n", tnum);
65}
66
67int main(int argc, char **argv)
68{
69	thread_id t[THREADS];
70	int i;
71	status_t retval;
72
73	test_banner("Simultaneous socket creation test");
74
75	for (i=0;i<THREADS;i++) {
76		t[i] = spawn_thread(test_thread, "socket test thread",
77			B_NORMAL_PRIORITY, &i);
78		if (t[i] >= 0)
79			resume_thread(t[i]);
80	}
81
82	for (i=0;i<THREADS;i++) {
83		wait_for_thread(t[i], &retval);
84	}
85
86	return (0);
87}
88
89
90