ACE_Reactor的各种handle_*挂钩方法返回值意义和设计原则转

具体事件处理器定义的各种 handle_ * 挂钩方法的返回值致使 ACE_Reactor 以不同的方式工作。

0 handle_ * 方法返回零( 0 )通知 ACE_Reactor 、事件处理器希望继续像前面一样被处理,也就是,它应该保持在 ACE_Reactor 的实现的一张表中。这样,当下一次 ACE_Reactor 的事件多路分离器系统调用经由 handle_events 被调用时,它还会继续包括该事件处理器的句柄。对于那些生存期超出一次 handle_ * 方法分派的事件处理器,这是一种“正常的”行为。

 

> handle_ * 方法返回大于0(> 0 )的值通知 ACE_Reactor 、事件处理器希望在 ACE_Reactor 阻塞在它的事件多路分离器系统调用上面之前,再一次被分派。对协作的事件处理器来说,这种特性有助于增强全面的系统“公正性”。特别地,这种特性使得一个事件处理器在再次持有控制之前,允许其他事件处理器被分派。

 

< 0 handle_ * 方法返回小于0(< 0 )的值通知 ACE_Reactor 、事件处理器想要被关闭、并从 ACE_Reactor 的内部表中移除。为完成此工作、 ACE_Reactor 调用事件处理器的 handle_close 清扫方法。该方法可以执行用户定义的终止活动,比如删除对象分配的动态内存或关闭日志文件。 handle_close 方法返回后, ACE_Reactor 将相关联的具体事件处理器从它的内部表中移除。

在实现具体事件处理器时,遵守下面的设计准则:
设计准则 0 :不要手工删除事件处理器对象或显式调用 handle_close ,相反,确保 ACE_Reactor 自动调用 handle_close 清扫方法。因而,应用必须遵从适当的协议来移除事件处理器,也就是,或者通过( 1 )从 handle_ * 挂钩方法中返回负值,或者通过( 2 )调用 remove_handler

该设计准则确保 ACE_Reactor 能够适当地清扫它的内部表。如果不服从这一准则,当 ACE_Reactor 试图移除已经在外部被删除的具体事件处理器时,就会带来不可预测的内存管理问题。后面的设计准则详细说明怎样确保 ACE_Reactor 调用 handle_close 清扫方法。



设计准则1
从继承自ACE_Event_Handler的类的handle_* 方法中返回的表达式必须是常量(constant)。这一设计准则有助于静态地检查是否handle_* 方法返回了恰当的值。如果必须违反此准则,开发者必须在return语句之前加一注释,解释为何要使用变量,而不是常量。

设计准则 2
如果从继承自 ACE_Event_Handler 的类的 handle_ * 方法中返回的值不为 0 ,必须在 return 语句之前加一注释,说明该返回值的含义。这一设计准则确保所有非 0 的返回值都是开发者有意使用的。


3
当你想要触发具体事件处理器的相应 handle_close 清扫方法时,从 handle_ * 方法中返回一个负值。值- 1 通常用于触发清扫挂钩,因为它是 ACE_OS 系统调用包装中一个常用的错误代码。但是,任何来自 handle_ * 方法的负数都将触发 handle_close

4
将所有 Event_Handler 清扫活动限制在 handle_close 清扫方法中。一般而言,将所有的清扫活动合并到 handle_close 方法中,而不是分散在事件处理器的各个 handle_ * 方法中要更为容易。在处理动态分配的、必须用 delete this 来清除的事件处理器时,特别需要遵从此设计准则(见准则 9 )。

5
不要将绝对时间用作 ACE_Reactor :: schedule_timer 的第三或第四参数。一般而言,这些参数应该小于一个极长的延迟,更远小于当前时间。

6
不要 delete 不是动态分配的事件处理器。任何含有 delete this 、而其类又没有私有析构器的 handle_close 方法,都有可能违反这一设计准则。在缺乏一种能够静态地识别这一情况的规约检查器时,应该在 delete this 的紧前面加上注释,解释为何要使用这一习语。

7
总是从堆中动态分配具体事件处理器。这是解决许多与具体处理器的生存期有关的问题的相对直接的方法。如果不可能遵从此准则,必须在具体事件处理器登记到 ACE_Reactor 时给出注释,解释为什么不使用动态分配。该注释应该在将静态分配的具体处理器登记到 ACE_Reactor register_handler 语句的紧前面出现。

8
ACE_Event_Handler 退出它们“生活”的作用域之前,从与它们相关联的 ACE_Reactor 中将它们移除掉。该准则应在未遵从准则 7 的情况下使用。 

9
只允许在 handle_close 方法中使用 delete this 习语,也就是,不允许在其他 handle_ * 方法中使用 delete this 。该准则有助于检查是否有与删除非动态分配的内存有关的潜在错误。自然,与 ACE_Reactor 无关的组件可以拥有不同的对自删除进行管辖的准则。

10
仅在为具体事件处理器所登记的最后一个事件已从 ACE_Reactor 中移除时执行 delete this 操作。过早删除在 ACE_Reactor 上登记了多个事件的具体处理器会导致“晃荡的指针”。

11
当你不再需要具体事件处理器的 handle_output 方法被回调时,清除 WRITE_MASK

12
确定 get_handle 方法的特征与 ACE_Event_Handler 基类中的一致。如果你不遵从此准则,并且你“隐式地”将 ACE_HANDLE 传递给 ACE_Reactor ACE_Event_Handler 基类中的缺省 get_handle 将返回- 1 ,而这是错误的。

13
当连接关闭时(或当连接上发生错误时),从 handle_ * 方法中返回一个负值。

14
handle_close 方法中调用 remove_handler 时,总是传递给它 DONT_CALL 标志。该准则确保 ACE_Reactor 不会递归地调用 handle_close 方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom