PostgreSQL源碼解讀(218)-spinlock的實現

本節介紹了spinlock在不同平臺(主要是X86_64和aarch74)下的實現.

成都創新互聯專注為客戶提供全方位的互聯網綜合服務,包含不限于成都網站制作、成都做網站、涿鹿網絡推廣、小程序設計、涿鹿網絡營銷、涿鹿企業策劃、涿鹿品牌公關、搜索引擎seo、人物專訪、企業宣傳片、企業代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;成都創新互聯為所有大學生創業者提供涿鹿建站搭建服務,24小時服務熱線:028-86922220,官方網址:m.kartarina.com

/*-------------------------------------------------------------------------
 *
 * s_lock.h
 *     Hardware-dependent implementation of spinlocks.
 ...

一、實現

X86_64
TAS意思是Test And Set.在X86_64平臺下,spinlock的實現使用了匯編語言.

#ifdef __x86_64__       /* AMD Opteron, Intel EM64T */
#define HAS_TEST_AND_SET
typedef unsigned char slock_t;
#define TAS(lock) tas(lock)
/*
 * On Intel EM64T, it's a win to use a non-locking test before the xchg proper,
 * but only when spinning.
 *
 * See also Implementing Scalable Atomic Locks for Multi-Core Intel(tm) EM64T
 * and IA32, by Michael Chynoweth and Mary R. Lee. As of this writing, it is
 * available at:
 * http://software.intel.com/en-us/articles/implementing-scalable-atomic-locks-for-multi-core-intel-em64t-and-ia32-architectures
 */
#define TAS_SPIN(lock)    (*(lock) ? 1 : TAS(lock))
static __inline__ int
tas(volatile slock_t *lock)
{
    register slock_t _res = 1;
    __asm__ __volatile__(
        "   lock            \n"
        "   xchgb   %0,%1   \n"
:       "+q"(_res), "+m"(*lock)
:       /* no inputs */
:       "memory", "cc");
    return (int) _res;
}
#define SPIN_DELAY() spin_delay()
static __inline__ void
spin_delay(void)
{
    /*
     * Adding a PAUSE in the spin delay loop is demonstrably a no-op on
     * Opteron, but it may be of some use on EM64T, so we keep it.
     */
    __asm__ __volatile__(
        " rep; nop          \n");
}
#endif   /* __x86_64__ */

aarch74
在aarch74(ARM64)下,使用了__sync_lock_test_and_set函數實現(如可用的情況下)

/*
 * On ARM and ARM64, we use __sync_lock_test_and_set(int *, int) if available.
 *
 * We use the int-width variant of the builtin because it works on more chips
 * than other widths.
 */
#if defined(__arm__) || defined(__arm) || defined(__aarch74__) || defined(__aarch74)
#ifdef HAVE_GCC__SYNC_INT32_TAS
#define HAS_TEST_AND_SET
#define TAS(lock) tas(lock)
typedef int slock_t;
static __inline__ int
tas(volatile slock_t *lock)
{
    return __sync_lock_test_and_set(lock, 1);
}
#define S_UNLOCK(lock) __sync_lock_release(lock)
#endif   /* HAVE_GCC__SYNC_INT32_TAS */
#endif   /* __arm__ || __arm || __aarch74__ || __aarch74 */

二、參考資料

s_lock.h
PostgreSQL中的鎖

網站標題:PostgreSQL源碼解讀(218)-spinlock的實現
鏈接分享:http://m.kartarina.com/article16/pgojgg.html

成都網站建設公司_創新互聯,為您提供定制網站網站維護云服務器關鍵詞優化品牌網站建設自適應網站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都定制網站網頁設計
主站蜘蛛池模板: 久久久g0g0午夜无码精品 | 亚洲一本到无码av中文字幕| 亚洲国产精品无码中文字| 亚洲AV永久纯肉无码精品动漫 | 亚洲AV无码成人精品区日韩| 精品久久久久久无码中文字幕漫画| WWW久久无码天堂MV| 无码孕妇孕交在线观看| 亚洲国产精品无码久久| 中文字幕丰满乱孑伦无码专区| 久久亚洲精品无码AV红樱桃| 日韩精品无码Av一区二区| 无码人妻精品中文字幕| 亚洲熟妇少妇任你躁在线观看无码| 无码精品人妻一区二区三区中| 亚洲Av无码国产情品久久| 91精品久久久久久无码| 国产色综合久久无码有码 | 无码射肉在线播放视频| 久久精品中文字幕无码| 粉嫩大学生无套内射无码卡视频| 成人免费无码大片a毛片| 日韩人妻无码中文字幕视频 | 四虎成人精品无码| 免费a级毛片无码a∨免费软件| 无码人妻精品一二三区免费| 久久久久无码专区亚洲av| 亚洲AV永久无码天堂影院| 日韩精品无码免费一区二区三区| 国产精品无码专区在线观看| 国产午夜无码视频免费网站| 人妻精品久久无码区| 在线看片无码永久免费视频| 无码专区AAAAAA免费视频| 无码少妇一区二区三区| 亚洲情XO亚洲色XO无码| 韩国19禁无遮挡啪啪无码网站| 久久99久久无码毛片一区二区| 中文无码熟妇人妻AV在线| 亚洲人成无码www久久久| 国产av无码专区亚洲av果冻传媒|