原文地址:http://blog.csdn.net/tyheist/article/details/37053327
实用函数 - utils.c/h
-
-
-
-
-
-
-
-
-
-
-
#define calloc_a(len, ...) __calloc_a(len, ##__VA_ARGS__, NULL)
-
-
-
-
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
Socket帮助函数 - usock.c/h
类型标志
-
#define USOCK_TCP 0
-
#define USOCK_UDP 1
-
-
#define USOCK_SERVER 0x0100
-
#define USOCK_NOCLOEXEC 0x0200
-
#define USOCK_NONBLOCK 0x0400
-
#define USOCK_NUMERIC 0x0800
-
#define USOCK_IPV6ONLY 0x2000
-
#define USOCK_IPV4ONLY 0x4000
-
#define USOCK_UNIX 0x8000
接口说明
-
-
-
-
-
-
-
-
-
int usock(int type, const char *host, const char *service)
双向链表 - list.h
数据结构
-
struct list_head {
-
struct list_head *next;
-
struct list_head *prev;
-
};
初始化
-
#define LIST_HEAD_INIT(name) { &(name), &(name) }
-
#undef LIST_HEAD
-
#define LIST_HEAD(name) struct list_head name = LIST_HEAD_INIT(name)
-
static inline void INIT_LIST_HEAD(struct list_head *list)
基本操作
加入
-
-
-
-
list_add(struct list_head *_new, struct list_head *head)
-
-
-
-
-
list_add_tail(struct list_head *_new, struct list_head *head)
移动
-
-
-
-
list_move(struct list_head *list, struct list_head *head)
-
-
-
-
-
list_move_tail(struct list_head *entry, struct list_head *head)
拼接
-
-
-
-
list_splice(const struct list_head *list, struct list_head *head)
-
-
-
-
-
list_splice_tail(struct list_head *list, struct list_head *head)
-
-
-
-
-
list_splice_init(struct list_head *list, struct list_head *head)
-
-
-
-
-
list_splice_tail_init(struct list_head *list, struct list_head *head)
删除
-
-
-
-
list_del(struct list_head *entry)
-
-
-
-
-
list_del_init(struct list_head *entry)
获取链表节点元素
-
-
-
-
list_entry(ptr, type, field)
-
-
-
-
-
list_first_entry(ptr, type, field)
-
-
-
-
-
list_last_entry(ptr, type, field)
状态判断
-
-
-
-
bool list_empty(const struct list_head *head)
-
-
-
-
-
bool list_is_first(const struct list_head *list, const struct list_head *head)
-
-
-
-
-
bool list_is_last(const struct list_head *list, const struct list_head *head)
遍历链表
-
-
-
-
list_for_each(p, head)
-
-
-
-
-
list_for_each_safe(p, n, head)
-
-
-
-
-
list_for_each_prev(p, h)
-
-
-
-
-
list_for_each_prev_safe(p, n, h)
-
-
-
-
-
list_for_each_entry(p, h, field)
-
-
-
-
-
list_for_each_entry_safe(p, n, h, field)
-
-
-
-
-
list_for_each_entry_reverse(p, h, field)
平衡二叉树 - avl.c/h
数据结构
-
-
-
-
-
struct avl_node {
-
-
-
-
-
-
-
-
struct list_head list;
-
-
-
-
-
struct avl_node *parent;
-
-
-
-
-
struct avl_node *left;
-
-
-
-
-
struct avl_node *right;
-
-
-
-
-
const void *key;
-
-
-
-
-
signed char balance;
-
-
-
-
-
bool leader;
-
};
-
-
-
-
-
struct avl_tree {
-
-
-
-
-
struct list_head list_head;
-
-
-
-
-
struct avl_node *root;
-
-
-
-
-
unsigned int count;
-
-
-
-
-
-
bool allow_dups;
-
-
-
-
-
-
-
-
avl_tree_comp comp;
-
-
-
-
-
void *cmp_ptr;
-
};
初始化
-
#define AVL_TREE_INIT(_name, _comp, _allow_dups, _cmp_ptr) \
-
{ \
-
.list_head = LIST_HEAD_INIT(_name.list_head), \
-
.comp = _comp, \
-
.allow_dups = _allow_dups, \
-
.cmp_ptr = _cmp_ptr \
-
}
-
#define AVL_TREE(_name, _comp, _allow_dups, _cmp_ptr) \
-
struct avl_tree _name = \
-
AVL_TREE_INIT(_name, _comp, _allow_dups, _cmp_ptr)
-
-
-
-
-
-
-
-
void avl_init(struct avl_tree *tree, avl_tree_comp comp,
-
bool allow_dups, void *ptr)
基本操作
加入
-
-
-
-
-
-
-
-
int avl_insert(struct avl_tree *tree, struct avl_node *new)
删除
-
-
-
-
-
-
void avl_delete(struct avl_tree *tree, struct avl_node *node)
查找
-
-
-
-
-
-
-
-
struct avl_node * avl_find(const struct avl_tree *tree, const void *key)
-
-
-
-
-
-
-
-
-
struct avl_node * avl_find_greaterequal(const struct avl_tree *tree,
-
const void *key)
-
-
-
-
-
-
-
-
-
-
struct avl_node * avl_find_lessequal(const struct avl_tree *tree, const void *key)
-
-
-
-
-
-
-
-
-
#define avl_find_element(tree, key, element, node_element)
-
-
-
-
-
-
-
-
-
#define avl_find_le_element(tree, key, element, node_element)
-
-
-
-
-
-
-
-
-
#define avl_find_ge_element(tree, key, element, node_element)
获取节点元素
-
-
-
-
-
-
-
-
-
-
#define avl_first_element(tree, element, node_member)
-
-
-
-
-
-
-
-
-
-
#define avl_last_element(tree, element, node_member)
-
-
-
-
-
-
-
-
-
#define avl_next_element(element, node_member)
-
-
-
-
-
-
-
-
-
-
#define avl_prev_element(element, node_member)
状态判断
-
-
-
-
-
-
static inline bool avl_is_first(struct avl_tree *tree, struct avl_node *node)
-
-
-
-
-
-
static inline bool avl_is_last(struct avl_tree *tree, struct avl_node *node)
-
-
-
-
-
static inline bool avl_is_empty(struct avl_tree *tree)
遍历
-
-
-
-
-
-
-
-
-
-
-
-
#define avl_for_each_element(tree, element, node_member)
-
-
-
-
-
-
-
-
-
-
-
-
#define avl_for_each_element_reverse(tree, element, node_member)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
#define avl_for_each_element_safe(tree, element, node_member, ptr)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
#define avl_for_each_element_reverse_safe(tree, element, node_member, ptr)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
#define avl_remove_all_elements(tree, element, node_member, ptr)
比较回调函数
查找操作时被调用,此函数在初始化由调用者设置
-
-
-
-
-
-
-
-
typedef int (*avl_tree_comp) (const void *k1, const void *k2, void *ptr)
平衡二叉树Key比较 - avl-cmp.c/h
-
-
-
-
int avl_strcmp(const void *k1, const void *k2, void *ptr)
VList(vlist.c/h)
数据结构
-
struct vlist_tree {
-
struct avl_tree avl;
-
-
vlist_update_cb update;
-
bool keep_old;
-
-
-
-
-
-
int version;
-
};
-
struct vlist_node {
-
struct avl_node avl;
-
int version;
-
};
初始化
-
void vlist_init(struct vlist_tree *tree, avl_tree_comp cmp, vlist_update_cb update)
基本操作
加入
-
void vlist_add(struct vlist_tree *tree, struct vlist_node *node, const void *key)
删除
-
void vlist_delete(struct vlist_tree *tree, struct vlist_node *node)
清除
-
void vlist_flush(struct vlist_tree *tree)
-
void vlist_flush_all(struct vlist_tree *tree)
查找
-
#define vlist_find(tree, name, element, node_member)
遍历
-
#define vlist_for_each_element(tree, element, node_member)
更新回调函数
增加和删除节点被回调
-
typedef void (*vlist_update_cb)(struct vlist_tree *tree,
-
struct vlist_node *node_new,
-
struct vlist_node *node_old);
Key/Value存储 - kvlist.c/h
数据结构
-
struct kvlist {
-
struct avl_tree avl;
-
int (*get_len)(struct kvlist *kv, const void *data);
-
};
-
struct kvlist_node {
-
struct avl_node avl;
-
char data[0] __attribute__((aligned(4)));
-
};
初始化/销毁
-
void kvlist_init(struct kvlist *kv, int (*get_len)(struct kvlist *kv, const void *data))
-
void kvlist_free(struct kvlist *kv)
基本操作
加入
-
void kvlist_set(struct kvlist *kv, const char *name, const void *data)
删除
-
bool kvlist_delete(struct kvlist *kv, const char *name)
获取
-
void *kvlist_get(struct kvlist *kv, const char *name)
遍历
-
#define kvlist_for_each(kv, name, value)
回调用函数
加入操作时被回调,初始化时由调用者设置,用于计算data的内存空间大小
-
int (*get_len)(struct kvlist *kv, const void *data)
BLOB二进制大对象 - blob.c/h
数据结构
-
struct blob_attr {
-
uint32_t id_len;
-
-
char data[];
-
} __packed;
-
struct blob_attr_info {
-
unsigned int type;
-
unsigned int minlen;
-
unsigned int maxlen;
-
bool (*validate)(const struct blob_attr_info *, struct blob_attr *);
-
};
-
struct blob_buf {
-
struct blob_attr *head;
-
bool (*grow)(struct blob_buf *buf, int minlen);
-
int buflen;
-
void *buf;
-
};
存储结构
接口
获取BLOB属性信息
-
-
-
-
static inline void * blob_data(const struct blob_attr *attr)
-
-
-
-
static inline unsigned int blob_id(const struct blob_attr *attr)
-
-
-
-
static inline bool blob_is_extended(const struct blob_attr *attr)
-
-
-
-
static inline unsigned int blob_len(const struct blob_attr *attr)
-
-
-
-
static inline unsigned int blob_raw_len(const struct blob_attr *attr)
-
-
-
-
static inline unsigned int blob_pad_len(const struct blob_attr *attr)
获取BLOB数据信息
-
static inline uint8_t blob_get_u8(const struct blob_attr *attr)
-
-
static inline uint16_t blob_get_u16(const struct blob_attr *attr)
-
-
static inline uint32_t blob_get_u32(const struct blob_attr *attr)
-
-
static inline uint64_t blob_get_u64(const struct blob_attr *attr)
-
-
static inline int8_t blob_get_int8(const struct blob_attr *attr)
-
-
static inline int16_t blob_get_int16(const struct blob_attr *attr)
-
-
static inline int32_t blob_get_int32(const struct blob_attr *attr)
-
-
static inline int64_t blob_get_int64(const struct blob_attr *attr)
-
-
static inline const char * blob_get_string(const struct blob_attr *attr)
设置BLOB数据信息
-
static inline struct blob_attr *
-
blob_put_string(struct blob_buf *buf, int id, const char *str)
-
-
static inline struct blob_attr *
-
blob_put_u8(struct blob_buf *buf, int id, uint8_t val)
-
-
static inline struct blob_attr *
-
blob_put_u16(struct blob_buf *buf, int id, uint16_t val)
-
-
static inline struct blob_attr *
-
blob_put_u32(struct blob_buf *buf, int id, uint32_t val)
-
-
static inline struct blob_attr *
-
blob_put_u64(struct blob_buf *buf, int id, uint64_t val)
-
#define blob_put_int8 blob_put_u8
-
#define blob_put_int16 blob_put_u16
-
#define blob_put_int32 blob_put_u32
-
#define blob_put_int64 blob_put_u64
-
struct blob_attr *
-
blob_put(struct blob_buf *buf, int id, const void *ptr, unsigned int len)
-
-
-
-
-
struct blob_attr *
-
blob_put_raw(struct blob_buf *buf, const void *ptr, unsigned int len)
遍历
-
#define __blob_for_each_attr(pos, attr, rem)
-
#define blob_for_each_attr(pos, attr, rem)
复制
-
struct blob_attr * blob_memdup(struct blob_attr *attr)
数据类型判断
-
enum {
-
BLOB_ATTR_UNSPEC,
-
BLOB_ATTR_NESTED,
-
BLOB_ATTR_BINARY,
-
BLOB_ATTR_STRING,
-
BLOB_ATTR_INT8,
-
BLOB_ATTR_INT16,
-
BLOB_ATTR_INT32,
-
BLOB_ATTR_INT64,
-
BLOB_ATTR_LAST
-
};
-
bool blob_check_type(const void *ptr, unsigned int len, int type)
嵌套操作
-
void * blob_nest_start(struct blob_buf *buf, int id)
-
Void blob_nest_end(struct blob_buf *buf, void *cookie)
判断
-
bool blob_attr_equal(const struct blob_attr *a1, const struct blob_attr *a2)
初始化/销毁
-
-
-
-
int blob_buf_init(struct blob_buf *buf, int id)
-
-
-
-
-
void blob_buf_free(struct blob_buf *buf)
解析BLOB
-
-
-
-
-
-
-
-
-
int blob_parse(struct blob_attr *attr, struct blob_attr **data,
-
const struct blob_attr_info *info, int max)
BLOB消息对象 - blobmsg.c/h
数据结构
-
struct blobmsg_hdr {
-
uint16_t namelen;
-
uint8_t name[];
-
} __packed;
-
-
struct blobmsg_policy {
-
const char *name;
-
enum blobmsg_type type;
-
};
存储结构
消息类型
-
enum blobmsg_type {
-
BLOBMSG_TYPE_UNSPEC,
-
BLOBMSG_TYPE_ARRAY,
-
BLOBMSG_TYPE_TABLE,
-
BLOBMSG_TYPE_STRING,
-
BLOBMSG_TYPE_INT64,
-
BLOBMSG_TYPE_INT32,
-
BLOBMSG_TYPE_INT16,
-
BLOBMSG_TYPE_INT8,
-
__BLOBMSG_TYPE_LAST,
-
BLOBMSG_TYPE_LAST = __BLOBMSG_TYPE_LAST - 1,
-
BLOBMSG_TYPE_BOOL = BLOBMSG_TYPE_INT8,
-
};
接口
基本操作
-
-
-
-
static inline int blobmsg_hdrlen(unsigned int namelen)
-
-
-
-
-
static inline const char *blobmsg_name(const struct blob_attr *attr)
-
-
-
-
-
static inline int blobmsg_type(const struct blob_attr *attr)
-
-
-
-
-
static inline void *blobmsg_data(const struct blob_attr *attr)
-
-
-
-
-
static inline int blobmsg_data_len(const struct blob_attr *attr)
-
static inline int blobmsg_len(const struct blob_attr *attr)
数据类型判断
-
-
-
-
bool blobmsg_check_attr(const struct blob_attr *attr, bool name)
设置
-
int blobmsg_add_field(struct blob_buf *buf, int type, const char *name,
-
const void *data, unsigned int len)
-
-
static inline int
-
blobmsg_add_u8(struct blob_buf *buf, const char *name, uint8_t val)
-
-
static inline int
-
blobmsg_add_u16(struct blob_buf *buf, const char *name, uint16_t val)
-
-
static inline int
-
blobmsg_add_u32(struct blob_buf *buf, const char *name, uint32_t val)
-
-
static inline int
-
blobmsg_add_u64(struct blob_buf *buf, const char *name, uint64_t val)
-
-
static inline int
-
blobmsg_add_string(struct blob_buf *buf, const char *name, const char *string)
-
-
static inline int
-
blobmsg_add_blob(struct blob_buf *buf, struct blob_attr *attr)
-
-
-
-
-
void blobmsg_printf(struct blob_buf *buf, const char *name, const char *format, ...)
获取
-
static inline uint8_t blobmsg_get_u8(struct blob_attr *attr)
-
static inline bool blobmsg_get_bool(struct blob_attr *attr)
-
static inline uint16_t blobmsg_get_u16(struct blob_attr *attr)
-
static inline uint32_t blobmsg_get_u32(struct blob_attr *attr)
-
static inline uint64_t blobmsg_get_u64(struct blob_attr *attr)
-
static inline char *blobmsg_get_string(struct blob_attr *attr)
创建
-
-
-
-
void *blobmsg_alloc_string_buffer(struct blob_buf *buf, const char *name,
-
unsigned int maxlen)
-
-
-
-
-
void *blobmsg_realloc_string_buffer(struct blob_buf *buf, unsigned int maxlen)
-
-
void blobmsg_add_string_buffer(struct blob_buf *buf)
遍历
-
#define blobmsg_for_each_attr(pos, attr, rem)
嵌套操作
-
static inline void * blobmsg_open_array(struct blob_buf *buf, const char *name)
-
static inline void blobmsg_close_array(struct blob_buf *buf, void *cookie)
-
-
static inline void *blobmsg_open_table(struct blob_buf *buf, const char *name)
-
static inline void blobmsg_close_table(struct blob_buf *buf, void *cookie)
解析BLOGMSG
-
-
-
-
-
-
-
-
-
int blobmsg_parse(const struct blobmsg_policy *policy, int policy_len,
-
struct blob_attr **tb, void *data, unsigned int len)
事件处理循环 - uloop.c/h
接口说明
主框架
-
-
-
-
int uloop_init(void)
-
-
-
-
-
void uloop_run(void)
-
-
-
-
-
void uloop_done(void)
描述符事件
-
-
-
-
int uloop_fd_add(struct uloop_fd *sock, unsigned int flags)
-
-
-
-
-
int uloop_fd_delete(struct uloop_fd *sock)
定时器事件
-
-
-
-
int uloop_timeout_add(struct uloop_timeout *timeout)
-
-
-
-
-
int uloop_timeout_set(struct uloop_timeout *timeout, int msecs)
-
-
-
-
-
int uloop_timeout_cancel(struct uloop_timeout *timeout)
-
-
-
-
-
int uloop_timeout_remaining(struct uloop_timeout *timeout)
进程事件
-
-
-
-
int uloop_process_add(struct uloop_process *p)
-
-
-
-
-
int uloop_process_delete(struct uloop_process *p)
数据结构
描述符
-
struct uloop_fd
-
{
-
uloop_fd_handler cb;
-
int fd;
-
bool eof;
-
bool error;
-
bool registered;
-
uint8_t flags;
-
};
定时器
-
struct uloop_timeout
-
{
-
struct list_head list;
-
bool pending;
-
uloop_timeout_handler cb;
-
struct timeval time;
-
};
进程
-
struct uloop_process
-
{
-
struct list_head list;
-
bool pending;
-
uloop_process_handler cb;
-
pid_t pid;
-
};
事件回调函数
描述符
-
typedef void (*uloop_fd_handler)(struct uloop_fd *u, unsigned int events)
定时器
-
typedef void (*uloop_timeout_handler)(struct uloop_timeout *t)
进程
-
typedef void (*uloop_process_handler)(struct uloop_process *c, int ret)
事件标志
-
#define ULOOP_READ (1 << 0)
-
#define ULOOP_WRITE (1 << 1)
-
#define ULOOP_EDGE_TRIGGER (1 << 2)
-
#define ULOOP_BLOCKING (1 << 3)
-
#define ULOOP_EVENT_MASK (ULOOP_READ | ULOOP_WRITE)
流缓冲管理 - ustream.c/h/ustream-fd.c
数据结构
-
struct ustream_buf {
-
struct ustream_buf *next;
-
-
char *data;
-
char *tail;
-
char *end;
-
-
char head[];
-
};
-
struct ustream_buf_list {
-
struct ustream_buf *head;
-
struct ustream_buf *data_tail;
-
struct ustream_buf *tail;
-
-
int (*alloc)(struct ustream *s, struct ustream_buf_list *l);
-
-
int data_bytes;
-
-
int min_buffers;
-
int max_buffers;
-
int buffer_len;
-
-
int buffers;
-
};
-
struct ustream {
-
struct ustream_buf_list r, w;
-
struct uloop_timeout state_change;
-
struct ustream *next;
-
-
-
-
-
-
-
-
void (*notify_read)(struct ustream *s, int bytes_new);
-
-
-
-
-
-
-
-
void (*notify_write)(struct ustream *s, int bytes);
-
-
-
-
-
-
-
-
-
-
void (*notify_state)(struct ustream *s);
-
-
-
-
-
-
-
-
-
-
int (*write)(struct ustream *s, const char *buf, int len, bool more);
-
-
-
-
-
-
void (*free)(struct ustream *s);
-
-
-
-
-
-
-
void (*set_read_blocked)(struct ustream *s);
-
-
-
-
-
-
-
-
bool (*poll)(struct ustream *s);
-
-
-
-
-
-
bool string_data;
-
bool write_error;
-
bool eof, eof_write_done;
-
-
enum read_blocked_reason read_blocked;
-
};
-
struct ustream_fd {
-
struct ustream stream;
-
struct uloop_fd fd;
-
};
存储结构
接口
初始/销毁
-
-
-
-
void ustream_fd_init(struct ustream_fd *s, int fd)
-
-
-
-
-
void ustream_init_defaults(struct ustream *s)
-
-
-
-
-
void ustream_free(struct ustream *s)
写入read buffer
-
-
-
-
-
-
-
-
char *ustream_reserve(struct ustream *s, int len, int *maxlen)
-
-
-
-
-
-
void ustream_fill_read(struct ustream *s, int len)
读出read buffer
一般在notify_read()回调接口使用
-
-
-
-
-
char *ustream_get_read_buf(struct ustream *s, int *buflen)
-
-
-
-
void ustream_consume(struct ustream *s, int len)
操作write buffer
尽最大能力调用write()回调用接口写入,如果超出能力将把未写入的数据存储在write buffer中
-
-
-
-
int ustream_write(struct ustream *s, const char *buf, int len, bool more)
-
int ustream_printf(struct ustream *s, const char *format, ...)
-
int ustream_vprintf(struct ustream *s, const char *format, va_list arg)
把在write buffer中的数据写入实际地方,调用write()回调接口和notify_write()回调接口。一般在描述符的poll操作中调用,表示当描述符变为可写时立即把上一次未写入的内容进行写入操作。
-
-
-
-
-
bool ustream_write_pending(struct ustream *s)
任务队列 - runqueue.c/h
数据结构
-
struct runqueue {
-
struct safe_list tasks_active;
-
struct safe_list tasks_inactive;
-
struct uloop_timeout timeout;
-
-
int running_tasks;
-
int max_running_tasks;
-
bool stopped;
-
bool empty;
-
-
-
void (*empty_cb)(struct runqueue *q);
-
};
-
struct runqueue_task_type {
-
const char *name;
-
-
-
-
-
-
-
-
void (*run)(struct runqueue *q, struct runqueue_task *t);
-
-
-
-
-
-
-
-
-
void (*cancel)(struct runqueue *q, struct runqueue_task *t, int type);
-
-
-
-
-
-
void (*kill)(struct runqueue *q, struct runqueue_task *t);
-
};
-
struct runqueue_task {
-
struct safe_list list;
-
const struct runqueue_task_type *type;
-
struct runqueue *q;
-
-
void (*complete)(struct runqueue *q, struct runqueue_task *t);
-
-
struct uloop_timeout timeout;
-
int run_timeout;
-
int cancel_timeout;
-
int cancel_type;
-
-
bool queued;
-
bool running;
-
bool cancelled;
-
};
-
struct runqueue_process {
-
struct runqueue_task task;
-
struct uloop_process proc;
-
};
接口说明
任务队列
-
-
-
-
void runqueue_init(struct runqueue *q)
-
-
-
-
-
void runqueue_cancel(struct runqueue *q);
-
-
-
-
-
void runqueue_cancel_active(struct runqueue *q);
-
-
-
-
-
void runqueue_cancel_pending(struct runqueue *q);
-
-
-
-
-
void runqueue_kill(struct runqueue *q);
-
-
-
-
-
void runqueue_stop(struct runqueue *q);
-
-
-
-
-
void runqueue_resume(struct runqueue *q);
任务操作
-
-
-
-
-
-
void runqueue_task_add(struct runqueue *q, struct runqueue_task *t, bool running);
-
-
-
-
-
-
-
void runqueue_task_add_first(struct runqueue *q, struct runqueue_task *t,
-
bool running);
-
-
-
-
-
void runqueue_task_complete(struct runqueue_task *t);
-
-
-
-
-
void runqueue_task_cancel(struct runqueue_task *t, int type);
-
-
-
-
-
void runqueue_task_kill(struct runqueue_task *t);
进程任务
-
void runqueue_process_add(struct runqueue *q, struct runqueue_process *p,
-
pid_t pid);
-
-
-
-
-
void runqueue_process_cancel_cb(struct runqueue *q, struct runqueue_task *t,
-
int type);
-
void runqueue_process_kill_cb(struct runqueue *q, struct runqueue_task *t);
阅读(2312) | 评论(0) | 转发(1) |