penalty.c revision 7e7cdca78e6a67757188406c8de9db42fcd17881
7e7cdca78e6a67757188406c8de9db42fcd17881Timo Sirainen/* Copyright (C) 2009 Dovecot authors, see the included COPYING file */
7e7cdca78e6a67757188406c8de9db42fcd17881Timo Sirainen /* ordered by last_update */
7e7cdca78e6a67757188406c8de9db42fcd17881Timo Sirainen unsigned int penalty;
7e7cdca78e6a67757188406c8de9db42fcd17881Timo Sirainen /* ident => penalty_rec */
7e7cdca78e6a67757188406c8de9db42fcd17881Timo Sirainen hash_table_create(default_pool, default_pool, 0,
7e7cdca78e6a67757188406c8de9db42fcd17881Timo Sirainen penalty->expire_secs = PENALTY_DEFAULT_EXPIRE_SECS;
7e7cdca78e6a67757188406c8de9db42fcd17881Timo Sirainenstatic void penalty_rec_free(struct penalty *penalty, struct penalty_rec *rec)
7e7cdca78e6a67757188406c8de9db42fcd17881Timo Sirainen DLLIST2_REMOVE(&penalty->oldest, &penalty->newest, rec);
7e7cdca78e6a67757188406c8de9db42fcd17881Timo Sirainenvoid penalty_set_expire_secs(struct penalty *penalty, unsigned int expire_secs)
7e7cdca78e6a67757188406c8de9db42fcd17881Timo Sirainenunsigned int penalty_get(struct penalty *penalty, const char *ident,
7e7cdca78e6a67757188406c8de9db42fcd17881Timo Sirainen rec = hash_table_lookup(penalty->hash, ident);
7e7cdca78e6a67757188406c8de9db42fcd17881Timo Sirainenstatic void penalty_timeout(struct penalty *penalty)
7e7cdca78e6a67757188406c8de9db42fcd17881Timo Sirainen expire_time = ioloop_time - penalty->expire_secs;
7e7cdca78e6a67757188406c8de9db42fcd17881Timo Sirainen penalty->oldest->last_update <= expire_time) {
7e7cdca78e6a67757188406c8de9db42fcd17881Timo Sirainen hash_table_remove(penalty->hash, penalty->oldest->ident);
7e7cdca78e6a67757188406c8de9db42fcd17881Timo Sirainen unsigned int diff = penalty->oldest->last_update - expire_time;
7e7cdca78e6a67757188406c8de9db42fcd17881Timo Sirainenvoid penalty_set(struct penalty *penalty, const char *ident,
7e7cdca78e6a67757188406c8de9db42fcd17881Timo Sirainen unsigned int value)
7e7cdca78e6a67757188406c8de9db42fcd17881Timo Sirainen rec = hash_table_lookup(penalty->hash, ident);
7e7cdca78e6a67757188406c8de9db42fcd17881Timo Sirainen hash_table_insert(penalty->hash, rec->ident, rec);
7e7cdca78e6a67757188406c8de9db42fcd17881Timo Sirainen DLLIST2_REMOVE(&penalty->oldest, &penalty->newest, rec);
7e7cdca78e6a67757188406c8de9db42fcd17881Timo Sirainen DLLIST2_APPEND(&penalty->oldest, &penalty->newest, rec);