1717 * Copyright (c) 2015 Research Organization for Information Science
1818 * and Technology (RIST). All rights reserved.
1919 * Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
20+ * Copyright (c) 2019 FUJITSU LIMITED. All rights reserved.
2021 * $COPYRIGHT$
2122 *
2223 * Additional copyrights may follow
@@ -672,6 +673,39 @@ static void* getReadPtrvRank(
672673 return ptr ;
673674}
674675
676+ static void * getReadPtrwRank (
677+ ompi_java_buffer_t * * item , JNIEnv * env , jobject buf ,
678+ int * offsets , int * counts , int * displs , int size ,
679+ int rank , MPI_Datatype * types , int * baseTypes )
680+ {
681+ int extent = getTypeExtent (env , types [rank ]),
682+ length = getCountv (counts , displs , size );
683+ void * ptr = getBuffer (env , item , length );
684+ int rootOff = offsets [rank ] + displs [rank ];
685+
686+ if (opal_datatype_is_contiguous_memory_layout (& types [rank ]-> super , counts [rank ]))
687+ {
688+ int rootLength = extent * counts [rank ];
689+ void * rootPtr = (char * )ptr + displs [rank ];
690+ getArrayRegion (env , buf , baseTypes [rank ], rootOff , rootLength , rootPtr );
691+ }
692+ else
693+ {
694+ void * inBuf , * inBase ;
695+ inBuf = ompi_java_getArrayCritical (& inBase , env , buf , rootOff );
696+
697+ int rc = opal_datatype_copy_content_same_ddt (
698+ & types [rank ]-> super , counts [rank ], ptr , inBuf );
699+
700+ ompi_java_exceptionCheck (env ,
701+ rc == OPAL_SUCCESS ? OMPI_SUCCESS : OMPI_ERROR );
702+
703+ (* env )-> ReleasePrimitiveArrayCritical (env , buf , inBase , JNI_ABORT );
704+ }
705+
706+ return ptr ;
707+ }
708+
675709static void * getReadPtrvAll (
676710 ompi_java_buffer_t * * item , JNIEnv * env , jobject buf ,
677711 int offset , int * counts , int * displs , int size ,
@@ -716,6 +750,49 @@ static void* getReadPtrvAll(
716750 return ptr ;
717751}
718752
753+ static void * getReadPtrwAll (
754+ ompi_java_buffer_t * * item , JNIEnv * env , jobject buf ,
755+ int * offsets , int * counts , int * displs , int size ,
756+ MPI_Datatype * types , int * baseTypes )
757+ {
758+
759+ int length = getCountv (counts , displs , size );
760+ void * ptr = getBuffer (env , item , length );
761+
762+ for (int i = 0 ; i < size ; i ++ )
763+ {
764+ int extent = getTypeExtent (env , types [i ]);
765+
766+ if (opal_datatype_is_contiguous_memory_layout (& types [i ]-> super , 2 ))
767+ {
768+ int iOff = offsets [i ] + displs [i ],
769+ iLen = extent * counts [i ];
770+ void * iPtr = (char * )ptr + displs [i ];
771+ getArrayRegion (env , buf , baseTypes [i ], iOff , iLen , iPtr );
772+ }
773+ else
774+ {
775+ void * bufPtr , * bufBase ;
776+ bufPtr = ompi_java_getArrayCritical (& bufBase , env , buf , offsets [i ]);
777+
778+ int iOff = displs [i ];
779+ char * iBuf = iOff + (char * )bufPtr ,
780+ * iPtr = iOff + (char * )ptr ;
781+
782+ int rc = opal_datatype_copy_content_same_ddt (
783+ & types [i ]-> super , counts [i ], iPtr , iBuf );
784+
785+ ompi_java_exceptionCheck (env ,
786+ rc == OPAL_SUCCESS ? OMPI_SUCCESS : OMPI_ERROR );
787+
788+ (* env )-> ReleasePrimitiveArrayCritical (env , buf , bufBase , JNI_ABORT );
789+ }
790+
791+ }
792+
793+ return ptr ;
794+ }
795+
719796static void * getWritePtr (ompi_java_buffer_t * * item , JNIEnv * env ,
720797 int count , MPI_Datatype type )
721798{
@@ -735,6 +812,14 @@ static void* getWritePtrv(ompi_java_buffer_t **item, JNIEnv *env,
735812 return getBuffer (env , item , length );
736813}
737814
815+ static void * getWritePtrw (ompi_java_buffer_t * * item , JNIEnv * env ,
816+ int * counts , int * displs , int size , MPI_Datatype * types )
817+ {
818+ int length = getCountv (counts , displs , size );
819+
820+ return getBuffer (env , item , length );
821+ }
822+
738823void ompi_java_getReadPtr (
739824 void * * ptr , ompi_java_buffer_t * * item , JNIEnv * env , jobject buf ,
740825 jboolean db , int offset , int count , MPI_Datatype type , int baseType )
@@ -810,6 +895,39 @@ void ompi_java_getReadPtrv(
810895 }
811896}
812897
898+ void ompi_java_getReadPtrw (
899+ void * * ptr , ompi_java_buffer_t * * item , JNIEnv * env ,
900+ jobject buf , jboolean db , int * offsets , int * counts , int * displs ,
901+ int size , int rank , MPI_Datatype * types , int * baseTypes )
902+ {
903+ int i ;
904+
905+ if (buf == NULL )
906+ {
907+ /* Allow NULL buffers to send/recv 0 items as control messages. */
908+ * ptr = NULL ;
909+ * item = NULL ;
910+ }
911+ else if (db )
912+ {
913+ for (i = 0 ; i < size ; i ++ ){
914+ assert (offsets [i ] == 0 );
915+ }
916+ * ptr = (* env )-> GetDirectBufferAddress (env , buf );
917+ * item = NULL ;
918+ }
919+ else if (rank == -1 )
920+ {
921+ * ptr = getReadPtrwAll (item , env , buf , offsets , counts ,
922+ displs , size , types , baseTypes );
923+ }
924+ else
925+ {
926+ * ptr = getReadPtrwRank (item , env , buf , offsets , counts ,
927+ displs , size , rank , types , baseTypes );
928+ }
929+ }
930+
813931void ompi_java_releaseReadPtr (
814932 void * ptr , ompi_java_buffer_t * item , jobject buf , jboolean db )
815933{
@@ -859,6 +977,27 @@ void ompi_java_getWritePtrv(
859977 }
860978}
861979
980+ void ompi_java_getWritePtrw (
981+ void * * ptr , ompi_java_buffer_t * * item , JNIEnv * env , jobject buf ,
982+ jboolean db , int * counts , int * displs , int size , MPI_Datatype * types )
983+ {
984+ if (buf == NULL )
985+ {
986+ /* Allow NULL buffers to send/recv 0 items as control messages. */
987+ * ptr = NULL ;
988+ * item = NULL ;
989+ }
990+ else if (db )
991+ {
992+ * ptr = (* env )-> GetDirectBufferAddress (env , buf );
993+ * item = NULL ;
994+ }
995+ else
996+ {
997+ * ptr = getWritePtrw (item , env , counts , displs , size , types );
998+ }
999+ }
1000+
8621001void ompi_java_releaseWritePtr (
8631002 void * ptr , ompi_java_buffer_t * item , JNIEnv * env , jobject buf ,
8641003 jboolean db , int offset , int count , MPI_Datatype type , int baseType )
@@ -933,6 +1072,49 @@ void ompi_java_releaseWritePtrv(
9331072 releaseBuffer (ptr , item );
9341073}
9351074
1075+ void ompi_java_releaseWritePtrw (
1076+ void * ptr , ompi_java_buffer_t * item , JNIEnv * env ,
1077+ jobject buf , jboolean db , int * offsets , int * counts , int * displs ,
1078+ int size , MPI_Datatype * types , int * baseTypes )
1079+ {
1080+ if (db || !buf || !ptr )
1081+ return ;
1082+
1083+ int i ;
1084+
1085+ for (i = 0 ; i < size ; i ++ )
1086+ {
1087+ int extent = getTypeExtent (env , types [i ]);
1088+
1089+ if (opal_datatype_is_contiguous_memory_layout (& types [i ]-> super , 2 ))
1090+ {
1091+ int iOff = offsets [i ] + displs [i ],
1092+ iLen = extent * counts [i ];
1093+ void * iPtr = (char * )ptr + displs [i ];
1094+ setArrayRegion (env , buf , baseTypes [i ], iOff , iLen , iPtr );
1095+ }
1096+ else
1097+ {
1098+ void * bufPtr , * bufBase ;
1099+
1100+ bufPtr = ompi_java_getArrayCritical (& bufBase , env , buf , offsets [i ]);
1101+ int iOff = displs [i ];
1102+ char * iBuf = iOff + (char * )bufPtr ,
1103+ * iPtr = iOff + (char * )ptr ;
1104+
1105+ int rc = opal_datatype_copy_content_same_ddt (
1106+ & types [i ]-> super , counts [i ], iBuf , iPtr );
1107+
1108+ ompi_java_exceptionCheck (env ,
1109+ rc == OPAL_SUCCESS ? OMPI_SUCCESS : OMPI_ERROR );
1110+
1111+ (* env )-> ReleasePrimitiveArrayCritical (env , buf , bufBase , 0 );
1112+ }
1113+
1114+ }
1115+ releaseBuffer (ptr , item );
1116+ }
1117+
9361118jobject ompi_java_Integer_valueOf (JNIEnv * env , jint i )
9371119{
9381120 return (* env )-> CallStaticObjectMethod (env ,
0 commit comments