wine之wait_message_reply

参考:

  1. 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承担。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容