summaryrefslogtreecommitdiff
path: root/benchmarks/nttcp/patches/patch-ab
blob: 902996fd8084822fffab4c940bf01a864ef7d4ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
$NetBSD: patch-ab,v 1.3 2006/05/12 03:07:14 simonb Exp $

--- nttcp.c.orig	2000-12-18 21:16:54.000000000 +1100
+++ nttcp.c
@@ -136,9 +136,9 @@ void syslog(int priority, const char *me
 #endif /* aix */ 
 
 /*====================================================================*/
-#if defined(FreeBSD)
+#ifndef SIGCLD
 #define	SIGCLD	SIGCHLD
-#endif /*FreeBSD*/
+#endif /*SIGCLD*/
 
 /*====================================================================*/
 #if defined(BSD42)
@@ -268,6 +268,7 @@ Usage: nttcp [local options] host [remot
 \t-n#	number of source bufs written to network (default 2048)\n\
 \t-u	use UDP instead of TCP\n\
 \t-g#us	gap in micro seconds between UDP packets (default 0s)\n\
+\t-U#	run until a number of seconds have elapsed\n\
 \t-d	set SO_DEBUG in sockopt\n\
 \t-D	don't buffer TCP writes (sets TCP_NODELAY socket option)\n\
 \t-w#	set the send buffer space to #kilobytes, which is\n\
@@ -346,6 +347,7 @@ typedef struct {
     int FixedDataSize;		/* if>0: calc BufCnt/BufLen from this */
     int Window,	SndWin, RcvWin; /* TCP window sizes */
     int	Verbose;		/* ==1: more diagnostics */
+    int RunTime;		/* approximate runtime in seconds */
     char *MulticastChannel;	/* we send multicast traffic */
     short MulticastPort;	
     int GapLength;		/* Gap length between packets */
@@ -496,6 +498,13 @@ void StartTimer() {
     SysCalls=0;
 }
 
+int CheckTimer() {
+    TimeVal now;
+
+    gettimeofday(&now, (struct timezone *)0);
+    return opt.RunTime < (now.tv_sec - time0.tv_sec);
+}
+
 void StopTimer(double *cput, double *realt) {
     /* delivers in cput:  the amount of cpu time in seconds
      *          in realt: the real time in seconds
@@ -878,6 +887,7 @@ void InitOptions(Options *opt) {
     opt->Verbose=0;		/* ==1: more diagnostics */
     opt->GapLength=0;		/* no delay, send as fast as possible */
     opt->inetd= 0;		/* ==1: run in inetd mode */
+    opt->RunTime = 0;		/* run effectively forever (ie BufCnt is limiting factor) */
     opt->Service= GetService();	/* the service-port to listen to */
     opt->MulticastChannel= NULL;
     opt->MulticastPort= 0;
@@ -1013,6 +1023,10 @@ void ParseOptions(int *ac, char **av[], 
 #endif /*MULTICAST*/
 	    break;
 	  }
+	  case 'U':
+	    GetSizeValue(&argc, &argv, &opt->RunTime, 1000000000,
+	      "runtime");
+	    break;
 	  default: {
 	    strcpy(MsgBuf, "unknown option: ");
 	    strncat(MsgBuf, argv[0], sizeof(MsgBuf)-strlen(MsgBuf)-1);
@@ -1427,6 +1441,10 @@ int main(int argc, char *argv[]) {
 	    sprintf(OptBuf, "-g%d", opt.GapLength);
 	    StrVecAppend(RemOpt, OptBuf);
 	}
+	if (opt.RunTime > 0) {
+	    sprintf(OptBuf, "-U%d", opt.RunTime);
+	    StrVecAppend(RemOpt, OptBuf);
+	}
 	if (opt.MulticastChannel) {
 	    sprintf(OptBuf, "-m%s:%d",
 	      opt.MulticastChannel, opt.MulticastPort);
@@ -1781,9 +1799,17 @@ int main(int argc, char *argv[]) {
 	    else
 		Pattern(buf, opt.BufLen);
 	    StartTimer();
-	    while (n-- && Nwrite(fd, buf, opt.BufLen) == opt.BufLen) {
+	    while (Nwrite(fd, buf, opt.BufLen) == opt.BufLen) {
 		nBytes+= opt.BufLen;
 		nBuffer++;
+		if (opt.RunTime == 0) {
+		    if (--n == 0)
+			break;
+		} else {
+		    /* XXX: tune how often to check if timer has expired? */
+		    if ((nBuffer % 100 == 0) && CheckTimer())
+			break;
+		}
 	    }
 	    StopTimer(&cput, &realt);
 	    opt.GapLength= 0;
@@ -1797,9 +1823,17 @@ int main(int argc, char *argv[]) {
 	    nBytes= 0;
 	    nBuffer= 0;
 	    StartTimer();
-	    while (n-- && Nwrite(fd, buf, opt.BufLen) == opt.BufLen) {
+	    while (Nwrite(fd, buf, opt.BufLen) == opt.BufLen) {
 		nBytes+= opt.BufLen;
 		nBuffer++;
+		if (opt.RunTime == 0) {
+		    if (--n == 0)
+			break;
+		} else {
+		    /* XXX: tune how often to check if timer has expired? */
+		    if ((nBuffer % 100 == 0) && CheckTimer())
+			break;
+		}
 	    }
 	    StopTimer(&cput, &realt);
 	}