NotifyMyFrontEnd 函数背后的数据缓冲区(一)

简介:
async.c的  

static void 
NotifyMyFrontEnd(const char *channel, const char *payload, int32 srcPid) 函数中的主要逻辑是这样的:

复制代码
if (whereToSendOutput == DestRemote) 
{    
    StringInfoData buf;    
    pq_beginmessage(&buf, 'A');     //cursor 为 A    
    pq_sendint(&buf, srcPid, sizeof(int32)); //追加 srcPid    
    pq_sendstring(&buf, channel);     //追加消息通道名    

    if (PG_PROTOCOL_MAJOR(FrontendProtocol) >= 3)    
         pq_sendstring(&buf, payload);     //追加消息字节流    
    pq_endmessage(&buf);     //发送消息
......    
}
复制代码
从上面看到,向StringInfoData 数据结构填充信息,就表示信息发送结束。

static void 

NotifyMyFrontEnd(const char *channel, const char *payload, int32 srcPid)

pq_endmessage是 pqformat.c 中函数它 调用 pqcomm.c 中的 pq_putmessage函数
pq_putmessage 调用 internal_putbyes函数
internal_putbyes 中 对pqSendPointer 进行操作

关于 pqSendPointer/pqRevPointer,有如下定义:

--------------------------------------------------------------------------------------------
static char PqSendBuffer[PQ_BUFFER_SIZE];
static int PqSendPointer; /* Next index to store a byte in PqSendBuffer */

static char PqRecvBuffer[PQ_BUFFER_SIZE];
static int c; /* Next index to read a byte from PqRecvBuffer */
static int PqRecvLength; /* End of data available in PqRecvBuffer */
---------------------------------------------------------------------------------------------

查阅文档资料:《PostgreSQL数据库内核分析》中2.6.6中也有所说明。

从 internal_putbyes 中的代码逻辑看到,移动指针未加任何锁定机制。

复制代码
static int    
internal_putbytes(const char *s, size_t len)    
{    
   size_t     amount;    
   while (len > 0)    
   {    
      /* If buffer is full, then flush it out */    
      if (PqSendPointer >= PQ_BUFFER_SIZE)    
           if (internal_flush())    
                return EOF;


      amount = PQ_BUFFER_SIZE - PqSendPointer;    
      if (amount > len)    
          amount = len;

      memcpy(PqSendBuffer + PqSendPointer, s, amount);    
      PqSendPointer += amount;    
      s += amount;    
     len -= amount;    
   }    
   return 0;    
}    
复制代码
既然未加锁,那么就可以这样推断:

在每一对客户端和服务器端进程之间,都有这样一个内存缓冲区。
换句话说,有多少个客户端,就会产生多少个这样的 内存缓冲区。

具体如何,还需进一步的验证。









本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/07/17/2594718.html,如需转载请自行联系原作者
目录
相关文章
|
关系型数据库 MySQL 数据库
Windows版MySql8.0安装(亲测成功!)
Windows版MySql8.0安装(亲测成功!)
1174 1
|
5月前
|
设计模式 存储 缓存
【设计模式】【结构型模式】享元模式(Flyweight)
一、入门 什么是享元模式? 享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享对象来减少内存使用,特别适用于存在大量相似对象的情况。 它的核心思想是将对象的内在状态(不变
180 16
|
Java API 数据处理
Java 8新特性之Stream API详解
【2月更文挑战第22天】本文将深入探讨Java 8中引入的Stream API,这是一种基于函数式编程的新特性,用于处理集合数据。我们将详细介绍Stream的基本概念、操作方法以及在实际开发中的应用,帮助读者更好地理解和使用这一强大的工具。
快手私信群发工具,自动批量发送私信脚本插件,导入ID自动关注收藏点赞
这是一款快手自动化营销工具源码,支持精准私信、关注与互动。通过模拟点击和消息发送,可实现全自动打招呼功能
|
Linux iOS开发 MacOS
谷歌浏览器中的谷歌翻译失效了?如何解决谷歌翻译不响应问题?
本文分析了谷歌翻译在谷歌浏览器中失效的原因,并提供了针对Mac OS、Windows和Linux系统的解决方案,包括下载和执行特定软件以修复翻译服务不响应的问题。
1087 0
谷歌浏览器中的谷歌翻译失效了?如何解决谷歌翻译不响应问题?
|
网络协议 Linux Docker
在centos7下通过docker 安装onlyoffice
在centos7下通过docker 安装onlyoffice
1121 0
|
监控 Linux 数据处理
深入了解Linux的logger命令:日志记录与监控
`logger`命令在Linux中用于向系统日志发送消息,便于记录系统事件和应用程序状态。它与`syslogd`配合,允许用户指定优先级、标识符和内容。简单易用,灵活适应不同日志需求。示例:`logger -p user.warning -t MYAPP "A warning occurred."`。注意选择合适优先级,使用有意义的标识符,并结合其他工具如`logrotate`进行日志管理。
|
SQL 存储 HIVE
Hive中的动态分区是什么?请解释其作用和使用场景。
Hive中的动态分区是什么?请解释其作用和使用场景。
282 0
|
C++
面试题:delete和free区别
面试题:delete和free区别
313 0
|
机器学习/深度学习 传感器 算法
【运动学】基于CV、CA、CT三种运动模型轨迹附Matlab代码
【运动学】基于CV、CA、CT三种运动模型轨迹附Matlab代码