本系列为刘兴(http://deepfuture.iteye.com/)原创,未经笔者授权,任何人和机构不能转载
如果是调试模式,则定义Perl_pending_Slabs_to_ro、S_Slab_to_rw、Perl_op_refcnt_inc、Perl_op_refcnt_dec
否则定义空的Slab_to_rw(op)
Slab_to_rw(op)
#ifdef PERL_DEBUG_READONLY_OPS,
void
Perl_pending_Slabs_to_ro(pTHX) {将所有分配片区转为只读
/* Turn all the allocated op slabs read only. */
U32 count = PL_slab_count;
I32 **const slabs = PL_slabs;
/* Reset the array of pending OP slabs, as we're about to turn this lot
read only. Also, do it ahead of the loop in case the warn triggers,
and a warn handler has an eval */
重置片区数组,我们将其转化为只读,当提前循环时,发出警告,警告程序有一个eval
PL_slabs = NULL;
PL_slab_count = 0;
/* Force a new slab for any further allocation. */
PL_OpSpace = 0;
while (count--) {//处理slabs数组中的每个片区,使用mprotect(start, size, PROT_READ)将其转化为只读,如果出错,则提示
mprotect改变使用mmap映射区域的权限,因为每个片区在调试模式下使用mmap映射的内存区域
void *const start = slabs[count];
const size_t size = PERL_SLAB_SIZE* sizeof(I32*);
if(mprotect(start, size, PROT_READ)) {
Perl_warn(aTHX_ "mprotect for %p %lu failed with %d",
start, (unsigned long) size, errno);
}
}
free(slabs);
}
STATIC void
S_Slab_to_rw(pTHX_ void *op)
{将所有分配片区转为读写
I32 * const * const ptr = (I32 **) op;
I32 * const slab = ptr[-1];
PERL_ARGS_ASSERT_SLAB_TO_RW;
assert( ptr-1 > (I32 **) slab );
assert( ptr < ( (I32 **) slab + PERL_SLAB_SIZE) );
assert( *slab > 0 );
if(mprotect(slab, PERL_SLAB_SIZE*sizeof(I32*), PROT_READ|PROT_WRITE)) {
Perl_warn(aTHX_ "mprotect RW for %p %lu failed with %d",
slab, (unsigned long) PERL_SLAB_SIZE*sizeof(I32*), errno);
}
}
OP *
Perl_op_refcnt_inc(pTHX_ OP *o)
{增加OP引用
if(o) {
Slab_to_rw(o);
++o->op_targ;//使用OP可读写,然后修改
}
return o;
}
PADOFFSET
Perl_op_refcnt_dec(pTHX_ OP *o)
{减少OP引用
PERL_ARGS_ASSERT_OP_REFCNT_DEC;
Slab_to_rw(o);//使用OP可读写,然后修改
return --o->op_targ;
}
#else
# define Slab_to_rw(op)
#endif
分享到:
相关推荐
### GNU编译器家族源码解析 #### 一、引言与背景介绍 GNU Compiler Collection (GCC) 是一套由自由软件基金会(Free Software Foundation, FSF)开发的编译器集合,它支持多种编程语言,如 C、C++、Objective-C、...
任天堂游戏编程探密 任天堂主机由6502处理器和一个特制的图形处理器组成。 CPU是6502,而不是传言中的65C02(CMOS)。 PPU的显存是和CPU的内存是分离的,可以通过对特殊端口的读/写来操作。 卡带可能包含的...
### MP3歌词显示探密——Delphi实现 #### 一、引言 随着数字音频技术的发展,MP3格式因其高质量的音质和较小的文件体积而受到广泛欢迎。对于喜欢边听音乐边看歌词的用户来说,能够实现在播放MP3的同时同步显示歌词...
AMD K6-2 CPU 编号探密 AMD K6-2 CPU 编号探密是指 AMD 公司推出的 K6-2 系列 CPU 的编号系统,用于标识和区分不同型号的 K6-2 处理器。本文将深入探讨 AMD K6-2 CPU 编号的组成部分、编号规则、性能特点和实际应用...
探密电动汽车的无线充电技术
DDR探密.pdf
**Ajax.Hacks探密书籍**是一本专注于Ajax技术的深入解析和实践指南,它揭示了Ajax(Asynchronous JavaScript and XML)技术的核心原理及其在Web开发中的广泛应用。Ajax是一种用于创建快速、动态网页的技术,通过在...
入门级的百科全书,系统地介绍了常用的计算机词汇
【幼儿园政治:其他教案-大鲨鱼探密】 在幼儿教育阶段,政治教案并不局限于传统的政治概念,而是更广泛地涵盖了社会认知、道德情感、生态环保等多方面内容。这篇《大鲨鱼探密》教案就是一个很好的例证,旨在通过...
GNURadio探密.pdf
本文将深入探讨“任天堂游戏编程探密”这一主题,解析相关知识点,旨在为那些对任天堂游戏开发感兴趣的程序员提供指导。 首先,我们要了解任天堂游戏机的基本架构。任天堂游戏平台如Switch、3DS等,都有其独特的...
让我们深入解析一下这个领域的关键知识点。 首先,我们要了解汇编语言。汇编语言是一种低级编程语言,它是计算机硬件可以直接理解的语言,每一个指令都对应一个特定的机器码。在游戏编程中,尤其是在早期的任天堂...
3. 转型阶段:随着测控系统要求的提高,MCS-51系列中的8051单片机通过外围电路与接口电路增加了控制模块,从而具备了智能化控制能力,单片机的微控制器特征更加明显。 4. 成熟阶段:单片机的研制和生产已经形成产业...
《任天堂游戏编程探密》是一本专注于探讨任天堂游戏开发技术的专业书籍,它主要侧重于硬件层面的解析,为读者揭示了游戏开发背后的神秘世界。任天堂作为全球知名的电子游戏公司,其游戏平台如GBA(Game Boy Advance...
一汽大众工厂探密报告.doc
2. **JSON与XML**:Ajax最初与XML关联,但现在更常见的是使用JSON(JavaScript Object Notation),因为它更轻量、易于解析和生成。 3. **动态内容加载**:通过Ajax,可以动态地向页面添加或修改内容,如实时聊天、...