plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 1 | /* |
| 2 | * |
| 3 | * Copyright (c) International Business Machines Corp., 2001 |
| 4 | * |
| 5 | * This program is free software; you can redistribute it and/or modify |
| 6 | * it under the terms of the GNU General Public License as published by |
| 7 | * the Free Software Foundation; either version 2 of the License, or |
| 8 | * (at your option) any later version. |
| 9 | * |
| 10 | * This program is distributed in the hope that it will be useful, |
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
| 13 | * the GNU General Public License for more details. |
| 14 | * |
| 15 | * You should have received a copy of the GNU General Public License |
| 16 | * along with this program; if not, write to the Free Software |
Wanlong Gao | 4548c6c | 2012-10-19 18:03:36 +0800 | [diff] [blame] | 17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 18 | */ |
| 19 | |
| 20 | /* |
| 21 | * FILE : openfile.c |
| 22 | * DESCRIPTION : Create files and open simultaneously |
| 23 | * HISTORY: |
| 24 | * 03/21/2001 Paul Larson (plars@us.ibm.com) |
| 25 | * -Ported |
iyermanoj | b54e63a | 2001-11-09 06:00:16 +0000 | [diff] [blame] | 26 | * 11/01/2001 Mnaoj Iyer (manjo@austin.ibm.com) |
subrata_modak | 4bb656a | 2009-02-26 12:02:09 +0000 | [diff] [blame] | 27 | * - Modified. |
iyermanoj | b54e63a | 2001-11-09 06:00:16 +0000 | [diff] [blame] | 28 | * added #inclide <unistd.h> |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 29 | * |
| 30 | */ |
| 31 | |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 32 | #include <pthread.h> |
| 33 | #include <stdio.h> |
| 34 | #include <stdlib.h> |
subrata_modak | 94d177a | 2008-12-22 07:33:02 +0000 | [diff] [blame] | 35 | #include <stdint.h> |
iyermanoj | b54e63a | 2001-11-09 06:00:16 +0000 | [diff] [blame] | 36 | #include <unistd.h> |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 37 | |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 38 | #include "test.h" |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 39 | |
| 40 | char *TCID = "openfile01"; /* Test program identifier. */ |
| 41 | int TST_TOTAL = 1; |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 42 | |
| 43 | #define MAXFILES 32768 |
subrata_modak | 4bb656a | 2009-02-26 12:02:09 +0000 | [diff] [blame] | 44 | #define MAXTHREADS 10 |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 45 | |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 46 | /* Control Structure */ |
| 47 | struct cb { |
| 48 | pthread_mutex_t m; |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 49 | pthread_cond_t init_cv; |
| 50 | pthread_cond_t thr_cv; |
| 51 | int thr_sleeping; |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 52 | } c; |
| 53 | |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 54 | /* Global Variables */ |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 55 | int numthreads = 10, numfiles = 10; |
| 56 | int debug = 0; |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 57 | char *filename = "FILETOOPEN"; |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 58 | |
| 59 | void setup(void) |
| 60 | { |
| 61 | tst_tmpdir(); |
| 62 | } |
| 63 | |
| 64 | void cleanup(void) |
| 65 | { |
| 66 | tst_rmdir(); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 67 | |
Garrett Cooper | 2c28215 | 2010-12-16 00:55:50 -0800 | [diff] [blame] | 68 | } |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 69 | |
| 70 | /* Procedures */ |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 71 | void *threads(void *thread_id); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 72 | |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 73 | /* ************************************************************************** |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 74 | * MAIN PROCEDURE * |
| 75 | ************************************************************************** */ |
subrata_modak | bdbaec5 | 2009-02-26 12:14:51 +0000 | [diff] [blame] | 76 | |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 77 | int main(int argc, char *argv[]) |
| 78 | { |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 79 | int i, opt, badopts = 0; |
| 80 | FILE *fd; |
| 81 | pthread_t th_id; |
| 82 | char msg[80] = ""; |
| 83 | extern char *optarg; |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 84 | |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 85 | while ((opt = getopt(argc, argv, "df:t:h")) != EOF) { |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 86 | switch ((char)opt) { |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 87 | case 'd': |
| 88 | debug = 1; |
| 89 | break; |
| 90 | case 'f': |
| 91 | numfiles = atoi(optarg); |
| 92 | if (numfiles <= 0) |
| 93 | badopts = 1; |
| 94 | break; |
| 95 | case 't': |
| 96 | numthreads = atoi(optarg); |
| 97 | if (numthreads <= 0) |
| 98 | badopts = 1; |
| 99 | break; |
| 100 | case 'h': |
| 101 | default: |
| 102 | printf("Usage: openfile [-d] -f FILES -t THREADS\n"); |
| 103 | _exit(1); |
| 104 | } |
| 105 | } |
| 106 | if (badopts) { |
| 107 | printf("Usage: openfile [-d] -f FILES -t THREADS\n"); |
| 108 | _exit(1); |
| 109 | } |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 110 | |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 111 | setup(); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 112 | |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 113 | /* Check if numthreads is less than MAXFILES */ |
| 114 | if (numfiles > MAXFILES) { |
| 115 | sprintf(msg, "%s\nCannot use %d files", msg, numfiles); |
| 116 | sprintf(msg, "%s, used %d files instead\n", msg, MAXFILES); |
| 117 | numfiles = MAXFILES; |
| 118 | } |
| 119 | |
| 120 | /* Check if numthreads is less than MAXTHREADS */ |
| 121 | if (numthreads > MAXTHREADS) { |
| 122 | sprintf(msg, "%s\nCannot use %d threads", msg, numthreads); |
| 123 | sprintf(msg, "%s, used %d threads instead\n", msg, MAXTHREADS); |
| 124 | numthreads = MAXTHREADS; |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 125 | } |
| 126 | |
| 127 | /* Create files */ |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 128 | if ((fd = fopen(filename, "w")) == NULL) { |
| 129 | tst_resm(TFAIL, "Could not create file"); |
| 130 | cleanup(); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 131 | } |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 132 | |
| 133 | /* Initialize thread control variables, lock & condition */ |
| 134 | pthread_mutex_init(&c.m, NULL); |
| 135 | pthread_cond_init(&c.init_cv, NULL); |
| 136 | pthread_cond_init(&c.thr_cv, NULL); |
| 137 | c.thr_sleeping = 0; |
| 138 | |
| 139 | /* Grab mutex lock */ |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 140 | if (pthread_mutex_lock(&c.m)) { |
| 141 | tst_resm(TFAIL, "failed to grab mutex lock"); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 142 | fclose(fd); |
| 143 | unlink(filename); |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 144 | cleanup(); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 145 | } |
| 146 | |
| 147 | printf("Creating Reading Threads\n"); |
| 148 | |
| 149 | /* Create threads */ |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 150 | for (i = 0; i < numthreads; i++) |
Cyril Hrubis | cf0d626 | 2014-09-23 14:03:31 +0200 | [diff] [blame] | 151 | if (pthread_create(&th_id, NULL, threads, |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 152 | (void *)(uintptr_t) i)) { |
| 153 | tst_resm(TFAIL, |
| 154 | "failed creating a pthread; increase limits"); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 155 | fclose(fd); |
| 156 | unlink(filename); |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 157 | cleanup(); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 158 | } |
| 159 | |
| 160 | /* Sleep until all threads are created */ |
| 161 | while (c.thr_sleeping != numthreads) |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 162 | if (pthread_cond_wait(&c.init_cv, &c.m)) { |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 163 | tst_resm(TFAIL, |
| 164 | "error while waiting for reading threads"); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 165 | fclose(fd); |
| 166 | unlink(filename); |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 167 | cleanup(); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 168 | } |
| 169 | |
| 170 | /* Wake up all threads */ |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 171 | if (pthread_cond_broadcast(&c.thr_cv)) { |
| 172 | tst_resm(TFAIL, "failed trying to wake up reading threads"); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 173 | fclose(fd); |
| 174 | unlink(filename); |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 175 | cleanup(); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 176 | } |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 177 | /* Release mutex lock */ |
| 178 | if (pthread_mutex_unlock(&c.m)) { |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 179 | tst_resm(TFAIL, "failed to release mutex lock"); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 180 | fclose(fd); |
| 181 | unlink(filename); |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 182 | cleanup(); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 183 | } |
| 184 | |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 185 | tst_resm(TPASS, "Threads are done reading"); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 186 | |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 187 | fclose(fd); |
| 188 | unlink(filename); |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 189 | cleanup(); |
plars | 77a52c5 | 2001-10-11 16:59:46 +0000 | [diff] [blame] | 190 | _exit(0); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 191 | } |
| 192 | |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 193 | /* ************************************************************************** |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 194 | * OTHER PROCEDURES * |
| 195 | ************************************************************************** */ |
| 196 | |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 197 | void close_files(FILE * fd_list[], int len) |
| 198 | { |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 199 | int i; |
| 200 | for (i = 0; i < len; i++) { |
| 201 | fclose(fd_list[i]); |
| 202 | } |
| 203 | } |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 204 | |
| 205 | /* threads: Each thread opens the files specified */ |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 206 | void *threads(void *thread_id_) |
| 207 | { |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 208 | int thread_id = (uintptr_t) thread_id_; |
| 209 | char errmsg[80]; |
| 210 | FILE *fd_list[MAXFILES]; |
| 211 | int i; |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 212 | |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 213 | /* Open files */ |
| 214 | for (i = 0; i < numfiles; i++) { |
| 215 | if (debug) |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 216 | printf("Thread %d : Opening file number %d \n", |
| 217 | thread_id, i); |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 218 | if ((fd_list[i] = fopen(filename, "rw")) == NULL) { |
| 219 | sprintf(errmsg, "FAIL - Couldn't open file #%d", i); |
| 220 | perror(errmsg); |
| 221 | if (i > 0) { |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 222 | close_files(fd_list, i - 1); |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 223 | } |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 224 | unlink(filename); |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 225 | pthread_exit((void *)1); |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 226 | } |
| 227 | } |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 228 | |
| 229 | /* Grab mutex lock */ |
| 230 | if (pthread_mutex_lock(&c.m)) { |
| 231 | perror("FAIL - failed to grab mutex lock"); |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 232 | close_files(fd_list, numfiles); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 233 | unlink(filename); |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 234 | pthread_exit((void *)1); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 235 | } |
subrata_modak | bdbaec5 | 2009-02-26 12:14:51 +0000 | [diff] [blame] | 236 | |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 237 | /* Check if you should wake up main thread */ |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 238 | if (++c.thr_sleeping == numthreads) |
| 239 | if (pthread_cond_signal(&c.init_cv)) { |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 240 | perror("FAIL - failed to signal main thread"); |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 241 | close_files(fd_list, numfiles); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 242 | unlink(filename); |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 243 | pthread_exit((void *)1); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 244 | } |
| 245 | |
| 246 | /* Sleep until woken up */ |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 247 | if (pthread_cond_wait(&c.thr_cv, &c.m)) { |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 248 | perror("FAIL - failed to wake up correctly"); |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 249 | close_files(fd_list, numfiles); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 250 | unlink(filename); |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 251 | pthread_exit((void *)1); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 252 | } |
| 253 | |
| 254 | /* Release mutex lock */ |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 255 | if (pthread_mutex_unlock(&c.m)) { |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 256 | perror("FAIL - failed to release mutex lock"); |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 257 | close_files(fd_list, numfiles); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 258 | unlink(filename); |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 259 | pthread_exit((void *)1); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 260 | } |
| 261 | |
subrata_modak | 160ed98 | 2009-10-14 20:26:11 +0000 | [diff] [blame] | 262 | /* Close file handles and exit */ |
| 263 | close_files(fd_list, numfiles); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 264 | unlink(filename); |
Cyril Hrubis | 4e2bab8 | 2014-09-24 16:34:35 +0200 | [diff] [blame] | 265 | pthread_exit(NULL); |
Chris Dearman | ec6edca | 2012-10-17 19:54:01 -0700 | [diff] [blame] | 266 | } |