cb

RTNETLINK内核与用户空间网络子系统交互机制

我的梦境 提交于 2019-11-28 15:38:01
主要涉及net/netlink/af_netlink.c与net/core/rtnetlink.c两个主文件。内核的网络子系统定义了rtnetlink,用做和用户空间的交互,rtnetlink为AF_NETLINK协议的一个类别NETLINK_ROUTE,其它类别包括NETLINK_XFRM、NETLINK_GENERIC等。renetlink主要注册了LINK、ROUTE、ADDRESS、NEIGHOUR等相关的操作。 本文以PF_UNSPEC协议族的RTM_GETLINK为例进行介绍,首先注册rtnetlink内核套接口,主要是注册一个接收函数挂载到AF_NETLINK的处理流程中: static int __net_init rtnetlink_net_init( struct net * net) { struct netlink_kernel_cfg cfg = { .input = rtnetlink_rcv, }; sk = netlink_kernel_create(net, NETLINK_ROUTE, &cfg); } 其次,注册三个回调函数在全局的数组rtnl_msg_handlers上,其结构如下: struct rtnl_link { rtnl_doit_func doit; rtnl_dumpit_func dumpit; rtnl_calcit

自己的Promise

允我心安 提交于 2019-11-27 20:29:39
废话不多说,直接上代码: class myPromise { constructor(fn) { this.status = 'pending'; this.resolveCbs = []; this.rejectCbs = []; this.value = null; fn(this.resolve.bind(this), this.reject.bind(this)) } resolve(val) { this.value = val; this.status = 'resolved'; this.resolveCbs.forEach(cb => { cb(this.value); }) } reject(err) { this.value = err; this.status = 'rejected'; this.rejectCbs.forEach(cb => { cb(this.value); }) } then(resolveCb, rejectCb) { if (this.status === 'resolved') { resolveCb(this.value); } else if (this.status === 'rejected') { rejectCb(this.value); } else { if (typeof resolveCb ===