rem: lock( &locks[TREE_LOCK] );
add: lock_get(tree_lock);
context: void clean_routine(unsigned int ticks , void *param){	struct pike_timer_link *tl;	struct ip_node         *dad;	struct ip_node         *node;	if ( !is_empty(timer) ) {		/* get the expired elements */		lock( &locks[TIMER_LOCK] );		tl = check_and_split_timer( timer, ticks);		unlock( &locks[TIMER_LOCK] );		/* process them */		if (tl) {				lock( &locks[TREE_LOCK] );				for(;tl;tl=tl->next) {					node = (struct ip_node*)tl;					DBG("DEBUG:pike:clean_routine: del node [%X] \n",						node->byte);					/* if it's a node, leaf for an ipv4 address inside an					   ipv6 address -> just remove it from timer*/					if (node->children) {						node->leaf_hits = 0;						node->tl.timeout = 0;						node->tl.prev = node->tl.next = 0;					} else {						/* we have to put the father into timer list*/						/* get the father node */						dad = node;						while (dad->prev->children!=dad)							dad=dad->prev;						dad = dad->prev;						/* put it in the list 						   (only if it isnot the tree root) */						if (dad!=tree) {							lock(&locks[TIMER_LOCK]);							dad->tl.timeout = get_ticks() + timeout;							append_to_timer(timer,&(dad->tl));							unlock(&locks[TIMER_LOCK]);						}						/* del the node */						remove_node( tree, node);					}					/*DEBUG - print_timer_list(timer); */				}				unlock( &locks[TREE_LOCK] );		}	}}