acl  3.5.3.0
aio_ostream.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <stdarg.h>
4 #include "../stdlib/string.hpp"
5 #include "aio_handle.hpp"
6 #include "aio_timer_callback.hpp"
7 #include "aio_stream.hpp"
8 
9 namespace acl
10 {
11 
12 class aio_ostream;
13 
14 /**
15  * 延迟异步写数据类,基类为 aio_timer_callback (see aio_handle.hpp),
16  * 所谓延迟异步写,就是把异步写流(aio_ostream)放在定时器中,将该异
17  * 步流的异步写操作解除绑定(即从 aio_handle 的监控中解除),当指定
18  * 时间到达后再启动异步写操作(在 timer_callback 回调中再重新将异步
19  * 流的异步写操作绑定),同时该定时器自动销毁(调用 destroy 方法),
20  * 所以如果用户继承了 aio_timer_writer 类,且子类不是在堆上分配的,
21  * 则必须重载 destroy方法,同时在子类的 destroy 中执行与资源释放的
22  * 相关操作,如果子类未重载 destroy,则当定时器结束后内部会自动调用
23  * 基类 aio_timer_writer 的 destroy--该类调用了 delete this,此时就
24  * 会导致非法内存释放操作)
25  *
26  */
28 {
29 public:
30  aio_timer_writer(void);
31 
32  /**
33  * 在 aio_istream 中调用此函数以释放类对象,子类应该实现该函数
34  */
35  virtual void destroy(void)
36  {
37  delete this;
38  }
39 
40 protected:
41  virtual ~aio_timer_writer(void);
42 
43  /**
44  * 延迟读数据时的回调函数,从 aio_timer_callback 类中继承而来
45  */
46  virtual void timer_callback(unsigned int id);
47 private:
48  friend class aio_ostream;
49 
50  aio_ostream* out_;
51  //int write_delayed_;
52  acl::string buf_;
53 };
54 
55 /**
56  * 异步写数据流类定义,该类只能在堆上被实例化,在析构时需要调用 close
57  * 函数以释放该类对象
58  */
59 class ACL_CPP_API aio_ostream : virtual public aio_stream
60 {
61 public:
62  /**
63  * 构造函数
64  * @param handle {aio_handle*} 异步事件引擎句柄
65  */
66  aio_ostream(aio_handle* handle);
67 
68  /**
69  * 构造函数,创建异步写流对象,并 hook 写过程及关闭/超时过程
70  * @param handle {aio_handle*} 异步事件引擎句柄
71  * @param fd {int} 连接套接口句柄
72  */
73 #if defined(_WIN32) || defined(_WIN64)
74  aio_ostream(aio_handle* handle, SOCKET fd);
75 #else
76  aio_ostream(aio_handle* handle, int fd);
77 #endif
78 
79  /**
80  * 添加异可写时的回调类对象指针,如果该回调类对象已经存在,则只是
81  * 使该对象处于打开可用状态
82  * @param callback {aio_callback*} 继承 aio_callback 的子类回调类对象,
83  * 当异步流有数据时会先调用此回调类对象中的 write_callback 接口
84  */
85  void add_write_callback(aio_callback* callback);
86 
87  /**
88  * 从写回调对象集合中删除
89  * @param callback {aio_callback*} 被删除的写回调对象,
90  * 若该值为空,则删除所有的回调写对象
91  * @return {int} 返回被从回调对象集合中删除的回调对象的个数
92  */
93  int del_write_callback(aio_callback* callback = NULL);
94 
95  /**
96  * 禁止回调对象类集合中的某个回调类对象,但并不从回调类对象
97  * 集合中删除,只是不被调用而已
98  * @param callback {aio_callback*} 被禁用的写回调对象,
99  * 若该值为空,则禁用所有的写回调对象
100  * @return {int} 返回被从回调对象集合中禁用的回调对象的个数
101  */
102  int disable_write_callback(aio_callback* callback = NULL);
103 
104  /**
105  * 启用所有的回调对象被调用
106  * @param callback {aio_callback*} 启用指定的写回调对象,
107  * 如果该值为空,则启用所有的写回调对象
108  * @return {int} 返回被启用的写回调对象的个数
109  */
110  int enable_write_callback(aio_callback* callback = NULL);
111 
112  /**
113  * 异步写规定字节数的数据,当完全写成功或出错或超时时会
114  * 调用用户注册的回调函数,在延迟异步写时,当在一个函数
115  * 内连续调用此过程时,每个延迟异步写操作会被加入延迟写
116  * 的队列中,以保证每个延迟异步写操作都可在各自的定时器
117  * 到达时被执行
118  * @param data {const void*} 数据地址
119  * @param len {int} 数据长度
120  * @param delay {int64} 如果该值 > 0 则采用延迟发送的模式(单位为微秒)
121  * @param callback {aio_timer_writer*} 定时器到达时的回调函数类对象,
122  */
123 #if defined(_WIN32) || defined(_WIN64)
124  void write(const void* data, int len, __int64 delay = 0,
125  aio_timer_writer* callback = NULL);
126 #else
127  void write(const void* data, int len, long long int delay = 0,
128  aio_timer_writer* callback = NULL);
129 #endif
130 
131  /**
132  * 格式化方式异步写数据,当完全写成功或出错或超时时会
133  * 调用用户注册的回调函数
134  * @param fmt {const char*} 格式字符串
135  */
136  void format(const char* fmt, ...) ACL_CPP_PRINTF(2, 3);
137 
138  /**
139  * 格式化方式异步写数据,当完全写成功或出错或超时时会
140  * 调用用户注册的回调函数
141  * @param fmt {const char*} 格式字符串
142  * @param ap {va_list} 数据值列表
143  */
144  void vformat(const char* fmt, va_list ap);
145 
146  /**
147  * 异步等待连接流可写,该函数设置异步流的写监听状态,当有可写时,
148  * 回调函数被触发,由用户自己负责数据的读取
149  * @param timeout {int} 写超时时间(秒),当该值为 0 时,则没有写超时
150  */
151  void write_wait(int timeout = 0);
152 
153  /**
154  * 禁止异步流的异步写状态,则将该异步流从异步引擎的监控
155  * 事件中移除,直到用户调用任何一个写操作时会自动打开异
156  * 步写状态(此时该流会重新被异步引擎监控)
157  */
158  void disable_write(void);
159 protected:
160  virtual ~aio_ostream(void);
161 
162  /**
163  * 释放动态类对象的虚函数
164  */
165  virtual void destroy(void);
166 
167  /**
168  * hook 写过程
169  */
170  void hook_write(void);
171 
172 private:
173  friend class aio_timer_writer;
174  std::list<aio_timer_writer*>* timer_writers_;
175  std::list<AIO_CALLBACK*> write_callbacks_;
176 
177  static int write_callback(ACL_ASTREAM*, void*);
178  static int write_wakup(ACL_ASTREAM*, void*);
179 };
180 
181 } // namespace acl
#define ACL_CPP_PRINTF(format_idx, arg_idx)
Definition: atomic.hpp:75
ACL_API ACL_VSTRING const char * format
Definition: acl_vstring.h:239
virtual void destroy(void)
Definition: aio_ostream.hpp:35
ACL_API void const char * fmt
Definition: acl_aio.h:771
#define ACL_CPP_API