⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spinlock.h

📁 xen虚拟机源代码安装包
💻 H
字号:
#ifndef __ASM_SPINLOCK_H#define __ASM_SPINLOCK_H#include <xen/config.h>#include <xen/lib.h>#include <asm/atomic.h>#include <asm/rwlock.h>typedef struct {    volatile s16 lock;    s8 recurse_cpu;    u8 recurse_cnt;} spinlock_t;#define SPIN_LOCK_UNLOCKED /*(spinlock_t)*/ { 1, -1, 0 }#define spin_lock_init(x)	do { *(x) = (spinlock_t) SPIN_LOCK_UNLOCKED; } while(0)#define spin_is_locked(x)	(*(volatile char *)(&(x)->lock) <= 0)static inline void _raw_spin_lock(spinlock_t *lock){    __asm__ __volatile__ (        "1:  lock; decb %0         \n"        "    js 2f                 \n"        ".section .text.lock,\"ax\"\n"        "2:  rep; nop              \n"        "    cmpb $0,%0            \n"        "    jle 2b                \n"        "    jmp 1b                \n"        ".previous"        : "=m" (lock->lock) : : "memory" );}static inline void _raw_spin_unlock(spinlock_t *lock){    ASSERT(spin_is_locked(lock));    __asm__ __volatile__ (	"movb $1,%0"         : "=m" (lock->lock) : : "memory" );}static inline int _raw_spin_trylock(spinlock_t *lock){    char oldval;    __asm__ __volatile__(        "xchgb %b0,%1"        :"=q" (oldval), "=m" (lock->lock)        :"0" (0) : "memory");    return oldval > 0;}/* * spin_[un]lock_recursive(): Use these forms when the lock can (safely!) be * reentered recursively on the same CPU. All critical regions that may form * part of a recursively-nested set must be protected by these forms. If there * are any critical regions that cannot form part of such a set, they can use * standard spin_[un]lock(). */#define _raw_spin_lock_recursive(_lock)            \    do {                                           \        int cpu = smp_processor_id();              \        if ( likely((_lock)->recurse_cpu != cpu) ) \        {                                          \            spin_lock(_lock);                      \            (_lock)->recurse_cpu = cpu;            \        }                                          \        (_lock)->recurse_cnt++;                    \    } while ( 0 )#define _raw_spin_unlock_recursive(_lock)          \    do {                                           \        if ( likely(--(_lock)->recurse_cnt == 0) ) \        {                                          \            (_lock)->recurse_cpu = -1;             \            spin_unlock(_lock);                    \        }                                          \    } while ( 0 )typedef struct {    volatile unsigned int lock;} rwlock_t;#define RW_LOCK_UNLOCKED /*(rwlock_t)*/ { RW_LOCK_BIAS }#define rwlock_init(x)	do { *(x) = (rwlock_t) RW_LOCK_UNLOCKED; } while(0)/* * On x86, we implement read-write locks as a 32-bit counter * with the high bit (sign) being the "contended" bit. */static inline void _raw_read_lock(rwlock_t *rw){    __build_read_lock(rw, "__read_lock_failed");}static inline void _raw_write_lock(rwlock_t *rw){    __build_write_lock(rw, "__write_lock_failed");}#define _raw_read_unlock(rw)                       \    __asm__ __volatile__ (                         \        "lock ; incl %0" :                         \        "=m" ((rw)->lock) : : "memory" )#define _raw_write_unlock(rw)                      \    __asm__ __volatile__ (                         \        "lock ; addl $" RW_LOCK_BIAS_STR ",%0" :   \        "=m" ((rw)->lock) : : "memory" )#endif /* __ASM_SPINLOCK_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -