参考:
- wine 8.14
作用:等待一个send message获得reply。
static void wait_message_reply(UINT flags)
{
struct user_thread_info * thread_info = get_user_thread_info();
HANDLE server_queue = get_server_queue_handle();
unsigned int wake_mask = QS_SMRESULT | ((flags & SMTO_BLOCK) ? 0 : QS_SENDMESSAGE);
for(;;)
{
unsigned int wake_bits = 0;
SERVER_START_REQ(set_queue_mask)
{
req->wake_mask = wake_mask;
req->changed_mask = wake_mask;
req->skip_wait = 1;
if(!wine_server_call(req)) wake_bits = reply->wake_bits & wake_mask;
}
SERVER_END_REQ;
thread_info->wake_mask = thread_info->changed_mask = 0;
if(wake_bits & QS_SMRESULT) return;
if(wake_bits & QS_SENDMESSAGE)
{
process_sent_message();
continue;
}
wait_message(1, &server_queue, INFINITE, wake_mask, 0);
}
}
此函数只是通过for循环来确定当函数返回时,server端线程消息队列的wake_bits为 QS_SMRESULT, 但是并没有指明具体是那一条消息。不过此函数被send_inter_thread_message和send_hardware_message调用,具体来说,可能是在等待这两类消息的回复。在等待的过程中如果消息队列中存在其它线程或应用程序发送的线程(QS_SENDMESSAGE),则必须调用函数process_sent_messages()函数进行处理。目前并不清楚 QS_SMRESULT的作用。具体的wait 动作是由函数wait_message承担。