LAPI_Msgpoll 子例程
用途
使调用线程能够检查通信进度。
库
可用性库 (liblapi_r.a)
C 语法
#include <lapi.h>
int LAPI_Msgpoll(hndl, cnt, info)
lapi_handle_t hndl;
uint cnt;
lapi_msg_info_t *info;
typedef struct {
lapi_msg_state_t status; /* Message status returned from LAPI_Msgpoll */
ulong reserve[10]; /* Reserved */
} lapi_msg_info_t;FORTRAN 语法
include 'lapif.h'
LAPI_MSGPOLL(hndl, cnt, info, ierror)
INTEGER hndl
INTEGER cnt
TYPE (LAPI_MSG_STATE_T) :: info
INTEGER ierror描述
Type of call: 本地进度监视器 (分块)
LAPI_Msgpoll 子例程允许调用线程检查通信进度。 通过此子例程, LAPI 提供了多次运行分派器的方法,直到完成进度或执行指定的最大分派器循环数为止。 此处,将 进展 定义为消息发送操作或消息接收操作的完成。
LAPI_Msgpoll 旨在在中断关闭时使用。 如果用户未显式关闭中断,那么 LAPI 在此子例程中暂时禁用中断方式,因为调用了分派器,它将处理任何暂挂的接收操作。 如果 LAPI 分派器循环达到指定的最大次数,那么调用将返回。 如果在最大计数之前进行进度,那么调用将立即返回。 在任何一种情况下, LAPI 都将通过引用传递的数据结构来报告状态。
lapi_msg_info_t 结构包含类型为 lapi_msg_state_t的标志字段 (status)。 状态 字段中的标志设置为如下所示:
- LAPI_DISP_CNTR
- 如果分派器已循环 恩特 次而未取得进展
- LAPI_SEND_COMPLETE
- 如果消息发送操作已完成
- LAPI_RECV_COMPLETE
- 如果消息接收操作已完成
- LAPI_BOTH_COMPLETE
- 如果一个消息发送操作和一个消息接收操作都已完成
- LAPI_POLLING_NET
- 如果另一个线程已在轮询网络或共享内存完成情况
参数
- INPUT
- 恩德尔
- 指定 LAPI 句柄。
- 恩特
- 指定分派器在返回之前应该循环且没有任何进展的最大次数。
- 信息
- 指定包含 LAPI_Msgpoll() 调用结果的状态结构。
- 输出
- 国际错误
- 指定 FORTRAN 返回码。 这始终是最后一个参数。
C 示例
要在分派器中循环不超过 1000 次,请检查已取得的进展:
{
lapi_msg_info_t msg_info;
int cnt = 1000;
.
.
.
LAPI_Msgpoll(hndl, cnt, &msg_info);
if ( msg_info.status & LAPI_BOTH_COMPLETE ) {
/* both a message receive and a message send have been completed */
} else if ( msg_info.status & LAPI_RECV_COMPLETE ) {
/* just a message receive has been completed */
} else if ( msg_info.status & LAPI_SEND_COMPLETE ) {
/* just a message send has been completed */
} else {
/* cnt loops and no progress */
}
}返回值
- LAPI_SUCCESS
- 指示已成功完成函数调用。
- LAPI_ERR_HNDL_INVALID
- 指示传入的 恩德尔 无效 (未初始化或处于 "已终止" 状态)。
- LAPI_ERR_MSG_INFO_NULL
- 指示 info 指针为 NULL (在 C 中) 或 info 的值为 LAPI_ADDR_NULL (在 FORTRAN 中)。
位置
- /usr/lib/liblapi_r.a