fortran: revert Absoft-based fixes
Rever r32246, r32254, and 32255 -- they were fixing side-effects of the real bug. Real fix coming after this one. This commit was SVN r32286. The following SVN revision numbers were found above: r32246 --> open-mpi/ompi@08d2a1a48d r32254 --> open-mpi/ompi@232d4dbb7b
Этот коммит содержится в:
родитель
ac2621debf
Коммит
4da3c85b54
@ -1,101 +0,0 @@
|
||||
dnl -*- shell-script -*-
|
||||
dnl
|
||||
dnl Copyright (c) 2014 Research Organization for Information Science
|
||||
dnl and Technology (RIST). All rights reserved.
|
||||
dnl $COPYRIGHT$
|
||||
dnl
|
||||
dnl Additional copyrights may follow
|
||||
dnl
|
||||
dnl $HEADER$
|
||||
dnl
|
||||
|
||||
# Check whether or not the Fortran compiler supports subroutines with
|
||||
# the BIND(C, NAME="name") parameter and optional arguments or not,
|
||||
# and we (generally) don't need wrapper subroutines.
|
||||
|
||||
# OMPI_FORTRAN_CHECK_BIND_C_WITH_OPTIONAL_ARGS([action if found],
|
||||
# [action if not found])
|
||||
# ----------------------------------------------------
|
||||
AC_DEFUN([OMPI_FORTRAN_CHECK_BIND_C_WITH_OPTIONAL_ARGS],[
|
||||
unset happy
|
||||
OPAL_VAR_SCOPE_PUSH([happy ompi_conftest_h])
|
||||
|
||||
AC_CACHE_CHECK(
|
||||
[if Fortran compiler supports BIND(C, NAME="name") subroutine with optional arguments],
|
||||
[ompi_cv_fortran_bind_c_with_optional_args],
|
||||
[ompi_cv_fortran_bind_c_with_optional_args=no
|
||||
cat > conftestf.f90 <<EOF
|
||||
program check_for_bind_c_with_optional
|
||||
use, intrinsic :: iso_c_binding
|
||||
|
||||
interface
|
||||
subroutine check_op(i, ierror) BIND(C, name="check_op")
|
||||
integer, intent(in), value :: i
|
||||
integer, intent(out), optional :: ierror
|
||||
end subroutine check_op
|
||||
end interface
|
||||
|
||||
integer :: ierror
|
||||
|
||||
call check_op(0)
|
||||
call check_op(1, ierror)
|
||||
end program
|
||||
EOF
|
||||
|
||||
# C module
|
||||
if test -f conftest.h; then
|
||||
ompi_conftest_h="#include \"conftest.h\""
|
||||
else
|
||||
ompi_conftest_h=""
|
||||
fi
|
||||
cat > conftest.c <<EOF
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
$ompi_conftest_h
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
void check_op(int, int *);
|
||||
|
||||
void check_op(int has_op, int *ierror)
|
||||
{
|
||||
/* Force a segv if the conditions are wrong */
|
||||
char *bogus = 0;
|
||||
if (0 == has_op) {
|
||||
/* won't have optional argument */
|
||||
if (NULL != ierror) *bogus= 13;
|
||||
} else {
|
||||
/* will have optional argument */
|
||||
if (NULL == ierror) *bogus= 13;
|
||||
*ierror = 33;
|
||||
}
|
||||
}
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
EOF
|
||||
|
||||
OPAL_LOG_COMMAND([$CC $CFLAGS -I. -c conftest.c],
|
||||
[OPAL_LOG_COMMAND([$FC $FCFLAGS conftestf.f90 conftest.o -o conftest $LDFLAGS $LIBS],
|
||||
[happy="yes"], [happy="no"])],
|
||||
[happy="c_fail"])
|
||||
|
||||
AS_IF([test "$happy" = "c_fail"],
|
||||
[AC_MSG_RESULT([error])
|
||||
AC_MSG_ERROR([This error should not happen -- contact the Open MPI developers])
|
||||
])
|
||||
|
||||
AS_IF([test "$cross_compiling" = "yes"],
|
||||
[AC_MSG_RESULT([cross-compiling])
|
||||
AC_MSG_ERROR([Cannot determine if Fortran compiler supports optional arguments when cross-compiling])],
|
||||
[OPAL_LOG_COMMAND([./conftest],
|
||||
[ompi_cv_fortran_bind_c_with_optional_args=yes])
|
||||
])
|
||||
rm -f conftest*
|
||||
])dnl
|
||||
|
||||
AS_VAR_COPY([happy], [ompi_cv_fortran_bind_c_with_optional_args])
|
||||
AS_IF([test "$happy" = "yes"], [$1], [$2])
|
||||
OPAL_VAR_SCOPE_POP
|
||||
])
|
@ -15,8 +15,6 @@
|
||||
# Copyright (c) 2006-2007 Los Alamos National Security, LLC. All rights
|
||||
# reserved.
|
||||
# Copyright (c) 2009 Oak Ridge National Labs. All rights reserved.
|
||||
# Copyright (c) 2014 Research Organization for Information Science
|
||||
# and Technology (RIST). All rights reserved.
|
||||
# $COPYRIGHT$
|
||||
#
|
||||
# Additional copyrights may follow
|
||||
@ -38,7 +36,6 @@ AC_DEFUN([OMPI_SETUP_MPI_FORTRAN],[
|
||||
|
||||
OMPI_FORTRAN_HAVE_IGNORE_TKR=0
|
||||
OMPI_FORTRAN_HAVE_OPTIONAL_ARGS=0
|
||||
OMPI_FORTRAN_HAVE_BIND_C_WITH_OPTIONAL_ARGS=0
|
||||
OMPI_FORTRAN_HAVE_BIND_C=0
|
||||
OMPI_FORTRAN_HAVE_ISO_C_BINDING=0
|
||||
OMPI_FORTRAN_HAVE_BIND_C_SUB=0
|
||||
@ -388,16 +385,6 @@ AC_DEFUN([OMPI_SETUP_MPI_FORTRAN],[
|
||||
[OMPI_FORTRAN_HAVE_OPTIONAL_ARGS=0
|
||||
OMPI_BUILD_FORTRAN_USEMPIF08_BINDINGS=0])])
|
||||
|
||||
OMPI_FORTRAN_HAVE_BIND_C_WITH_OPTIONAL_ARGS=0
|
||||
AS_IF([test $OMPI_WANT_FORTRAN_USEMPIF08_BINDINGS -eq 1 -a \
|
||||
$OMPI_BUILD_FORTRAN_USEMPIF08_BINDINGS -eq 1 -a \
|
||||
$OMPI_FORTRAN_HAVE_BIND_C_TYPE_NAME -eq 1 -a \
|
||||
$OMPI_FORTRAN_HAVE_OPTIONAL_ARGS -eq 1],
|
||||
[ # Does the compiler have optional arguments?
|
||||
OMPI_FORTRAN_CHECK_BIND_C_WITH_OPTIONAL_ARGS(
|
||||
[OMPI_FORTRAN_HAVE_BIND_C_WITH_OPTIONAL_ARGS=1],
|
||||
[OMPI_FORTRAN_HAVE_BIND_C_WITH_OPTIONAL_ARGS=0])])
|
||||
|
||||
OMPI_FORTRAN_HAVE_PRIVATE=0
|
||||
AS_IF([test $OMPI_WANT_FORTRAN_USEMPIF08_BINDINGS -eq 1 -a \
|
||||
$OMPI_BUILD_FORTRAN_USEMPIF08_BINDINGS -eq 1],
|
||||
@ -661,9 +648,6 @@ end type test_mpi_handle],
|
||||
AC_DEFINE_UNQUOTED([OMPI_FORTRAN_HAVE_OPTIONAL_ARGS],
|
||||
[$OMPI_FORTRAN_HAVE_OPTIONAL_ARGS],
|
||||
[For ompi_info: whether the Fortran compiler supports optional arguments or not])
|
||||
AC_DEFINE_UNQUOTED([OMPI_FORTRAN_HAVE_BIND_C_WITH_OPTIONAL_ARGS],
|
||||
[$OMPI_FORTRAN_HAVE_BIND_C_WITH_OPTIONAL_ARGS],
|
||||
[For ompi_info: whether the Fortran compiler supports BIND(C, NAME="name") subroutine with optional arguments or not])
|
||||
|
||||
# For configure-fortran-output.h, mpi-f08-types.F90 (and ompi_info)
|
||||
AC_SUBST([OMPI_FORTRAN_HAVE_PRIVATE])
|
||||
@ -700,10 +684,6 @@ end type test_mpi_handle],
|
||||
|
||||
# For configure-fortran-output.h
|
||||
AC_SUBST(OMPI_FORTRAN_HAVE_BIND_C)
|
||||
|
||||
# For configure-fortran-output.h, various files in
|
||||
# ompi/mpi/fortran/use-mpi-f08/*.F90 and *.h files (and ompi_info)
|
||||
AC_SUBST(OMPI_FORTRAN_HAVE_BIND_C_WITH_OPTIONAL_ARGS)
|
||||
|
||||
# Somewhat redundant because ompi/Makefile.am won't traverse into
|
||||
# ompi/mpi/fortran/use-mpi-f08 if it's not to be built, but we
|
||||
|
@ -3,8 +3,6 @@
|
||||
! Copyright (c) 2006-2014 Cisco Systems, Inc. All rights reserved.
|
||||
! Copyright (c) 2009-2012 Los Alamos National Security, LLC.
|
||||
! All rights reserved.
|
||||
! Copyright (c) 2014 Research Organization for Information Science
|
||||
! and Technology (RIST). All rights reserved.
|
||||
!
|
||||
! $COPYRIGHT$
|
||||
!
|
||||
@ -43,9 +41,6 @@
|
||||
! Whether we are building the MPI F08 bindings with subarray support or not
|
||||
#define OMPI_FORTRAN_SUBARRAYS_SUPPORTED @OMPI_FORTRAN_SUBARRAYS_SUPPORTED@
|
||||
|
||||
! Whether we have BIND(C, NAME="name") subroutine with optional parameters or not
|
||||
#define OMPI_FORTRAN_HAVE_BIND_C_WITH_OPTIONAL_ARGS @OMPI_FORTRAN_HAVE_BIND_C_WITH_OPTIONAL_ARGS@
|
||||
|
||||
! Line 1 of the ignore TKR syntax
|
||||
! ...JMS not figured out yet...
|
||||
|
||||
|
@ -7,8 +7,6 @@
|
||||
! of Tennessee Research Foundation. All rights
|
||||
! reserved.
|
||||
! Copyright (c) 2012 Inria. All rights reserved.
|
||||
! Copyright (c) 2014 Research Organization for Information Science
|
||||
! and Technology (RIST). All rights reserved.
|
||||
! $COPYRIGHT$
|
||||
!
|
||||
! This file provides the interface specifications for the MPI Fortran
|
||||
@ -2428,7 +2426,6 @@ subroutine ompi_win_post_f(group,assert,win,ierror) &
|
||||
INTEGER, INTENT(OUT) :: ierror
|
||||
end subroutine ompi_win_post_f
|
||||
|
||||
#if OMPI_FORTRAN_HAVE_BIND_C_WITH_OPTIONAL_ARGS
|
||||
subroutine ompi_win_shared_query_f(win, rank, size, disp_unit, baseptr,&
|
||||
ierror) BIND(C, name="ompi_win_shared_query_f")
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR
|
||||
@ -2440,31 +2437,6 @@ subroutine ompi_win_shared_query_f(win, rank, size, disp_unit, baseptr,&
|
||||
TYPE(C_PTR), INTENT(OUT) :: baseptr
|
||||
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
|
||||
end subroutine ompi_win_shared_query_f
|
||||
#else
|
||||
subroutine ompi_win_shared_query_f_error(win, rank, size, disp_unit, baseptr,&
|
||||
ierror) BIND(C, name="ompi_win_shared_query_f")
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR
|
||||
use :: mpi_f08_types, only : MPI_ADDRESS_KIND
|
||||
INTEGER, INTENT(IN) :: win
|
||||
INTEGER, INTENT(IN) :: rank
|
||||
INTEGER(KIND=MPI_ADDRESS_KIND), INTENT(OUT) :: size
|
||||
INTEGER, INTENT(OUT) :: disp_unit
|
||||
TYPE(C_PTR), INTENT(OUT) :: baseptr
|
||||
INTEGER, INTENT(OUT) :: ierror
|
||||
end subroutine ompi_win_shared_query_f_error
|
||||
subroutine ompi_win_shared_query_f(win, rank, size, disp_unit, baseptr,&
|
||||
ierror)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR
|
||||
use :: mpi_f08_types, only : MPI_ADDRESS_KIND
|
||||
implicit none
|
||||
INTEGER, INTENT(IN) :: win
|
||||
INTEGER, INTENT(IN) :: rank
|
||||
INTEGER(KIND=MPI_ADDRESS_KIND), INTENT(OUT) :: size
|
||||
INTEGER, INTENT(OUT) :: disp_unit
|
||||
TYPE(C_PTR), INTENT(OUT) :: baseptr
|
||||
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
|
||||
end subroutine ompi_win_shared_query_f
|
||||
#endif
|
||||
|
||||
subroutine ompi_win_start_f(group,assert,win,ierror) &
|
||||
BIND(C, name="ompi_win_start_f")
|
||||
|
@ -13,8 +13,6 @@
|
||||
! Copyright (c) 2006-2014 Cisco Systems, Inc. All rights reserved.
|
||||
! Copyright (c) 2009-2012 Los Alamos National Security, LLC.
|
||||
! All rights reserved.
|
||||
! Copyright (c) 2014 Research Organization for Information Science
|
||||
! and Technology (RIST). All rights reserved.
|
||||
! $COPYRIGHT$
|
||||
!
|
||||
! Additional copyrights may follow
|
||||
@ -47,39 +45,3 @@ module mpi_f08
|
||||
include "conversion-fn-null-f08-interface.h"
|
||||
|
||||
end module mpi_f08
|
||||
|
||||
#if ! OMPI_FORTRAN_HAVE_BIND_C_WITH_OPTIONAL_ARGS
|
||||
subroutine ompi_win_shared_query_f(win, rank, size, disp_unit, baseptr,&
|
||||
ierror)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR
|
||||
use :: mpi_f08_types, only : MPI_ADDRESS_KIND
|
||||
use :: mpi_f08, only : ompi_win_shared_query_f_error
|
||||
implicit none
|
||||
INTEGER, INTENT(IN) :: win
|
||||
INTEGER, INTENT(IN) :: rank
|
||||
INTEGER(KIND=MPI_ADDRESS_KIND), INTENT(OUT) :: size
|
||||
INTEGER, INTENT(OUT) :: disp_unit
|
||||
TYPE(C_PTR), INTENT(OUT) :: baseptr
|
||||
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
|
||||
INTEGER :: cerror
|
||||
call ompi_win_shared_query_f_error(win, rank, size, disp_unit, baseptr, cerror)
|
||||
if (present(ierror)) ierror = cerror
|
||||
end subroutine ompi_win_shared_query_f
|
||||
|
||||
subroutine pompi_win_shared_query_f(win, rank, size, disp_unit, baseptr,&
|
||||
ierror)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR
|
||||
use :: mpi_f08_types, only : MPI_ADDRESS_KIND
|
||||
use :: mpi_f08, only : pompi_win_shared_query_f_error
|
||||
implicit none
|
||||
INTEGER, INTENT(IN) :: win
|
||||
INTEGER, INTENT(IN) :: rank
|
||||
INTEGER(KIND=MPI_ADDRESS_KIND), INTENT(OUT) :: size
|
||||
INTEGER, INTENT(OUT) :: disp_unit
|
||||
TYPE(C_PTR), INTENT(OUT) :: baseptr
|
||||
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
|
||||
INTEGER :: cerror
|
||||
call pompi_win_shared_query_f_error(win, rank, size, disp_unit, baseptr, cerror)
|
||||
if (present(ierror)) ierror = cerror
|
||||
end subroutine pompi_win_shared_query_f
|
||||
#endif
|
||||
|
@ -7,8 +7,6 @@
|
||||
! of Tennessee Research Foundation. All rights
|
||||
! reserved.
|
||||
! Copyright (c) 2012 Inria. All rights reserved.
|
||||
! Copyright (c) 2014 Research Organization for Information Science
|
||||
! and Technology (RIST). All rights reserved.
|
||||
! $COPYRIGHT$
|
||||
!
|
||||
! This file provides the interface specifications for the MPI Fortran
|
||||
@ -2265,9 +2263,8 @@ subroutine pompi_win_post_f(group,assert,win,ierror) &
|
||||
INTEGER, INTENT(OUT) :: ierror
|
||||
end subroutine pompi_win_post_f
|
||||
|
||||
#if OMPI_FORTRAN_HAVE_BIND_C_WITH_OPTIONAL_ARGS
|
||||
subroutine pompi_win_shared_query_f(win, rank, size, disp_unit, baseptr,&
|
||||
ierror) BIND(C, name="pompi_win_shared_query_f")
|
||||
ierror) BIND(C, name="ompi_win_shared_query_f")
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR
|
||||
use :: mpi_f08_types, only : MPI_ADDRESS_KIND
|
||||
INTEGER, INTENT(IN) :: win
|
||||
@ -2277,31 +2274,6 @@ subroutine pompi_win_shared_query_f(win, rank, size, disp_unit, baseptr,&
|
||||
TYPE(C_PTR), INTENT(OUT) :: baseptr
|
||||
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
|
||||
end subroutine pompi_win_shared_query_f
|
||||
#else
|
||||
subroutine pompi_win_shared_query_f_error(win, rank, size, disp_unit, baseptr,&
|
||||
ierror) BIND(C, name="ompi_win_shared_query_f")
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR
|
||||
use :: mpi_f08_types, only : MPI_ADDRESS_KIND
|
||||
INTEGER, INTENT(IN) :: win
|
||||
INTEGER, INTENT(IN) :: rank
|
||||
INTEGER(KIND=MPI_ADDRESS_KIND), INTENT(OUT) :: size
|
||||
INTEGER, INTENT(OUT) :: disp_unit
|
||||
TYPE(C_PTR), INTENT(OUT) :: baseptr
|
||||
INTEGER, INTENT(OUT) :: ierror
|
||||
end subroutine pompi_win_shared_query_f_error
|
||||
|
||||
subroutine pmpi_win_shared_query_f(win, rank, size, disp_unit, baseptr,&
|
||||
ierror)
|
||||
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR
|
||||
use :: mpi_f08_types, only : MPI_ADDRESS_KIND
|
||||
INTEGER, INTENT(IN) :: win
|
||||
INTEGER, INTENT(IN) :: rank
|
||||
INTEGER(KIND=MPI_ADDRESS_KIND), INTENT(OUT) :: size
|
||||
INTEGER, INTENT(OUT) :: disp_unit
|
||||
TYPE(C_PTR), INTENT(OUT) :: baseptr
|
||||
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
|
||||
end subroutine pmpi_win_shared_query_f
|
||||
#endif
|
||||
|
||||
subroutine pompi_win_start_f(group,assert,win,ierror) &
|
||||
BIND(C, name="pompi_win_start_f")
|
||||
|
@ -857,50 +857,51 @@ were placed to begin with.
|
||||
.
|
||||
.PP
|
||||
To bind processes, one must first associate them with the resources
|
||||
on which they should run. For example, the \fI-bycore\fP option
|
||||
on which they should run. For example, the \fI--map-by core\fP option
|
||||
associates the processes on a node with successive cores. Or,
|
||||
\fI-bysocket\fP associates the processes with successive processor sockets,
|
||||
\fI--map-by socket\fP associates the processes with successive processor sockets,
|
||||
cycling through the sockets in a round-robin fashion if necessary.
|
||||
And \fI-cpus-per-proc\fP indicates how many cores to bind per process.
|
||||
.
|
||||
.PP
|
||||
But, such association is meaningless unless the processes are actually
|
||||
bound to those resources. The binding option specifies the granularity
|
||||
of binding -- say, with \fI-bind-to-core\fP or \fI-bind-to-socket\fP.
|
||||
One can also turn binding off with \fI-bind-to-none\fP, which is
|
||||
of binding -- say, with \fI-bind-to core\fP or \fI-bind-to socket\fP.
|
||||
One can also turn binding off with \fI-bind-to none\fP, which is
|
||||
typically the default.
|
||||
.\" JMS ^^ THE ABOVE STATEMENT IS NO LONGER TRUE.
|
||||
.
|
||||
.PP
|
||||
Finally, \fI-report-bindings\fP can be used to report bindings.
|
||||
Finally, \fI--report-bindings\fP can be used to report bindings.
|
||||
.
|
||||
.PP
|
||||
As an example, consider a node with two processor sockets, each comprising
|
||||
four cores. We run \fImpirun\fP with \fI-np 4 -report-bindings\fP and
|
||||
four cores. We run \fImpirun\fP with \fI-np 4 --report-bindings\fP and
|
||||
the following additional options:
|
||||
.
|
||||
|
||||
% mpirun ... -bycore -bind-to-core
|
||||
% mpirun ... --map-by core --bind-to core
|
||||
[...] ... binding child [...,0] to cpus 0001
|
||||
[...] ... binding child [...,1] to cpus 0002
|
||||
[...] ... binding child [...,2] to cpus 0004
|
||||
[...] ... binding child [...,3] to cpus 0008
|
||||
|
||||
% mpirun ... -bysocket -bind-to-socket
|
||||
% mpirun ... --map-by socket -0bind-to socket
|
||||
[...] ... binding child [...,0] to socket 0 cpus 000f
|
||||
[...] ... binding child [...,1] to socket 1 cpus 00f0
|
||||
[...] ... binding child [...,2] to socket 0 cpus 000f
|
||||
[...] ... binding child [...,3] to socket 1 cpus 00f0
|
||||
|
||||
% mpirun ... -cpus-per-proc 2 -bind-to-core
|
||||
% mpirun ... --map-by core:PE=2 -bind-to core
|
||||
[...] ... binding child [...,0] to cpus 0003
|
||||
[...] ... binding child [...,1] to cpus 000c
|
||||
[...] ... binding child [...,2] to cpus 0030
|
||||
[...] ... binding child [...,3] to cpus 00c0
|
||||
|
||||
% mpirun ... -bind-to-none
|
||||
% mpirun ... --bind-to none
|
||||
.
|
||||
.PP
|
||||
Here, \fI-report-bindings\fP shows the binding of each process as a mask.
|
||||
Here, \fI--report-bindings\fP shows the binding of each process as a mask.
|
||||
In the first case, the processes bind to successive cores as indicated by
|
||||
the masks 0001, 0002, 0004, and 0008. In the second case, processes bind
|
||||
to all cores on successive sockets as indicated by the masks 000f and 00f0.
|
||||
@ -925,11 +926,12 @@ The correspondences are:
|
||||
|
||||
mpirun option MCA parameter key value
|
||||
|
||||
-bycore rmaps_base_schedule_policy core
|
||||
-bysocket rmaps_base_schedule_policy socket
|
||||
-bind-to-core orte_process_binding core
|
||||
-bind-to-socket orte_process_binding socket
|
||||
-bind-to-none orte_process_binding none
|
||||
--map-by core rmaps_base_schedule_policy core
|
||||
--map-by socket rmaps_base_schedule_policy socket
|
||||
--bind-to core orte_process_binding core
|
||||
--bind-to socket orte_process_binding socket
|
||||
--bind-to none orte_process_binding none
|
||||
.\" JMS I DON'T KNOW IF THESE ARE STILL THE RIGHT MCA PARAM NAMES
|
||||
.
|
||||
.PP
|
||||
The \fIorte_process_binding\fP value can also take on the
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user