X-Git-Url: https://ncurses.scripts.mit.edu/?a=blobdiff_plain;f=test%2Frain.c;h=dde411b2b3e43cf000e6cfb363fb8be808115f60;hb=205ea499dbbceba5201d997fbd8b6b1f7f29bd50;hp=c51c7b0a9cde01f71337daadb3e4fa766082591d;hpb=5d8dbcdd9423bf9821db414fd9ec792ccf1f1027;p=ncurses.git diff --git a/test/rain.c b/test/rain.c index c51c7b0a..dde411b2 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.54 2022/07/23 22:47:38 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,7 +298,7 @@ start_drop(DATA * data) static int get_input(void) { - return USING_WINDOW(stdscr, wgetch); + return USING_WINDOW1(stdscr, wgetch, safe_wgetch); } static void @@ -349,9 +362,7 @@ main(int argc, char *argv[]) setlocale(LC_ALL, ""); - CATCHALL(onsig); - - initscr(); + InitAndCatch(initscr(), onsig); if (has_colors()) { int bg = COLOR_BLACK; start_color(); @@ -367,7 +378,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 +389,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 +451,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)