/usr/include/gnuastro/threads.h is in libgnuastro-dev 0.5-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | /*********************************************************************
Functions to facilitate using threads.
This is part of GNU Astronomy Utilities (Gnuastro) package.
Original author:
Mohammad Akhlaghi <akhlaghi@gnu.org>
Contributing author(s):
Copyright (C) 2015, Free Software Foundation, Inc.
Gnuastro is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
Gnuastro is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with Gnuastro. If not, see <http://www.gnu.org/licenses/>.
**********************************************************************/
#ifndef __GAL_THREADS_H__
#define __GAL_THREADS_H__
/* Include other headers if necessary here. Note that other header files
must be included before the C++ preparations below */
#include <pthread.h>
#include <gnuastro/blank.h>
/* When we are within Gnuastro's building process, `IN_GNUASTRO_BUILD' is
defined. In the build process, installation information (in particular
`GAL_CONFIG_HAVE_PTHREAD_BARRIER' that we need below) is kept in
`config.h'. When building a user's programs, this information is kept in
`gnuastro/config.h'. Note that all `.c' files must start with the
inclusion of `config.h' and that `gnuastro/config.h' is only created at
installation time (not present during the building of Gnuastro).*/
#ifndef IN_GNUASTRO_BUILD
#include <gnuastro/config.h>
#endif
/* C++ Preparations */
#undef __BEGIN_C_DECLS
#undef __END_C_DECLS
#ifdef __cplusplus
# define __BEGIN_C_DECLS extern "C" {
# define __END_C_DECLS }
#else
# define __BEGIN_C_DECLS /* empty */
# define __END_C_DECLS /* empty */
#endif
/* End of C++ preparations */
/* Actual header contants (the above were for the Pre-processor). */
__BEGIN_C_DECLS /* From C++ preparations */
/*****************************************************************/
/********* Implementation of pthread_barrier ***************/
/*****************************************************************/
#if GAL_CONFIG_HAVE_PTHREAD_BARRIER == 0
/* Integer number of nano-seconds that `pthread_barrier_destroy' should
wait for a check to see if all barriers have been reached. */
#define GAL_THREADS_BARRIER_DESTROY_NANOSECS 1000
typedef int pthread_barrierattr_t;
typedef struct
{
pthread_mutex_t mutex;
pthread_cond_t cond;
size_t count;
size_t limit;
size_t condfinished;
} pthread_barrier_t;
int
pthread_barrier_init(pthread_barrier_t *b, pthread_barrierattr_t *attr,
unsigned int limit);
int
pthread_barrier_wait(pthread_barrier_t *b);
int
pthread_barrier_destroy(pthread_barrier_t *b);
#endif /* GAL_CONFIG_HAVE_PTHREAD_BARRIER == 0 */
/*******************************************************************/
/************ Thread utilities **************/
/*******************************************************************/
size_t
gal_threads_number();
void
gal_threads_dist_in_threads(size_t numactions, size_t numthreads,
size_t **outthrds, size_t *outthrdcols);
void
gal_threads_attr_barrier_init(pthread_attr_t *attr, pthread_barrier_t *b,
size_t limit);
/*******************************************************************/
/************ Run a function on multiple threads **************/
/*******************************************************************/
struct gal_threads_params
{
size_t id; /* Id of this thread. */
void *params; /* Input structure for higher-level settings. */
size_t *indexs; /* Indexes of actions to be done in this thread. */
pthread_barrier_t *b; /* Pointer the barrier for all threads. */
};
void
gal_threads_spin_off(void *(*worker)(void *), void *caller_params,
size_t numactions, size_t numthreads);
__END_C_DECLS /* From C++ preparations */
#endif /* __GAL_THREADS_H__ */
|