123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- /*
- * delay_manager.h
- *
- * Created on: Sep 15, 2017
- * Author: root
- */
- #ifndef DELAY_MANAGER_H_
- #define DELAY_MANAGER_H_
- #include "common.h"
- #include "packet.h"
- #include "log.h"
- // enum delay_type_t {none=0,enum_sendto_u64,enum_send_fd,client_to_local,client_to_remote,server_to_local,server_to_remote};
- /*
- struct fd_ip_port_t
- {
- int fd;
- u32_t ip;
- u32_t port;
- };
- union dest_t
- {
- fd_ip_port_t fd_ip_port;
- int fd;
- u64_t u64;
- };
- */
- /*
- struct my_timer_t
- {
- int timer_fd;
- fd64_t timer_fd64;
- my_timer_t()
- {
- if ((timer_fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK)) < 0)
- {
- mylog(log_fatal,"timer_fd create error");
- myexit(1);
- }
- timer_fd64=fd_manager.create(timer_fd);
- }
- my_timer_t(const my_timer_t &b)
- {
- assert(0==1);
- }
- ~my_timer_t()
- {
- fd_manager.fd64_close(timer_fd64);
- }
- int add_fd_to_epoll(int epoll_fd)
- {
- epoll_event ev;;
- ev.events = EPOLLIN;
- ev.data.u64 = timer_fd;
- int ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, timer_fd, &ev);
- if (ret!= 0) {
- mylog(log_fatal,"add delay_manager.get_timer_fd() error\n");
- myexit(-1);
- }
- return 0;
- }
- int add_fd64_to_epoll(int epoll_fd)
- {
- epoll_event ev;;
- ev.events = EPOLLIN;
- ev.data.u64 = timer_fd64;
- int ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, timer_fd, &ev);
- if (ret!= 0) {
- mylog(log_fatal,"add delay_manager.get_timer_fd() error\n");
- myexit(-1);
- }
- return 0;
- }
- int get_timer_fd()
- {
- return timer_fd;
- }
- fd64_t get_timer_fd64()
- {
- return timer_fd64;
- }
- int set_timer_repeat_us(my_time_t my_time)
- {
- itimerspec its;
- memset(&its,0,sizeof(its));
- its.it_interval.tv_sec=my_time/1000000llu;
- its.it_interval.tv_nsec=my_time%1000000llu*1000llu;
- its.it_value.tv_nsec=1; //imidiately
- timerfd_settime(timer_fd,0,&its,0);
- return 0;
- }
- int set_timer_abs_us(my_time_t my_time)
- {
- itimerspec its;
- memset(&its,0,sizeof(its));
- its.it_value.tv_sec=my_time/1000000llu;
- its.it_value.tv_nsec=my_time%1000000llu*1000llu;
- timerfd_settime(timer_fd,TFD_TIMER_ABSTIME,&its,0);
- return 0;
- }
- };*/
- struct delay_data_t {
- dest_t dest;
- // int left_time;//
- char *data;
- int len;
- int handle();
- };
- struct delay_manager_t {
- ev_timer timer;
- struct ev_loop *loop = 0;
- void (*cb)(struct ev_loop *loop, struct ev_timer *watcher, int revents) = 0;
- // int timer_fd;
- int capacity;
- multimap<my_time_t, delay_data_t> delay_mp; // unit us,1 us=0.001ms
- delay_manager_t();
- delay_manager_t(delay_manager_t &b) {
- assert(0 == 1);
- }
- void set_loop_and_cb(struct ev_loop *loop, void (*cb)(struct ev_loop *loop, struct ev_timer *watcher, int revents)) {
- this->loop = loop;
- this->cb = cb;
- ev_init(&timer, cb);
- }
- int set_capacity(int a) {
- capacity = a;
- return 0;
- }
- ~delay_manager_t();
- ev_timer &get_timer();
- int check();
- int add(my_time_t delay, const dest_t &dest, char *data, int len);
- };
- #endif /* DELAY_MANAGER_H_ */
|