标签:style blog ar color 使用 sp for 文件 on
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
做游戏的同学想必对云风很熟悉。这一段时间他开发的skynet和ejoy2d两个软件框架在github上很火。其中skynet是为游戏服务器开发的,可以看成是一个service框架,ejoy2d是一个客户端的代码,内容不多,主要封装了opengl的一些接口,很多人不一定看得上。
我对游戏服务器不熟,但是服务器的相关代码还是看了一些的。之前vsftpd、redis、sshd、mysqld的代码也看过不少,多少知道一点。这次趁周末将skynet的代码看了一下,收获还是蛮多的。不管是Makefile、lua、service、networking,看得出来云风在服务器上面的造诣还是很深厚的。当然,最令我感兴趣的还是其中读写锁的写法,我也是第一次看到这种写法,和linux kernel中读写锁的写法也不一样。
#ifndef _RWLOCK_H_
#define _RWLOCK_H_
struct rwlock {
int write;
int read;
};
static inline void
rwlock_init(struct rwlock *lock) {
lock->write = 0;
lock->read = 0;
}
static inline void
rwlock_rlock(struct rwlock *lock) {
for (;;) {
while(lock->write) {
__sync_synchronize();
}
__sync_add_and_fetch(&lock->read,1);
if (lock->write) {
__sync_sub_and_fetch(&lock->read,1);
} else {
break;
}
}
}
static inline void
rwlock_wlock(struct rwlock *lock) {
while (__sync_lock_test_and_set(&lock->write,1)) {}
while(lock->read) {
__sync_synchronize();
}
}
static inline void
rwlock_wunlock(struct rwlock *lock) {
__sync_lock_release(&lock->write);
}
static inline void
rwlock_runlock(struct rwlock *lock) {
__sync_sub_and_fetch(&lock->read,1);
}
#endif标签:style blog ar color 使用 sp for 文件 on
原文地址:http://blog.csdn.net/feixiaoxing/article/details/41415329