/* file: net/sunrpc/svc.c */
struct svc_serv *svc_create(struct svc_program *, unsigned int, sa_family_t,
void (*shutdown)(struct svc_serv *));
实际上调用的是私有函数 __svc_create(), 分配 RPC 服务(svc_serv)的内存空间. 结构体 svc_server 是整个 RPC 服务(服务器/客户端)的表示. 和 svc_create_pooled 不同, 本函数一般用来创建 RPC 客户端[待求证?].
/* file: net/sunrpc/svc.c */
struct svc_serv * svc_create_pooled(struct svc_program *, unsigned int,
sa_family_t, void (*shutdown)(struct svc_serv *),
svc_thread_fn, struct module *);
与 svc_create 类似, 一般用来创建 RPC 服务器, 因为它创建的是 RPC 服务的线程池. RPC 服务器需要使用线程池, 以便能并发的处理多个客户端的请求.
/* file: net/sunrpc/svc.c */
struct svc_rqst *svc_prepare_thread(struct svc_serv *serv,
struct svc_pool *pool);
分配 RPC 服务线程所需的内存空间, 包括:
1. RPC 请求 svc_rqst
2. 解码之后的 RPC 请求 argp
3. 编码之前的 RPC 响应 resp,
解析之后的 RPC 请求, 是一个请求的语言相关表示, 在 Linux 源码中就是 C 语言表示. 如果使用 Java, 就可能是一个 Java 类. 所谓的语言相关, 是指在用相关的编程语言来描述的.
svc_rqst 既包含了语言相关的请求/响应表示, 也包含了请求/响应的字节数组表示.
/* file: net/sunrpc/svc.c */
void svc_exit_thread(struct svc_rqst *);
结束一个 RPC 服务器线程, 释放通过 svc_prepare_thread() 分配的所有空间, 同时还调用 svc_destroy() 销毁 svc_serv — 我认为应该在 svc_exit_thread 之外调用 svc_destroy(), 因为 svc_serv 不是在 svc_prepare_thread() 里创建的.
/* file: net/sunrpc/svc.c */
void svc_destroy(struct svc_serv *);
销毁一个 RPC 服务, 关闭所有 socket 连接, 释放服务的线程池空间和其本身.
/* file: net/sunrpc/svc.c */
int svc_process(struct svc_rqst *);
在本函数中解码请求, 处理, 编码响应, 发送响应. 详见: svc_process函数.
TODO: Linux 的 RPC 实现中, svc_serv 分别在服务器和客户端的角色.
Written by benegg
at 2009-04-16 16:59:59 | tags: linux-sunrpc, 网络编程
Recent Comments