设为首页 收藏本站
查看: 843|回复: 0

[经验分享] 探秘perl-解析perl源码(4)

[复制链接]

尚未签到

发表于 2017-5-17 06:07:35 | 显示全部楼层 |阅读模式
  void
Perl_Slab_Free(pTHX_ void *op)
{
  //释放某个slab片区
  
    I32 * const * const ptr = (I32 **) op;
    I32 * const slab = ptr[-1];
    PERL_ARGS_ASSERT_SLAB_FREE;
    assert( ptr-1 > (I32 **) slab );
    assert( ptr < ( (I32 **) slab + PERL_SLAB_SIZE) );
    assert( *slab > 0 );
    Slab_to_rw(op);
    if (--(*slab) == 0) {
#  ifdef NETWARE
#    define PerlMemShared PerlMem
#  endif
 
#ifdef PERL_DEBUG_READONLY_OPS
 U32 count = PL_slab_count;
 /* Need to remove this slab from our list of slabs */
 if (count) {
     while (count--) {//在片区数组中找到需要的free的片区
     if (PL_slabs[count] == slab) {//找到该片区slab
      dVAR;
      /* Found it. Move the entry at the end to overwrite it.  */
      DEBUG_m(PerlIO_printf(Perl_debug_log,
       "Deallocate %p by moving %p from %lu to %lu\n",
       PL_OpSlab,
       PL_slabs[PL_slab_count - 1],
       PL_slab_count, count));
      PL_slabs[count] = PL_slabs[--PL_slab_count];//将PL_slabs[PL_slab_count-1]即PL_slabs底部的片区移动至被释放片区中(这里的移动是指针)
      /* Could realloc smaller at this point, but probably not
         worth it.  */
      if(munmap(slab, PERL_SLAB_SIZE*sizeof(I32*))) {//释放片区
   perror("munmap failed");
   abort();
      }
 
      break;
  }
     }
 }
#else
    PerlMemShared_free(slab);{//释放片区

#endif
 if (slab == PL_OpSlab)  {//该片区已经用完
      PL_OpSpace = 0;
 }
    }
}
#endif
  
/*
 * In the following definition, the ", (OP*)0" is just to make the compiler
 * think the expression is of the right type: croak actually does a Siglongjmp.
 */
#define CHECKOP(type,o) \
    ((PL_op_mask && PL_op_mask[type])    \
     ? ( op_free((OP*)o),     \
  Perl_croak(aTHX_ "'%s' trapped by operation mask", PL_op_desc[type]), \
  (OP*)0 )      \
     : CALL_FPTR(PL_check[type])(aTHX_ (OP*)o))
  #define RETURN_UNLIMITED_NUMBER (PERL_INT_MAX / 2)
  STATIC const char*
S_gv_ename(pTHX_ GV *gv)
{
    SV* const tmpsv = sv_newmortal();
  PERL_ARGS_ASSERT_GV_ENAME;
  gv_efullname3(tmpsv, gv, NULL);
    return SvPV_nolen_const(tmpsv);
}
  STATIC OP *
S_no_fh_allowed(pTHX_ OP *o)
{
    PERL_ARGS_ASSERT_NO_FH_ALLOWED;
  yyerror(Perl_form(aTHX_ "Missing comma after first argument to %s function",
   OP_DESC(o)));
    return o;
}
  STATIC OP *
S_too_few_arguments(pTHX_ OP *o, const char *name)
{
    PERL_ARGS_ASSERT_TOO_FEW_ARGUMENTS;
  yyerror(Perl_form(aTHX_ "Not enough arguments for %s", name));
    return o;
}
  STATIC OP *
S_too_many_arguments(pTHX_ OP *o, const char *name)
{
    PERL_ARGS_ASSERT_TOO_MANY_ARGUMENTS;
  yyerror(Perl_form(aTHX_ "Too many arguments for %s", name));
    return o;
}
  STATIC void
S_bad_type(pTHX_ I32 n, const char *t, const char *name, const OP *kid)
{
    PERL_ARGS_ASSERT_BAD_TYPE;
  yyerror(Perl_form(aTHX_ "Type of arg %d to %s must be %s (not %s)",
   (int)n, name, t, OP_DESC(kid)));
}
  STATIC void
S_no_bareword_allowed(pTHX_ const OP *o)
{
    PERL_ARGS_ASSERT_NO_BAREWORD_ALLOWED;
  if (PL_madskills)
 return;  /* various ok barewords are hidden in extra OP_NULL */
    qerror(Perl_mess(aTHX_
       "Bareword \"%"SVf"\" not allowed while \"strict subs\" in use",
       SVfARG(cSVOPo_sv)));
}
  /* "register" allocation */

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-378218-1-1.html 上篇帖子: 初识Perl/Catalyst 下篇帖子: perl 视频资料
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表