X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=test%2Frain.c;h=4c3568cffcda89ff89999d04d681c677d2e3dd9f;hp=c51c7b0a9cde01f71337daadb3e4fa766082591d;hb=HEAD;hpb=5d8dbcdd9423bf9821db414fd9ec792ccf1f1027 diff --git a/test/rain.c b/test/rain.c index c51c7b0a..1b1d81a0 100644 --- a/test/rain.c +++ b/test/rain.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2014,2017 Free Software Foundation, Inc. * + * Copyright 2018-2020,2022 Thomas E. Dickey * + * Copyright 1998-2014,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -26,7 +27,7 @@ * authorization. * ****************************************************************************/ /* - * $Id: rain.c,v 1.46 2017/09/09 00:37:51 tom Exp $ + * $Id: rain.c,v 1.57 2022/12/04 00:40:11 tom Exp $ */ #include #include @@ -56,6 +57,7 @@ typedef struct DATA { #ifdef USE_PTHREADS pthread_cond_t cond_next_drop; +pthread_mutex_t mutex_drop_data; pthread_mutex_t mutex_next_drop; static int used_threads; @@ -67,10 +69,18 @@ typedef struct { static STATS drop_threads[MAX_THREADS]; #endif +#if HAVE_USE_WINDOW +static int +safe_wgetch(WINDOW *w, void *data GCC_UNUSED) +{ + return wgetch(w); +} +#endif + static void onsig(int n GCC_UNUSED) { - exit_curses(); + stop_curses(); ExitProgram(EXIT_FAILURE); } @@ -191,7 +201,7 @@ draw_part(void (*func) (DATA *), int state, DATA * data) static int put_next_drop(void) { - pthread_cond_signal(&cond_next_drop); + pthread_cond_broadcast(&cond_next_drop); pthread_mutex_unlock(&mutex_next_drop); return 0; @@ -219,7 +229,7 @@ draw_drop(void *arg) * Find myself in the list of threads so we can count the number of loops. */ for (mystats = 0; mystats < MAX_THREADS; ++mystats) { -#if defined(__MINGW32__) && !defined(__WINPTHREADS_VERSION) +#if defined(_NC_WINDOWS) && !defined(__WINPTHREADS_VERSION) if (drop_threads[mystats].myself.p == pthread_self().p) #else if (drop_threads[mystats].myself == pthread_self()) @@ -237,7 +247,9 @@ draw_drop(void *arg) * to the data which it uses for setting up this thread (but it has * been modified to use different coordinates). */ + pthread_mutex_lock(&mutex_drop_data); mydata = *(DATA *) arg; + pthread_mutex_unlock(&mutex_drop_data); draw_part(part1, 0, &mydata); draw_part(part2, 1, &mydata); @@ -245,6 +257,7 @@ draw_drop(void *arg) draw_part(part4, 3, &mydata); draw_part(part5, 4, &mydata); draw_part(part6, 0, &mydata); + } while (get_next_drop()); return NULL; @@ -285,16 +298,17 @@ start_drop(DATA * data) static int get_input(void) { - return USING_WINDOW(stdscr, wgetch); + return USING_WINDOW1(stdscr, wgetch, safe_wgetch); } static void -usage(void) +usage(int ok) { static const char *msg[] = { "Usage: rain [options]" ,"" + ,USAGE_COMMON ,"Options:" #if HAVE_USE_DEFAULT_COLORS ," -d invoke use_default_colors" @@ -305,8 +319,11 @@ usage(void) for (n = 0; n < SIZEOF(msg); n++) fprintf(stderr, "%s\n", msg[n]); - ExitProgram(EXIT_FAILURE); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ int main(int argc, char *argv[]) @@ -332,26 +349,27 @@ main(int argc, char *argv[]) bool d_option = FALSE; #endif - while ((ch = getopt(argc, argv, "d")) != -1) { + while ((ch = getopt(argc, argv, OPTS_COMMON "d")) != -1) { switch (ch) { #if HAVE_USE_DEFAULT_COLORS case 'd': d_option = TRUE; break; #endif + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); default: - usage(); + usage(ch == OPTS_USAGE); /* NOTREACHED */ } } if (optind < argc) - usage(); + usage(FALSE); setlocale(LC_ALL, ""); - CATCHALL(onsig); - - initscr(); + InitAndCatch(initscr(), onsig); if (has_colors()) { int bg = COLOR_BLACK; start_color(); @@ -367,7 +385,9 @@ main(int argc, char *argv[]) curs_set(0); timeout(0); -#ifndef USE_PTHREADS +#ifdef USE_PTHREADS + pthread_mutex_init(&mutex_drop_data, NULL); +#else /* !USE_PTHREADS */ for (j = MAX_DROP; --j >= 0;) { last[j].x = random_x(); last[j].y = random_y(); @@ -376,14 +396,21 @@ main(int argc, char *argv[]) #endif while (!done) { +#ifdef USE_PTHREADS + pthread_mutex_lock(&mutex_drop_data); + drop.x = random_x(); drop.y = random_y(); -#ifdef USE_PTHREADS if (start_drop(&drop) != 0) { beep(); } + + pthread_mutex_unlock(&mutex_drop_data); #else + drop.x = random_x(); + drop.y = random_y(); + /* * The non-threaded code draws parts of each drop on each loop. */ @@ -431,7 +458,7 @@ main(int argc, char *argv[]) } napms(50); } - exit_curses(); + stop_curses(); #ifdef USE_PTHREADS printf("Counts per thread:\n"); for (j = 0; j < MAX_THREADS; ++j)