#include #include #include #include "ldp_struct.h" #include "ldp_timer_impl.h" #include "ldp_mm_impl.h" #include "ldp_linux.h" struct ldp_timer_linux_list* _global_timer_list = NULL; extern struct timeval _global_timeval; ldp_bool ldp_timer_mgr_handle_verify(ldp_timer_mgr_handle handle) { if(handle == 0) { return LDP_FALSE; } return LDP_TRUE; } ldp_bool ldp_timer_handle_verify(ldp_timer_mgr_handle handle,ldp_timer_handle timer) { if(timer == 0) { return LDP_FALSE; } return LDP_TRUE; } void _ldp_timer_linux_ensort(ldp_timer_linux* t) { ldp_timer_linux* tt = LDP_LIST_HEAD(_global_timer_list); while(tt) { if((tt->event.tv_sec > t->event.tv_sec) || ((tt->event.tv_sec == t->event.tv_sec) && (tt->event.tv_usec > t->event.tv_usec))) { LDP_LIST_INSERT_BEFORE(_global_timer_list,tt,t,_timer); return; } tt = LDP_LIST_NEXT(_global_timer_list,tt,_timer); } LDP_LIST_ADD_TAIL(_global_timer_list,t,_timer,ldp_timer_linux); } void _ldp_timer_linux_remove(ldp_timer_linux* t) { if(t->_timer.lle_next != NULL && t->_timer.lle_prev != NULL) { LDP_LIST_REMOVE(_global_timer_list,t,_timer); } } ldp_timer_mgr_handle ldp_timer_open(ldp_instance_handle user_data) { _global_timer_list = malloc(sizeof(struct ldp_timer_linux_list)); memset(_global_timer_list,0,sizeof(struct ldp_timer_linux_list)); LDP_LIST_INIT(_global_timer_list,ldp_timer_linux); return (ldp_timer_mgr_handle)_global_timer_list; } void ldp_timer_close(ldp_timer_mgr_handle handle) { free(_global_timer_list); _global_timer_list = NULL; } ldp_timer_handle ldp_timer_create(ldp_timer_mgr_handle handle, ldp_time_unit_enum unit,int duration,void* extra,ldp_cfg_handle g, void (*callback)(ldp_timer_handle timer,void* extra,ldp_cfg_handle g)) { ldp_timer_linux* t = (ldp_timer_linux*)malloc(sizeof(ldp_timer_linux)); if(t) { t->extra = extra; t->callback = callback; t->global = g; t->length.tv_sec = duration; t->length.tv_usec = 0; return (ldp_timer_handle)t; } return 0; } ldp_return_enum ldp_timer_modify(ldp_timer_mgr_handle handle, ldp_timer_handle timer,int duration) { ldp_timer_linux* t = (ldp_timer_linux*)timer; if(t) { t->length.tv_sec = duration; t->length.tv_usec = 0; } return LDP_FAILURE; } void ldp_timer_delete(ldp_timer_mgr_handle handle,ldp_timer_handle timer) { ldp_timer_linux* t = (ldp_timer_linux*)timer; free(t); } ldp_return_enum ldp_timer_start(ldp_timer_mgr_handle handle,ldp_timer_handle timer,ldp_timer_type_enum type) { ldp_timer_linux* t = (ldp_timer_linux*)timer; t->event.tv_sec = _global_timeval.tv_sec + t->length.tv_sec; t->event.tv_usec = _global_timeval.tv_usec + t->length.tv_usec; t->type = type; _ldp_timer_linux_ensort(t); return LDP_SUCCESS; } void ldp_timer_stop(ldp_timer_mgr_handle handle,ldp_timer_handle timer) { ldp_timer_linux* t = (ldp_timer_linux*)timer; _ldp_timer_linux_remove(t); }