Fix rxperf so that it works with pthreads
authorSimon Wilkinson <sxw@your-file-system.com>
Sun, 26 Sep 2010 14:20:22 +0000 (15:20 +0100)
committerJeffrey Altman <jaltman@openafs.org>
Mon, 27 Sep 2010 14:40:17 +0000 (07:40 -0700)
*) Don't allocate 512K on the stack
*) Don't pass stack allocated data into pthread_create()

Change-Id: I6a4f70121871bf3b7a62d9ed893a2d15bffc7a21
Reviewed-on: http://gerrit.openafs.org/2854
Reviewed-by: Jeffrey Altman <jaltman@openafs.org>
Tested-by: Jeffrey Altman <jaltman@openafs.org>

src/rx/test/rxperf.c

index 2985f73..cef5d89 100644 (file)
@@ -555,9 +555,10 @@ readfile(const char *filename, afs_uint32 ** readwrite, afs_uint32 * size)
     afs_uint32 num = 0;
     afs_uint32 data;
     char *ptr;
-    char buf[RXPERF_BUFSIZE];
+    char *buf;
 
     *readwrite = malloc(sizeof(afs_uint32) * len);
+    buf = malloc(RXPERF_BUFSIZE);
 
     if (*readwrite == NULL)
        err(1, "malloc");
@@ -591,6 +592,7 @@ readfile(const char *filename, afs_uint32 ** readwrite, afs_uint32 * size)
 
     if (fclose(f) == -1)
        err(1, "fclose");
+    free(buf);
 }
 
 struct client_data {
@@ -767,7 +769,7 @@ do_client(const char *server, short port, char *filename, afs_int32 command,
     int secureindex;
     int ret;
     char stamp[2048];
-    struct client_data params;
+    struct client_data *params;
 
 #ifdef AFS_PTHREAD_ENV
     int i;
@@ -776,6 +778,9 @@ do_client(const char *server, short port, char *filename, afs_int32 command,
     void *status;
 #endif
 
+    params = malloc(sizeof(struct client_data));
+    memset(params, 0, sizeof(struct client_data));
+
 #ifdef AFS_NT40_ENV
     if (afs_winsockInit() < 0) {
        printf("Can't initialize winsock.\n");
@@ -822,13 +827,13 @@ do_client(const char *server, short port, char *filename, afs_int32 command,
     pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_JOINABLE);
 #endif
 
-    params.conn = conn;
-    params.filename = filename;
-    params.command = command;
-    params.times = times;
-    params.bytes = bytes;
-    params.sendtimes = sendtimes;
-    params.recvtimes = recvtimes;
+    params->conn = conn;
+    params->filename = filename;
+    params->command = command;
+    params->times = times;
+    params->bytes = bytes;
+    params->sendtimes = sendtimes;
+    params->recvtimes = recvtimes;
 
     switch (command) {
     case RX_PERF_RPC:
@@ -853,9 +858,9 @@ do_client(const char *server, short port, char *filename, afs_int32 command,
 
 #ifdef AFS_PTHREAD_ENV
     for ( i=0; i<threads; i++)
-        pthread_create(&thread[i], &tattr, client_thread, &params);
+        pthread_create(&thread[i], &tattr, client_thread, params);
 #else
-        client_thread(&params);
+        client_thread(params);
 #endif
 
 #ifdef AFS_PTHREAD_ENV
@@ -875,6 +880,8 @@ do_client(const char *server, short port, char *filename, afs_int32 command,
 #ifdef AFS_PTHREAD_ENV
     pthread_attr_destroy(&tattr);
 #endif
+
+    free(params);
 }
 
 static void