Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit44bf3d5

Browse files
committed
Add missing pthread_barrier_t.
Supply a simple implementation of the missing pthread_barrier_t type andfunctions, for macOS.Discussion:https://postgr.es/m/20200227180100.zyvjwzcpiokfsqm2%40alap3.anarazel.de
1 parent547f04e commit44bf3d5

File tree

7 files changed

+196
-0
lines changed

7 files changed

+196
-0
lines changed

‎configure

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11635,6 +11635,62 @@ if test "$ac_res" != no; then :
1163511635

1163611636
fi
1163711637

11638+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing pthread_barrier_wait" >&5
11639+
$as_echo_n "checking for library containing pthread_barrier_wait... " >&6; }
11640+
if ${ac_cv_search_pthread_barrier_wait+:} false; then :
11641+
$as_echo_n "(cached) " >&6
11642+
else
11643+
ac_func_search_save_LIBS=$LIBS
11644+
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
11645+
/* end confdefs.h. */
11646+
11647+
/* Override any GCC internal prototype to avoid an error.
11648+
Use char because int might match the return type of a GCC
11649+
builtin and then its argument prototype would still apply. */
11650+
#ifdef __cplusplus
11651+
extern "C"
11652+
#endif
11653+
char pthread_barrier_wait ();
11654+
int
11655+
main ()
11656+
{
11657+
return pthread_barrier_wait ();
11658+
;
11659+
return 0;
11660+
}
11661+
_ACEOF
11662+
for ac_lib in '' pthread; do
11663+
if test -z "$ac_lib"; then
11664+
ac_res="none required"
11665+
else
11666+
ac_res=-l$ac_lib
11667+
LIBS="-l$ac_lib $ac_func_search_save_LIBS"
11668+
fi
11669+
if ac_fn_c_try_link "$LINENO"; then :
11670+
ac_cv_search_pthread_barrier_wait=$ac_res
11671+
fi
11672+
rm -f core conftest.err conftest.$ac_objext \
11673+
conftest$ac_exeext
11674+
if ${ac_cv_search_pthread_barrier_wait+:} false; then :
11675+
break
11676+
fi
11677+
done
11678+
if ${ac_cv_search_pthread_barrier_wait+:} false; then :
11679+
11680+
else
11681+
ac_cv_search_pthread_barrier_wait=no
11682+
fi
11683+
rm conftest.$ac_ext
11684+
LIBS=$ac_func_search_save_LIBS
11685+
fi
11686+
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_pthread_barrier_wait" >&5
11687+
$as_echo "$ac_cv_search_pthread_barrier_wait" >&6; }
11688+
ac_res=$ac_cv_search_pthread_barrier_wait
11689+
if test "$ac_res" != no; then :
11690+
test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
11691+
11692+
fi
11693+
1163811694
# Solaris:
1163911695
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing fdatasync" >&5
1164011696
$as_echo_n "checking for library containing fdatasync... " >&6; }
@@ -15883,6 +15939,19 @@ esac
1588315939

1588415940
fi
1588515941

15942+
ac_fn_c_check_func "$LINENO" "pthread_barrier_wait" "ac_cv_func_pthread_barrier_wait"
15943+
if test "x$ac_cv_func_pthread_barrier_wait" = xyes; then :
15944+
$as_echo "#define HAVE_PTHREAD_BARRIER_WAIT 1" >>confdefs.h
15945+
15946+
else
15947+
case " $LIBOBJS " in
15948+
*" pthread_barrier_wait.$ac_objext "* ) ;;
15949+
*) LIBOBJS="$LIBOBJS pthread_barrier_wait.$ac_objext"
15950+
;;
15951+
esac
15952+
15953+
fi
15954+
1588615955
ac_fn_c_check_func "$LINENO" "pwrite" "ac_cv_func_pwrite"
1588715956
if test "x$ac_cv_func_pwrite" = xyes; then :
1588815957
$as_echo "#define HAVE_PWRITE 1" >>confdefs.h

‎configure.ac

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1143,6 +1143,7 @@ AC_SEARCH_LIBS(getopt_long, [getopt gnugetopt])
11431143
AC_SEARCH_LIBS(shm_open,rt)
11441144
AC_SEARCH_LIBS(shm_unlink,rt)
11451145
AC_SEARCH_LIBS(clock_gettime,[rt posix4])
1146+
AC_SEARCH_LIBS(pthread_barrier_wait,pthread)
11461147
# Solaris:
11471148
AC_SEARCH_LIBS(fdatasync,[rt posix4])
11481149
# Required for thread_test.c on Solaris
@@ -1743,6 +1744,7 @@ AC_REPLACE_FUNCS(m4_normalize([
17431744
mkdtemp
17441745
pread
17451746
preadv
1747+
pthread_barrier_wait
17461748
pwrite
17471749
pwritev
17481750
random

‎src/include/pg_config.h.in

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,9 @@
424424
/* Define if you have POSIX threads libraries and header files. */
425425
#undef HAVE_PTHREAD
426426

427+
/* Define to 1 if you have the `pthread_barrier_wait' function. */
428+
#undef HAVE_PTHREAD_BARRIER_WAIT
429+
427430
/* Define to 1 if you have the `pthread_is_threaded_np' function. */
428431
#undef HAVE_PTHREAD_IS_THREADED_NP
429432

‎src/include/port/pg_pthread.h

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*-------------------------------------------------------------------------
2+
*
3+
* Declarations for missing POSIX thread components.
4+
*
5+
* Currently this supplies an implementation of pthread_barrier_t for the
6+
* benefit of macOS, which lacks it. These declarations are not in port.h,
7+
* because that'd require <pthread.h> to be included by every translation
8+
* unit.
9+
*
10+
*-------------------------------------------------------------------------
11+
*/
12+
13+
#ifndefPG_PTHREAD_H
14+
#definePG_PTHREAD_H
15+
16+
#include<pthread.h>
17+
18+
#ifndefHAVE_PTHREAD_BARRIER_WAIT
19+
20+
#ifndefPTHREAD_BARRIER_SERIAL_THREAD
21+
#definePTHREAD_BARRIER_SERIAL_THREAD (-1)
22+
#endif
23+
24+
typedefstructpg_pthread_barrier
25+
{
26+
boolsense;/* we only need a one bit phase */
27+
intcount;/* number of threads expected */
28+
intarrived;/* number of threads that have arrived */
29+
pthread_mutex_tmutex;
30+
pthread_cond_tcond;
31+
}pthread_barrier_t;
32+
33+
externintpthread_barrier_init(pthread_barrier_t*barrier,
34+
constvoid*attr,
35+
intcount);
36+
externintpthread_barrier_wait(pthread_barrier_t*barrier);
37+
externintpthread_barrier_destroy(pthread_barrier_t*barrier);
38+
39+
#endif
40+
41+
#endif

‎src/port/pthread_barrier_wait.c

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/*-------------------------------------------------------------------------
2+
*
3+
* pthread_barrier_wait.c
4+
* Implementation of pthread_barrier_t support for platforms lacking it.
5+
*
6+
* Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group
7+
*
8+
* IDENTIFICATION
9+
* src/port/pthread_barrier_wait.c
10+
*
11+
*-------------------------------------------------------------------------
12+
*/
13+
14+
#include"c.h"
15+
16+
#include"port/pg_pthread.h"
17+
18+
int
19+
pthread_barrier_init(pthread_barrier_t*barrier,constvoid*attr,intcount)
20+
{
21+
barrier->sense= false;
22+
barrier->count=count;
23+
barrier->arrived=0;
24+
if (pthread_cond_init(&barrier->cond,NULL)<0)
25+
return-1;
26+
if (pthread_mutex_init(&barrier->mutex,NULL)<0)
27+
{
28+
intsave_errno=errno;
29+
30+
pthread_cond_destroy(&barrier->cond);
31+
errno=save_errno;
32+
33+
return-1;
34+
}
35+
36+
return0;
37+
}
38+
39+
int
40+
pthread_barrier_wait(pthread_barrier_t*barrier)
41+
{
42+
boolinitial_sense;
43+
44+
pthread_mutex_lock(&barrier->mutex);
45+
46+
/* We have arrived at the barrier. */
47+
barrier->arrived++;
48+
Assert(barrier->arrived <=barrier->count);
49+
50+
/* If we were the last to arrive, release the others and return. */
51+
if (barrier->arrived==barrier->count)
52+
{
53+
barrier->arrived=0;
54+
barrier->sense= !barrier->sense;
55+
pthread_mutex_unlock(&barrier->mutex);
56+
pthread_cond_broadcast(&barrier->cond);
57+
58+
returnPTHREAD_BARRIER_SERIAL_THREAD;
59+
}
60+
61+
/* Wait for someone else to flip the sense. */
62+
initial_sense=barrier->sense;
63+
do
64+
{
65+
pthread_cond_wait(&barrier->cond,&barrier->mutex);
66+
}while (barrier->sense==initial_sense);
67+
68+
pthread_mutex_unlock(&barrier->mutex);
69+
70+
return0;
71+
}
72+
73+
int
74+
pthread_barrier_destroy(pthread_barrier_t*barrier)
75+
{
76+
pthread_cond_destroy(&barrier->cond);
77+
pthread_mutex_destroy(&barrier->mutex);
78+
return0;
79+
}

‎src/tools/msvc/Solution.pm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ sub GenerateFiles
333333
HAVE_PSTAT=>undef,
334334
HAVE_PS_STRINGS=>undef,
335335
HAVE_PTHREAD=>undef,
336+
HAVE_PTHREAD_BARRIER_WAIT=>undef,
336337
HAVE_PTHREAD_IS_THREADED_NP=>undef,
337338
HAVE_PTHREAD_PRIO_INHERIT=>undef,
338339
HAVE_PWRITE=>undef,

‎src/tools/pgindent/typedefs.list

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3295,6 +3295,7 @@ proclist_mutable_iter
32953295
proclist_node
32963296
promptStatus_t
32973297
pthread_attr_t
3298+
pthread_barrier_t
32983299
pthread_key_t
32993300
pthread_mutex_t
33003301
pthread_once_t

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp