开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
forked from Jasen/cetus
加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
master
分支 (14)
标签 (23)
master
test
feature/backends
info/log
subtable
tmp/ad593ef
partition
optimize
bugfix/drop_database
parser/index_hint
single-process
enhance/persistence
enhance/mgr
optimize_sql_parser
v2.3.7
v2.3.6
v2.3.5
v2.3.3
v2.3.2
v2.3.1
v2.3.0
v2.2.9
v2.2.8
v2.2.7
v1.3.0
v2.2.6
v2.2.5
v2.2.4
v1.2.0
v2.2.3
v2.2.1
v2.2.0
v1.1.1
v2.1.0
master
分支 (14)
标签 (23)
master
test
feature/backends
info/log
subtable
tmp/ad593ef
partition
optimize
bugfix/drop_database
parser/index_hint
single-process
enhance/persistence
enhance/mgr
optimize_sql_parser
v2.3.7
v2.3.6
v2.3.5
v2.3.3
v2.3.2
v2.3.1
v2.3.0
v2.2.9
v2.2.8
v2.2.7
v1.3.0
v2.2.6
v2.2.5
v2.2.4
v1.2.0
v2.2.3
v2.2.1
v2.2.0
v1.1.1
v2.1.0
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
master
分支 (14)
标签 (23)
master
test
feature/backends
info/log
subtable
tmp/ad593ef
partition
optimize
bugfix/drop_database
parser/index_hint
single-process
enhance/persistence
enhance/mgr
optimize_sql_parser
v2.3.7
v2.3.6
v2.3.5
v2.3.3
v2.3.2
v2.3.1
v2.3.0
v2.2.9
v2.2.8
v2.2.7
v1.3.0
v2.2.6
v2.2.5
v2.2.4
v1.2.0
v2.2.3
v2.2.1
v2.2.0
v1.1.1
v2.1.0
cetus
/
src
/
network-queue.c
cetus
/
src
/
network-queue.c
network-queue.c 4.76 KB
一键复制 编辑 原始数据 按行查看 历史
王斌 提交于 2018年12月10日 10:35 +08:00 . Optimize memory allocations
/* $%BEGINLICENSE%$
Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; version 2 of the
License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
02110-1301 USA
$%ENDLICENSE%$ */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "glib-ext.h"
#include "network-queue.h"
#include "network-mysqld-proto.h"
network_queue *
network_queue_new()
{
network_queue *queue;
queue = g_new0(network_queue, 1);
queue->chunks = g_queue_new();
return queue;
}
void
network_queue_free(network_queue *queue)
{
if (!queue)
return;
GString *packet;
while ((packet = g_queue_pop_head(queue->chunks))) {
g_string_free(packet, TRUE);
}
g_queue_free(queue->chunks);
g_free(queue);
}
void
network_queue_clear(network_queue *queue)
{
if (!queue)
return;
GString *packet;
while ((packet = g_queue_pop_head(queue->chunks)) != NULL) {
g_string_free(packet, TRUE);
}
queue->len = queue->offset = 0;
}
int
network_queue_append(network_queue *queue, GString *s)
{
if (s->len == 0) {
g_warning("%s: packet len:%d", G_STRLOC, (int)s->len);
}
if (s->len > PACKET_LEN_MAX) {
g_warning("%s: packet len:%d is too long", G_STRLOC, (int)s->len);
}
queue->len += s->len;
g_queue_push_tail(queue->chunks, s);
return 0;
}
/**
* get a string from the head of the queue and leave the queue unchanged
*
* @param queue the queue to read from
* @param peek_len bytes to collect
* @param dest GString to write it. If NULL, we allow a new one and return it
* @return NULL if not enough data
* if dest is not NULL, dest, otherwise a new GString containing the data
*/
GString *
network_queue_peek_str(network_queue *queue, gsize peek_len, GString *dest)
{
gsize we_want = peek_len;
GList *node;
/*
* TODO: convert to DTrace probe
* g_debug("[%s] looking for %d bytes, queue has %d", G_STRLOC, peek_len, queue->len);
*/
if (queue->len < peek_len) {
return NULL;
}
if (!dest) {
/* no define */
dest = g_string_sized_new(calculate_alloc_len(peek_len));
}
g_assert_cmpint(dest->allocated_len, >, peek_len);
for (node = queue->chunks->head; node && we_want; node = node->next) {
GString *chunk = node->data;
if (node == queue->chunks->head) {
gsize we_have = we_want < (chunk->len - queue->offset) ? we_want : (chunk->len - queue->offset);
g_string_append_len(dest, chunk->str + queue->offset, we_have);
we_want -= we_have;
} else {
gsize we_have = we_want < chunk->len ? we_want : chunk->len;
g_string_append_len(dest, chunk->str, we_have);
we_want -= we_have;
}
}
return dest;
}
/**
* get a string from the head of the queue and remove the chunks from the queue
*/
GString *
network_queue_pop_str(network_queue *queue, gsize steal_len, GString *dest)
{
gsize we_want = steal_len;
GString *chunk;
if (queue->len < steal_len) {
return NULL;
}
while ((chunk = g_queue_peek_head(queue->chunks))) {
gsize we_have = we_want < (chunk->len - queue->offset) ? we_want : (chunk->len - queue->offset);
if (!dest && (queue->offset == 0) && (chunk->len == steal_len)) {
/* optimize the common case that we want to have to full chunk
*
* if dest is null, we can remove the GString from the queue and
* return it directly without copying it
*/
dest = g_queue_pop_head(queue->chunks);
queue->len -= we_have;
return dest;
}
if (!dest) {
/* if we don't have a dest-buffer yet, create one */
dest = g_string_sized_new(calculate_alloc_len(steal_len));
}
g_string_append_len(dest, chunk->str + queue->offset, we_have);
queue->offset += we_have;
queue->len -= we_have;
we_want -= we_have;
if (chunk->len == queue->offset) {
/* the chunk is done, remove it */
g_string_free(g_queue_pop_head(queue->chunks), TRUE);
queue->offset = 0;
} else {
break;
}
}
return dest;
}
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

Cetus是由C语言开发的关系型数据库MySQL的中间件,主要提供了一个全面的数据库访问代理功能。Cetus连接方式与MySQL基本兼容,应用程序几乎不用修改即可通过Cetus访问数据库,实现了数据库层的水平扩展和高可用。
暂无标签
GPL-2.0
使用 GPL-2.0 开源许可协议
, GPL-2.0
使用 GPL-2.0 开源许可协议
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C
1
https://gitee.com/netdebug/cetus.git
git@gitee.com:netdebug/cetus.git
netdebug
cetus
cetus
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /