/****************************************************************************
- * Copyright (c) 1998-2017,2018 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 *
* authorization. *
****************************************************************************/
/*
- * $Id: rain.c,v 1.49 2018/06/23 21:35:06 tom Exp $
+ * $Id: rain.c,v 1.54 2022/07/23 22:47:38 tom Exp $
*/
#include <test.priv.h>
#include <popup_msg.h>
#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;
static void
onsig(int n GCC_UNUSED)
{
- exit_curses();
+ stop_curses();
ExitProgram(EXIT_FAILURE);
}
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;
* Find myself in the list of threads so we can count the number of loops.
*/
for (mystats = 0; mystats < MAX_THREADS; ++mystats) {
-#if defined(_WIN32) && !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())
* 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);
draw_part(part4, 3, &mydata);
draw_part(part5, 4, &mydata);
draw_part(part6, 0, &mydata);
+
} while (get_next_drop());
return NULL;
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();
#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.
*/
}
napms(50);
}
- exit_curses();
+ stop_curses();
#ifdef USE_PTHREADS
printf("Counts per thread:\n");
for (j = 0; j < MAX_THREADS; ++j)