Last active
July 23, 2021 04:29
-
-
Save losophy/3958fefacaf6e3bb45373f107149f782 to your computer and use it in GitHub Desktop.
skynet中的自旋锁
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifndef SKYNET_SPINLOCK_H | |
#define SKYNET_SPINLOCK_H | |
#define SPIN_INIT(q) spinlock_init(&(q)->lock); | |
#define SPIN_LOCK(q) spinlock_lock(&(q)->lock); | |
#define SPIN_UNLOCK(q) spinlock_unlock(&(q)->lock); | |
#define SPIN_DESTROY(q) spinlock_destroy(&(q)->lock); | |
#ifndef USE_PTHREAD_LOCK | |
//用到了gcc自带的原子操作函数实现了spinlock | |
struct spinlock { | |
int lock; | |
}; | |
static inline void | |
spinlock_init(struct spinlock *lock) { | |
lock->lock = 0; | |
} | |
static inline void | |
spinlock_lock(struct spinlock *lock) { | |
while (__sync_lock_test_and_set(&lock->lock,1)) {} | |
} | |
static inline int | |
spinlock_trylock(struct spinlock *lock) { | |
return __sync_lock_test_and_set(&lock->lock,1) == 0; | |
} | |
static inline void | |
spinlock_unlock(struct spinlock *lock) { | |
__sync_lock_release(&lock->lock); | |
} | |
static inline void | |
spinlock_destroy(struct spinlock *lock) { | |
(void) lock; | |
} | |
#else | |
#include <pthread.h> | |
// we use mutex instead of spinlock for some reason | |
// you can also replace to pthread_spinlock | |
struct spinlock { | |
pthread_mutex_t lock; | |
}; | |
static inline void | |
spinlock_init(struct spinlock *lock) { | |
pthread_mutex_init(&lock->lock, NULL); | |
} | |
static inline void | |
spinlock_lock(struct spinlock *lock) { | |
pthread_mutex_lock(&lock->lock); | |
} | |
static inline int | |
spinlock_trylock(struct spinlock *lock) { | |
return pthread_mutex_trylock(&lock->lock) == 0; | |
} | |
static inline void | |
spinlock_unlock(struct spinlock *lock) { | |
pthread_mutex_unlock(&lock->lock); | |
} | |
static inline void | |
spinlock_destroy(struct spinlock *lock) { | |
pthread_mutex_destroy(&lock->lock); | |
} | |
#endif | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment