00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef _EVENT2_BUFFEREVENT_H_
00028 #define _EVENT2_BUFFEREVENT_H_
00029
00077 #ifdef __cplusplus
00078 extern "C" {
00079 #endif
00080
00081 #include <event2/event-config.h>
00082 #ifdef _EVENT_HAVE_SYS_TYPES_H
00083 #include <sys/types.h>
00084 #endif
00085 #ifdef _EVENT_HAVE_SYS_TIME_H
00086 #include <sys/time.h>
00087 #endif
00088
00089
00090 #include <event2/util.h>
00091
00098 #define BEV_EVENT_READING 0x01
00099 #define BEV_EVENT_WRITING 0x02
00100 #define BEV_EVENT_EOF 0x10
00101 #define BEV_EVENT_ERROR 0x20
00102 #define BEV_EVENT_TIMEOUT 0x40
00103 #define BEV_EVENT_CONNECTED 0x80
00111 struct bufferevent
00112 #ifdef _EVENT_IN_DOXYGEN
00113 {}
00114 #endif
00115 ;
00116 struct event_base;
00117 struct evbuffer;
00118 struct sockaddr;
00119
00133 typedef void (*bufferevent_data_cb)(struct bufferevent *bev, void *ctx);
00134
00149 typedef void (*bufferevent_event_cb)(struct bufferevent *bev, short what, void *ctx);
00150
00152 enum bufferevent_options {
00155 BEV_OPT_CLOSE_ON_FREE = (1<<0),
00156
00159 BEV_OPT_THREADSAFE = (1<<1),
00160
00162 BEV_OPT_DEFER_CALLBACKS = (1<<2),
00163
00168 BEV_OPT_UNLOCK_CALLBACKS = (1<<3)
00169 };
00170
00184 struct bufferevent *bufferevent_socket_new(struct event_base *base, evutil_socket_t fd, int options);
00185
00205 int bufferevent_socket_connect(struct bufferevent *, struct sockaddr *, int);
00206
00207 struct evdns_base;
00234 int bufferevent_socket_connect_hostname(struct bufferevent *,
00235 struct evdns_base *, int, const char *, int);
00236
00245 int bufferevent_socket_get_dns_error(struct bufferevent *bev);
00246
00258 int bufferevent_base_set(struct event_base *base, struct bufferevent *bufev);
00259
00263 struct event_base *bufferevent_get_base(struct bufferevent *bev);
00264
00274 int bufferevent_priority_set(struct bufferevent *bufev, int pri);
00275
00276
00282 void bufferevent_free(struct bufferevent *bufev);
00283
00284
00299 void bufferevent_setcb(struct bufferevent *bufev,
00300 bufferevent_data_cb readcb, bufferevent_data_cb writecb,
00301 bufferevent_event_cb eventcb, void *cbarg);
00302
00310 int bufferevent_setfd(struct bufferevent *bufev, evutil_socket_t fd);
00311
00316 evutil_socket_t bufferevent_getfd(struct bufferevent *bufev);
00317
00322 struct bufferevent *bufferevent_get_underlying(struct bufferevent *bufev);
00323
00337 int bufferevent_write(struct bufferevent *bufev,
00338 const void *data, size_t size);
00339
00340
00350 int bufferevent_write_buffer(struct bufferevent *bufev, struct evbuffer *buf);
00351
00352
00363 size_t bufferevent_read(struct bufferevent *bufev, void *data, size_t size);
00364
00373 int bufferevent_read_buffer(struct bufferevent *bufev, struct evbuffer *buf);
00374
00384 struct evbuffer *bufferevent_get_input(struct bufferevent *bufev);
00385
00398 struct evbuffer *bufferevent_get_output(struct bufferevent *bufev);
00399
00408 int bufferevent_enable(struct bufferevent *bufev, short event);
00409
00418 int bufferevent_disable(struct bufferevent *bufev, short event);
00419
00426 short bufferevent_get_enabled(struct bufferevent *bufev);
00427
00454 int bufferevent_set_timeouts(struct bufferevent *bufev,
00455 const struct timeval *timeout_read, const struct timeval *timeout_write);
00456
00475 void bufferevent_setwatermark(struct bufferevent *bufev, short events,
00476 size_t lowmark, size_t highmark);
00477
00482 void bufferevent_lock(struct bufferevent *bufev);
00483
00488 void bufferevent_unlock(struct bufferevent *bufev);
00489
00494 enum bufferevent_flush_mode {
00496 BEV_NORMAL = 0,
00497
00499 BEV_FLUSH = 1,
00500
00502 BEV_FINISHED = 2
00503 };
00504
00513 int bufferevent_flush(struct bufferevent *bufev,
00514 short iotype,
00515 enum bufferevent_flush_mode mode);
00516
00525 enum bufferevent_filter_result {
00527 BEV_OK = 0,
00528
00530 BEV_NEED_MORE = 1,
00531
00534 BEV_ERROR = 2
00535 };
00536
00555 typedef enum bufferevent_filter_result (*bufferevent_filter_cb)(
00556 struct evbuffer *src, struct evbuffer *dst, ev_ssize_t dst_limit,
00557 enum bufferevent_flush_mode mode, void *ctx);
00558
00572 struct bufferevent *
00573 bufferevent_filter_new(struct bufferevent *underlying,
00574 bufferevent_filter_cb input_filter,
00575 bufferevent_filter_cb output_filter,
00576 int options,
00577 void (*free_context)(void *),
00578 void *ctx);
00591 int bufferevent_pair_new(struct event_base *base, int options,
00592 struct bufferevent *pair[2]);
00593
00598 struct bufferevent *bufferevent_pair_get_partner(struct bufferevent *bev);
00599
00604 struct ev_token_bucket_cfg;
00605
00610 struct bufferevent_rate_limit_group;
00611
00613 #define EV_RATE_LIMIT_MAX EV_SSIZE_MAX
00614
00631 struct ev_token_bucket_cfg *ev_token_bucket_cfg_new(
00632 size_t read_rate, size_t read_burst,
00633 size_t write_rate, size_t write_burst,
00634 const struct timeval *tick_len);
00635
00641 void ev_token_bucket_cfg_free(struct ev_token_bucket_cfg *cfg);
00642
00654 int bufferevent_set_rate_limit(struct bufferevent *bev,
00655 struct ev_token_bucket_cfg *cfg);
00656
00674 struct bufferevent_rate_limit_group *bufferevent_rate_limit_group_new(
00675 struct event_base *base,
00676 const struct ev_token_bucket_cfg *cfg);
00682 int bufferevent_rate_limit_group_set_cfg(
00683 struct bufferevent_rate_limit_group *,
00684 const struct ev_token_bucket_cfg *);
00685
00702 int bufferevent_rate_limit_group_set_min_share(
00703 struct bufferevent_rate_limit_group *, size_t);
00704
00709 void bufferevent_rate_limit_group_free(struct bufferevent_rate_limit_group *);
00710
00721 int bufferevent_add_to_rate_limit_group(struct bufferevent *bev,
00722 struct bufferevent_rate_limit_group *g);
00723
00725 int bufferevent_remove_from_rate_limit_group(struct bufferevent *bev);
00726
00738 ev_ssize_t bufferevent_get_read_limit(struct bufferevent *bev);
00739 ev_ssize_t bufferevent_get_write_limit(struct bufferevent *bev);
00742 ev_ssize_t bufferevent_get_max_to_read(struct bufferevent *bev);
00743 ev_ssize_t bufferevent_get_max_to_write(struct bufferevent *bev);
00744
00754 ev_ssize_t bufferevent_rate_limit_group_get_read_limit(
00755 struct bufferevent_rate_limit_group *);
00756 ev_ssize_t bufferevent_rate_limit_group_get_write_limit(
00757 struct bufferevent_rate_limit_group *);
00774 int bufferevent_decrement_read_limit(struct bufferevent *bev, ev_ssize_t decr);
00775 int bufferevent_decrement_write_limit(struct bufferevent *bev, ev_ssize_t decr);
00791 int bufferevent_rate_limit_group_decrement_read(
00792 struct bufferevent_rate_limit_group *, ev_ssize_t);
00793 int bufferevent_rate_limit_group_decrement_write(
00794 struct bufferevent_rate_limit_group *, ev_ssize_t);
00804 void bufferevent_rate_limit_group_get_totals(
00805 struct bufferevent_rate_limit_group *grp,
00806 ev_uint64_t *total_read_out, ev_uint64_t *total_written_out);
00807
00813 void
00814 bufferevent_rate_limit_group_reset_totals(
00815 struct bufferevent_rate_limit_group *grp);
00816
00817 #ifdef __cplusplus
00818 }
00819 #endif
00820
00821 #endif