首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
系统相关
> 详细
Memcached源码分析之memcached.h
时间:
2016-09-07 17:43:38
阅读:
343
评论:
0
收藏:
0
[点我收藏+]
标签:
//memcached.h
//返回在item中data字段key的地址,即把指针指向key
#define
ITEM_key
(
item
)
(((
char
*)&((
item
)->
data
))
\
+
(((
item
)->
it_flags
&
ITEM_CAS
)
?
sizeof
(
uint64_t
)
:
0
))
//返回在item中data字段suffix的地址,即把指针指向suffix
#define
ITEM_suffix
(
item
)
((
char
*)
&((
item
)->
data
)
+
(
item
)->
nkey
+
1
\
+
(((
item
)->
it_flags
&
ITEM_CAS
)
?
sizeof
(
uint64_t
)
:
0
))
//返回在item中data字段value的地址,即把指针指向value
#define
ITEM_data
(
item
)
((
char
*)
&((
item
)->
data
)
+
(
item
)->
nkey
+
1
\
+
(
item
)->
nsuffix \
+
(((
item
)->
it_flags
&
ITEM_CAS
)
?
sizeof
(
uint64_t
)
:
0
))
//item总字节数
#define
ITEM_ntotal
(
item
)
(
sizeof
(
struct
_stritem
)
+
(
item
)->
nkey
+
1
\
+
(
item
)->
nsuffix
+
(
item
)->
nbytes \
+
(((
item
)->
it_flags
&
ITEM_CAS
)
?
sizeof
(
uint64_t
)
:
0
))
//conn结构体中state字段的枚举,代表连接状态
enum
conn_states
{
conn_listening
,
/**< the socket which listens for connections */
conn_new_cmd
,
/**< Prepare connection for next command */
conn_waiting
,
/**< waiting for a readable socket */
conn_read
,
/**< reading in a command line */
conn_parse_cmd
,
/**< try to parse a command from the input buffer */
conn_write
,
/**< writing out a simple response */
conn_nread
,
/**< reading in a fixed number of bytes */
conn_swallow
,
/**< swallowing unnecessary bytes w/o storing */
conn_closing
,
/**< closing this connection */
conn_mwrite
,
/**< writing out many items sequentially */
conn_closed
,
/**< connection is closed */
conn_max_state
/**< Max state value (used for assertion) */
};
//item保存结果枚举
enum
store_item_type
{
NOT_STORED
=
0
,
STORED
,
EXISTS
,
NOT_FOUND
};
//item结构体
typedef
struct
_stritem
{
struct
_stritem
*
next
;
//链表中下一个,这个链表有可能是slots链表,也有可能是LRU链表,但一个item不可能同时这两个链表中,所以复用一个指针。
struct
_stritem
*
prev
;
//链表中上一个。
struct
_stritem
*
h_next
;
//相同hash值中链表的下一个。
rel_time_t
time
;
//最近访问时间
rel_time_t
exptime
;
//过期时间
int
nbytes
;
//value的字节数
unsigned
short
refcount
;
//引用计数
uint8_t
nsuffix
;
//后缀长度
uint8_t
it_flags
;
//标记
uint8_t
slabs_clsid
;
//item所在的slabclass的id值
uint8_t
nkey
;
//键长
/* this odd type prevents type-punning issues when we do
* the little shuffle to save space when not using CAS. */
union
{
uint64_t
cas
;
char
end
;
}
data
[];
//数据,这个数据不仅仅包括key对应的value,还有key、CAS、后缀等等数据也存在此,所以它有4部分“拼”成:CAS(可选),KEY,后缀,VALUE。
/* if it_flags & ITEM_CAS we have 8 bytes CAS */
/* then null-terminated key */
/* then " flags length\r\n" (no terminating null) */
/* then data with terminating \r\n (no terminating null; it‘s binary!) */
}
item
;
/**
worker线程结构体
*/
typedef
struct
{
pthread_t
thread_id
;
//线程id
struct
event_base
*
base
;
//每个线程自己独立的event_base,监听的就是下面的notify_event事件对象
struct
event
notify_event
;
//事件对象,fd即为下面的notify_receive_fd
int
notify_receive_fd
;
//管道接收fd
int
notify_send_fd
;
//管道写入fd
struct
thread_stats stats
;
//线程的一些统计
struct
conn_queue
*
new_conn_queue
;
//连接参数对象CQ_ITEM队列
cache_t
*
suffix_cache
;
uint8_t
item_lock_type
;
//控制线程锁的粒度
}
LIBEVENT_THREAD
;
/**
主线程结构体
*/
typedef
struct
{
pthread_t
thread_id
;
//线程id
struct
event_base
*
base
;
//event_base
}
LIBEVENT_DISPATCHER_THREAD
;
typedef
struct
conn conn
;
struct
conn
{
int
sfd
;
//连接的socket fd
sasl_conn_t
*
sasl_conn
;
bool
authenticated
;
enum
conn_states state
;
//当前的连接状态
enum
bin_substates substate
;
rel_time_t
last_cmd_time
;
struct
event
event
;
// 监听的事件
short
ev_flags
;
//监听的事件 类型
short
which
;
/** which events were just triggered */
//刚触发的事件
/**
读buffer会涉及两个方向上的“读”:
一个是从socket读进来到rbuf里面
一个是从rbuf里面把数据读出去解析,读buffer相当于一个中介,从socket读进来最终还是得被别人读出去解析,而
rcurr工作指针与rbytes就是在rbuf数据被读出去解析的时候用到,用来控制可以读出去被解析的数据还剩余多少。
*/
char
*
rbuf
;
/** buffer to read commands into */
//读buffer
char
*
rcurr
;
/** but if we parsed some already, this is where we stopped */
//读buffer的当前指针
int
rsize
;
/** total allocated size of rbuf */
//读buffer大小
int
rbytes
;
/** how much data, starting from rcur, do we have unparsed */
//剩余buffer字节数
//下面4个属性和上面4个类似
char
*
wbuf
;
char
*
wcurr
;
int
wsize
;
int
wbytes
;
/** which state to go into after finishing current write */
enum
conn_states write_and_go
;
//完成当前写操作后,连接状态将会置为此状态
void
*
write_and_free
;
/** free this memory after finishing writing */
char
*
ritem
;
/** when we read in an item‘s value, it goes here */
//这个指针指向item结构体中data中的value地址
int
rlbytes
;
//尚未读完item的data的value的字节数
void
*
item
;
/* for commands set/add/replace */
//当执行set/add/replace 命令时,此指针用于指向分配的item空间
/* data for the swallow state */
int
sbytes
;
/* how many bytes to swallow */
//下面是往socket写出数据时用的字段
struct
iovec
*
iov
;
//iovec结构体数组
int
iovsize
;
//*iov数组大小
int
iovused
;
//*iov数组已被使用的元素个数
struct
msghdr
*
msglist
;
//msghdr结构体数组,表示sendmsg要发送的消息列表
int
msgsize
;
//*msglist数组大小
int
msgused
;
//*msglist数组已使用的元素个数
int
msgcurr
;
//当前要发送的msghdr
int
msgbytes
;
//当前msghdr的字节数
item
**
ilist
;
//get key1 key2命令时,要发送给客户端的item列表
int
isize
;
//列表大小
item
**
icurr
;
//当前要发送的item
int
ileft
;
//剩余数目
char
**
suffixlist
;
int
suffixsize
;
char
**
suffixcurr
;
int
suffixleft
;
enum
protocol protocol
;
/* which protocol this connection speaks */
enum
network_transport transport
;
/* what transport is used by this connection */
//UDP相关的字段
int
request_id
;
/* Incoming UDP request ID, if this is a UDP "connection" */
struct
sockaddr_in6 request_addr
;
/* udp: Who sent the most recent request */
socklen_t
request_addr_size
;
unsigned
char
*
hdrbuf
;
/* udp packet headers */
int
hdrsize
;
/* number of headers‘ worth of space is allocated */
bool
noreply
;
/* True if the reply should not be sent. */
/* current stats command */
struct
{
char
*
buffer
;
size_t
size
;
size_t
offset
;
}
stats
;
// 二进制相关的字段
protocol_binary_request_header binary_header
;
uint64_t
cas
;
/* the cas to return */
short
cmd
;
/* current command being processed */
int
opaque
;
int
keylen
;
conn
*
next
;
/* Used for generating a list of conn structures */
LIBEVENT_THREAD
*
thread
;
/* Pointer to the thread object serving this connection */
};
//非阻塞方式获取互斥锁
static
inline
int
mutex_lock
(
pthread_mutex_t
*
mutex
)
{
while
(
pthread_mutex_trylock
(
mutex
));
return
0
;
}
//释放锁
#define
mutex_unlock
(
x
)
pthread_mutex_unlock
(
x
)
#include
"stats.h"
#include
"slabs.h"
#include
"assoc.h"
#include
"items.h"
#include
"trace.h"
#include
"hash.h"
#include
"util.h"
Memcached源码分析之memcached.h
标签:
原文地址:http://www.cnblogs.com/guolanzhu/p/5850117.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
gitlab 在linux安装环境下存储地址
2021-07-29
当 Mac 未检测到外部显示器时如何修复它
2021-07-29
Ubuntu18.04安装qemu遇到问题-qemu : Depends: qemu-system (>= 1:2.11+dfsg-1ubuntu7)
2021-07-28
[Linux]Shell编程【待续】
2021-07-28
Linux系统资源查看
2021-07-27
Archlinux爬坑指南
2021-07-27
[Linux]Linux发展历程
2021-07-27
非桌面系统 (ubuntu)安装google-chrome
2021-07-27
在Ubuntu18.04系统中源码安装 gcc7.3.0
2021-07-23
Linux快捷键杂记
2021-07-22
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!