rem: (timer *)last->entry.next = (timer *)current->entry.next;
add: last->entry.next = current->entry.next;
context: cancel_timer(timer *event){	int currentCPU = smp_get_current_cpu();	cpu_status state;	state = disable_interrupts();	// walk through all of the cpu's timer queues	//	// We start by peeking our own queue, aiming for	// a cheap match. If this fails, we start harassing	// other cpus.	if (_local_timer_cancel_event(currentCPU, event) < 0) {		int numCPUs = smp_get_num_cpus();		int cpu = 0;		timer *last = NULL;		timer *current;		for (cpu = 0; cpu < numCPUs; cpu++) {			if (cpu == currentCPU)				continue;			acquire_spinlock(&sTimerSpinlock[cpu]);			current = sEvents[cpu];			while (current != NULL) {				if (current == event) {					// we found it					if (current == sEvents[cpu])						sEvents[cpu] = (timer *)current->entry.next;					else						(timer *)last->entry.next = (timer *)current->entry.next;					current->entry.next = NULL;					// break out of the whole thing					release_spinlock(&sTimerSpinlock[cpu]);					restore_interrupts(state);					return (bigtime_t)event->entry.key < system_time();				}				last = current;				current = (timer *)current->entry.next;			}			release_spinlock(&sTimerSpinlock[cpu]);		}	}	restore_interrupts(state);	return false;}