登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
登录
注册
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
5
Star
0
Fork
20
OpenCloudOS Stream
/
glibc
代码
Issues
1
Pull Requests
1
Wiki
统计
流水线
服务
JavaDoc
PHPDoc
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
我知道了,不再自动展开
33
backport patch to fix [BZ #25847]
已合并
abushwang:master
OpenCloudOS Stream:master
abushwang
创建于 2025-07-16 14:12
克隆/下载
HTTPS
SSH
复制
下载 Email Patch
下载 Diff 文件
# 变更点介绍 1. 优化了 pthread_cond_wait / pthread_cond_signal 系列接口的执行逻辑,修复潜在的死等问题 2. __pthread_cond_s 结构体删除了 __g_refs[2] __LOCK_ALIGNMENT,为了保证兼容,又补充了两个 unsigned int 类型占位符  # 影响分析 1. pthread_cond_wait / pthread_cond_signal 仅内部实现变化来修复[BZ #25847],无对外变更 2. __pthread_cond_s 是内部结构体(开头下划线的一般都是内部结构),用户仅感知 api,且结构体的总成员数量是不变的,无对外变更 # 补丁介绍 0001 为核心bugfix,其余均为基于bugfix后的代码优化 ## 0001 对pthread条件变量的内部实现重构,主要修改了__condvar_quiesce_and_switch_g1函数中处理组切换的逻辑: 1. 修改的核心内容: 简化了G1组关闭机制:移除了复杂的自旋等待和futex阻塞逻辑,原先需要设置关闭标志、等待所有组引用清零的复杂流程被大幅简化 采用直接唤醒策略:新实现通过直接将__g_signals推进到"lowseq"值来防止等待者阻塞,如果检测到仍有等待者持有组引用,就直接调用futex_wake唤醒所有等待者 消除潜在的lost wakeup问题:通过确保给整个G1组提供足够的信号量,避免了可能导致等待者永久阻塞的竞态条件 2. ABI/API变更情况: 没有涉及ABI/API变更。这个修改完全是pthread条件变量的内部实现优化,不影响任何公开接口。所有对外的pthread条件变量API(如pthread_cond_wait、pthread_cond_signal等)的行为和接口保持不变,只是内部的唤醒机制更加健壮和高效。 这个修改的目的是修复潜在的"lost wakeup"问题,即在某些竞态条件下等待线程可能错过唤醒信号而永久阻塞的bug。 ## 0002 这个commit是对前一个条件变量实现修改的清理工作,主要修复了注释中的错误描述。 ## 0003 移除了条件变量组切换中的一个不必要的catch-all唤醒机制,该机制原本用于再次唤醒可能仍持有组引用的等待者,但由于组切换只在所有等待者都已被唤醒后才执行,这个额外的唤醒并不能加速进程且会使代码复杂化,因此被删除以简化逻辑。 ## 0004 移除了pthread_cond_wait中的三个不必要的重复检查(保留了一个),包括死代码的自旋等待检查(因为maxspin为0)、原子增量操作后的多余检查,以及在已有信号的组中的冗余检查,从而简化了代码逻辑并提高了可读性。 ## 0005 从pthread条件变量中移除了__g_refs字段及其相关逻辑,该字段原本用于跟踪每个组中睡眠线程的数量以便在组切换时等待所有线程确认唤醒,但由于新的实现不再需要这种等待机制,因此移除了这个变量和相关的引用计数操作,从而简化了条件变量的结构和代码逻辑。 ## 0006 将pthread_cond_wait中的嵌套循环结构简化为单个循环,将原本在外层do-while循环中的信号获取逻辑移入内层循环的信号可用分支中,同时将所有goto语句替换为break语句,从而使代码结构更加清晰简洁。 ## 0007 纯粹的代码格式修复,专门用来调整前一个commit(将嵌套循环改为单层循环)后产生的缩进问题,将原本过度缩进的代码块调整到正确的缩进层级,以便前一个commit的功能性变更更容易进行代码审查。 ## 0008 将函数__condvar_quiesce_and_switch_g1重命名为__condvar_switch_g1,因为经过前面的修改该函数不再需要等待线程离开G1组,所以移除了名称中的"quiesce"部分,并同步更新了所有相关的函数调用和注释说明。 ## 0009 移除了g1_start和g_signals中LSB位的特殊用途(原本LSB用于标识哪个组是G2),简化了相关的位操作逻辑(如将信号操作从+2/-2改为+1/-1),从而让这两个字段可以使用全部位数,提高了对数值溢出的容忍度。 ## 0010 在pthread_cond_s结构体末尾添加了两个未使用的字段(__unused_initialized_1和__unused_initialized_2),并相应更新了PTHREAD_COND_INITIALIZER宏,以确保与glibc 2.41之前版本的二进制兼容性
此 Pull Request 需要通过一些审核项
类型
指派人员
状态
审查
rockerzhu
ZoeDong
cunshunxia
ocs-bot
已审查通过
已完成
(1/1人)
测试
ocs-bot
已测试通过
已完成
(1/1人)
怎样手动合并此 Pull Request
git checkout master
git pull https://gitee.com/abushwang/glibc_ocs.git master
git push origin master
评论
28
提交
1
文件
11
检查
代码问题
0
批量操作
展开设置
折叠设置
审查
Code Owner
审查人员
ZoeDong
ZoeDong
rockerzhu
rockerzhu
abushwang
abushwang
licunlong
licunlong
ocs-bot
ocs-bot
cunshunxia
cunshunxia
未设置
最少人数
1
测试
ZoeDong
ZoeDong
rockerzhu
rockerzhu
abushwang
abushwang
licunlong
licunlong
ocs-bot
ocs-bot
未设置
最少人数
1
优先级
不指定
严重
主要
次要
不重要
标签
build_passed
gating_passed
scratch_passed
bugfix
mistake/abi
mistake/api
ci_compat_changed
hand_compat_passed
关联 Issue
未关联
Pull Request 合并后将关闭上述关联 Issue
里程碑
未关联里程碑
参与者
(5)
1
https://gitee.com/opencloudos-stream/glibc.git
git@gitee.com:opencloudos-stream/glibc.git
opencloudos-stream
glibc
glibc
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册