免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2944 | 回复: 0
打印 上一主题 下一主题

请问大虾这段mutex的代码何解? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-09 19:41 |只看该作者 |倒序浏览
10可用积分
今天学习pthread_mutex机制的时候,看到pthread_mutex_lock最后调用到了lll_futex_wait(i386版本),就是无法锁定时排队等待的部分,code是C的内嵌汇编。
语法(Output,Input,Modifier)我基本上能够看懂,就是不知道内核是如何保存当前的线程信息,供lll_futex_wake来唤醒被阻塞的线程的?
下面的offsetof(tcbhead_t, sysinfo)仅仅是得到一个常数的偏移值

#define lll_futex_wait(futex, val) \ futex是一个int*,指向mutex成员中的lock
  ({                                                                          \
    int __status;                                                             \
    register __typeof (val) _val asm ("edx") = (val);                         \
    __asm __volatile (LLL_EBX_LOAD                                            \
                      LLL_ENTER_KERNEL                                        \
                      LLL_EBX_LOAD                                            \
                      : "=a" (__status)                                       \
                      : "0" (SYS_futex), LLL_EBX_REG (futex), "S" (0),        \
                        "c" (FUTEX_WAIT), "d" (_val),                         \
                        "i" (offsetof (tcbhead_t, sysinfo))                   \
                      : "memory");                                            \
    __status;                                                                 \
  })

#ifdef PIC
# define LLL_EBX_LOAD   "xchgl %2, %%ebx\n"
# define LLL_EBX_REG    "D"
#else
# define LLL_EBX_LOAD
# define LLL_EBX_REG    "b"
#endif

#ifdef I386_USE_SYSENTER
# ifdef SHARED
#  define LLL_ENTER_KERNEL      "call *%%gs:%P6\n\t"
# else
#  define LLL_ENTER_KERNEL      "call *_dl_sysinfo\n\t"
# endif
#else
# define LLL_ENTER_KERNEL       "int $0x80\n\t"
#endif

[ 本帖最后由 yausrnm 于 2007-2-9 23:59 编辑 ]

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP