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 19 int32 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 67 int 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