00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00027 #include "engines_int.h"
00028
00029 RCSTAG("@(#)$Id: timer_resched.c,v 1.2 2005/09/15 18:14:11 klmitch Exp $");
00030
00031 ev_err_t
00032 timer_resched(ev_ctx_t *ctx, ev_tim_t *tim, ev_timtype_t type,
00033 struct timeval *value)
00034 {
00035 ev_engine_t *eng;
00036 ev_err_t err = 0;
00037 struct timeval ov;
00038 int tmp;
00039
00040 ev_init();
00041
00042
00043 if (!ec_verify(ctx) || !ti_verify(tim) ||
00044 (type != TT_ABSOLUTE && type != TT_RELATIVE && type != TT_PERIODIC) ||
00045 !value || eg_context(tim) != ctx)
00046 ev_return(EINVAL);
00047
00048
00049
00050
00051 if (!(eg_flags(tim) & EV_GEN_DELETED))
00052
00053 for (eng = ctx->ec_timer.el_last; eng;
00054 eng = eng->eng_timer.eti_active.el_prev)
00055 if ((err = eng_tim_rem(ctx, eng, tim))) {
00056 for (; eng; eng = eng->eng_timer.eti_active.el_prev)
00057 eng_tim_rem(ctx, eng, tim);
00058
00059 _timer_untree(ctx, tim);
00060
00061 eg_flags_set(tim, EV_GEN_DELETED);
00062
00063 eg_ref_dec(ctx, tim);
00064
00065 ev_return(err);
00066 }
00067
00068 ov = tim->ti_expire;
00069
00070
00071 tim->ti_type = type;
00072 tim->ti_value = *value;
00073 ti_expire_comp(tim);
00074
00075
00076 for (eng = ctx->ec_timer.el_first; eng;
00077 eng = eng->eng_timer.eti_active.el_next)
00078 if ((err = eng_tim_add(ctx, eng, tim))) {
00079
00080 for (; eng; eng = eng->eng_timer.eti_active.el_prev)
00081 eng_tim_rem(ctx, eng, tim);
00082
00083 _timer_untree(ctx, tim);
00084
00085 eg_flags_set(tim, EV_GEN_DELETED);
00086
00087 eg_ref_dec(ctx, tim);
00088
00089 ev_return(err);
00090 }
00091
00092
00093 if (eg_flags(tim) & EV_GEN_DELETED)
00094 err = _timer_insert(ctx, tim);
00095 else if ((tmp = tv_comp(&tim->ti_expire, &ov)) < 0)
00096 err = _timer_heapify_down(ctx, tim);
00097 else if (tmp > 0)
00098 err = _timer_heapify_up(ctx, tim);
00099
00100 if (err)
00101 timer_destroy(ctx, tim);
00102 else
00103 eg_flags_clr(tim, EV_GEN_DELETED);
00104
00105 ev_return(err);
00106 }