From: George Wang <x...@redhat.com> Signed-off-by: George Wang <x...@redhat.com> --- testcases/kernel/fs/openfile/openfile.c | 149 +++++++++++--------------------- 1 file changed, 49 insertions(+), 100 deletions(-)
diff --git a/testcases/kernel/fs/openfile/openfile.c b/testcases/kernel/fs/openfile/openfile.c index 8657064..82ff1f7 100644 --- a/testcases/kernel/fs/openfile/openfile.c +++ b/testcases/kernel/fs/openfile/openfile.c @@ -38,7 +38,7 @@ #include "test.h" #include "usctest.h" -char *TCID = "openfile01"; /* Test program identifier. */ +char *TCID = "openfile01"; int TST_TOTAL = 1; #define MAXFILES 32768 @@ -52,33 +52,38 @@ struct cb { int thr_sleeping; } c; -/* Global Variables */ int numthreads = 10, numfiles = 10; int debug = 0; char *filename = "FILETOOPEN"; +FILE *fd = NULL; -void setup(void) +void cleanup(void) { - tst_tmpdir(); + if (fd) + fclose(fd); + tst_rmdir(); + } -void cleanup(void) +void setup(void) { - tst_rmdir(); + tst_tmpdir(); + + if ((fd = fopen(filename, "w")) == NULL) + tst_brkm(TBROK, NULL, "Could not create file"); + pthread_mutex_init(&c.m, NULL); + pthread_cond_init(&c.init_cv, NULL); + pthread_cond_init(&c.thr_cv, NULL); + c.thr_sleeping = 0; } -/* Procedures */ -void *threads(void *thread_id); -/* ************************************************************************** - * MAIN PROCEDURE * - ************************************************************************** */ +void *threads(void *thread_id); int main(int argc, char *argv[]) { int i, opt, badopts = 0; - FILE *fd; pthread_t th_id; char msg[80] = ""; extern char *optarg; @@ -101,100 +106,57 @@ int main(int argc, char *argv[]) case 'h': default: printf("Usage: openfile [-d] -f FILES -t THREADS\n"); - _exit(1); + tst_brkm(TBROK, NULL, "PARSE OPTION"); } } - if (badopts) { - printf("Usage: openfile [-d] -f FILES -t THREADS\n"); - _exit(1); - } - - setup(); + if (badopts) + tst_brkm(TBROK, NULL, "Usage: openfile [-d] -f FILES -t THREADS"); - /* Check if numthreads is less than MAXFILES */ if (numfiles > MAXFILES) { sprintf(msg, "%s\nCannot use %d files", msg, numfiles); sprintf(msg, "%s, used %d files instead\n", msg, MAXFILES); numfiles = MAXFILES; } - /* Check if numthreads is less than MAXTHREADS */ if (numthreads > MAXTHREADS) { sprintf(msg, "%s\nCannot use %d threads", msg, numthreads); sprintf(msg, "%s, used %d threads instead\n", msg, MAXTHREADS); numthreads = MAXTHREADS; } - /* Create files */ - if ((fd = fopen(filename, "w")) == NULL) { - tst_resm(TFAIL, "Could not create file"); - cleanup(); - } - - /* Initialize thread control variables, lock & condition */ - pthread_mutex_init(&c.m, NULL); - pthread_cond_init(&c.init_cv, NULL); - pthread_cond_init(&c.thr_cv, NULL); - c.thr_sleeping = 0; + setup(); - /* Grab mutex lock */ - if (pthread_mutex_lock(&c.m)) { - tst_resm(TFAIL, "failed to grab mutex lock"); - fclose(fd); - unlink(filename); - cleanup(); - } + if (pthread_mutex_lock(&c.m)) + tst_brkm(TBROK, cleanup, "failed to grab mutex lock"); printf("Creating Reading Threads\n"); /* Create threads */ - for (i = 0; i < numthreads; i++) - if (pthread_create(&th_id, NULL, threads, - (void *)(uintptr_t) i)) { - tst_resm(TFAIL, - "failed creating a pthread; increase limits"); - fclose(fd); - unlink(filename); - cleanup(); - } + for (i = 0; i < numthreads; i++) { + if (pthread_create(&th_id, NULL, threads, (void *)(uintptr_t) i)) + tst_brkm(TFAIL, cleanup, "failed creating a pthread; increase limits"); + } /* Sleep until all threads are created */ - while (c.thr_sleeping != numthreads) - if (pthread_cond_wait(&c.init_cv, &c.m)) { - tst_resm(TFAIL, - "error while waiting for reading threads"); - fclose(fd); - unlink(filename); - cleanup(); - } + while (c.thr_sleeping != numthreads) { + if (pthread_cond_wait(&c.init_cv, &c.m)) + tst_brkm(TFAIL, cleanup, "error while waiting for reading threads"); + } /* Wake up all threads */ - if (pthread_cond_broadcast(&c.thr_cv)) { - tst_resm(TFAIL, "failed trying to wake up reading threads"); - fclose(fd); - unlink(filename); - cleanup(); - } + if (pthread_cond_broadcast(&c.thr_cv)) + tst_brkm(TFAIL, cleanup, "failed trying to wake up reading threads"); + /* Release mutex lock */ - if (pthread_mutex_unlock(&c.m)) { - tst_resm(TFAIL, "failed to release mutex lock"); - fclose(fd); - unlink(filename); - cleanup(); - } + if (pthread_mutex_unlock(&c.m)) + tst_brkm(TFAIL, cleanup, "failed to release mutex lock"); tst_resm(TPASS, "Threads are done reading"); - fclose(fd); - unlink(filename); cleanup(); - _exit(0); + tst_exit(); } -/* ************************************************************************** - * OTHER PROCEDURES * - ************************************************************************** */ - void close_files(FILE * fd_list[], int len) { int i; @@ -210,8 +172,8 @@ void *threads(void *thread_id_) char errmsg[80]; FILE *fd_list[MAXFILES]; int i; + int rs = 1; - /* Open files */ for (i = 0; i < numfiles; i++) { if (debug) printf("Thread %d : Opening file number %d \n", @@ -219,49 +181,36 @@ void *threads(void *thread_id_) if ((fd_list[i] = fopen(filename, "rw")) == NULL) { sprintf(errmsg, "FAIL - Couldn't open file #%d", i); perror(errmsg); - if (i > 0) { - close_files(fd_list, i - 1); - } - unlink(filename); - pthread_exit((void *)1); + goto ret; } } - /* Grab mutex lock */ if (pthread_mutex_lock(&c.m)) { perror("FAIL - failed to grab mutex lock"); - close_files(fd_list, numfiles); - unlink(filename); - pthread_exit((void *)1); + goto ret; } /* Check if you should wake up main thread */ if (++c.thr_sleeping == numthreads) if (pthread_cond_signal(&c.init_cv)) { perror("FAIL - failed to signal main thread"); - close_files(fd_list, numfiles); - unlink(filename); - pthread_exit((void *)1); + goto ret; } - /* Sleep until woken up */ if (pthread_cond_wait(&c.thr_cv, &c.m)) { perror("FAIL - failed to wake up correctly"); - close_files(fd_list, numfiles); - unlink(filename); - pthread_exit((void *)1); + goto ret; } - /* Release mutex lock */ if (pthread_mutex_unlock(&c.m)) { perror("FAIL - failed to release mutex lock"); - close_files(fd_list, numfiles); - unlink(filename); - pthread_exit((void *)1); + goto ret; } + + rs = 0; + +ret: - /* Close file handles and exit */ - close_files(fd_list, numfiles); - unlink(filename); - pthread_exit(NULL); + close_files(fd_list, i); + pthread_exit((void *)rs); } -- 1.8.4.2 ------------------------------------------------------------------------------ Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server from Actuate! Instantly Supercharge Your Business Reports and Dashboards with Interactivity, Sharing, Native Excel Exports, App Integration & more Get technology previously reserved for billion-dollar corporations, FREE http://pubads.g.doubleclick.net/gampad/clk?id=157005751&iu=/4140/ostg.clktrk _______________________________________________ Ltp-list mailing list Ltp-list@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ltp-list