// find elements of "charlie" <-> "bravo" <-> "alpha" static void test_find_element() { char element_data1[] = "alpha"; char element_data2[] = "bravo"; char element_data3[] = "charlie"; char no_such_element[] = "NO SUCH ELEMENT"; dlist_element *new_element = create_dlist(); insert_after_dlist( new_element, element_data1 ); insert_after_dlist( new_element, element_data2 ); insert_after_dlist( new_element, element_data3 ); dlist_element *e = NULL; e = find_element( new_element, element_data3 ); assert_true( new_element->next == e ); e = find_element( new_element, element_data2 ); assert_true( new_element->next->next == e ); e = find_element( new_element, element_data1 ); assert_true( new_element->next->next->next == e ); e = find_element( new_element->next->next->next, element_data2 ); assert_true( new_element->next->next == e ); e = find_element( new_element, no_such_element ); assert_true( e == NULL ); delete_dlist( new_element ); }
// Remove "charlie" of "alpha" <-> "bravo" <-> "charlie" static void test_remove_last_element() { char element_data2[] = "bravo"; char element_data3[] = "charlie"; dlist_element *alpha = create_dlist(); dlist_element *bravo = insert_after_dlist( alpha, element_data2 ); dlist_element *charlie = insert_after_dlist( bravo, element_data3 ); assert_true( delete_dlist_element( charlie ) ); assert_true( bravo->next == NULL ); assert_true( bravo->prev == alpha ); delete_dlist( alpha ); }
// "alpha" <-> "bravo" <-> "charlie" static void test_get_last_element() { char element_data2[] = "bravo"; char element_data3[] = "charlie"; dlist_element *alpha = create_dlist(); dlist_element *bravo = insert_after_dlist( alpha, element_data2 ); dlist_element *charlie = insert_after_dlist( bravo, element_data3 ); assert_true( get_last_element( alpha ) == charlie ); assert_true( get_last_element( bravo ) == charlie ); assert_true( get_last_element( charlie ) == charlie ); delete_dlist( alpha ); }
void insert_probe_timer_entry( probe_timer_entry *new_entry ) { probe_timer_entry *last_entry = probe_timer_last->data; if ( probe_timer_table->next == NULL || timespec_le( &(last_entry->expires ), &( new_entry->expires ) ) ) { probe_timer_last = insert_after_dlist( probe_timer_last, new_entry ); goto set_interval_timer; } dlist_element *dlist; probe_timer_entry *entry; for ( dlist = probe_timer_table->next; dlist != NULL; dlist = dlist->next ) { entry = dlist->data; if ( timespec_le( &(entry->expires ), &( new_entry->expires ) ) ) { continue; } insert_before_dlist( dlist, new_entry ); goto set_interval_timer; } UNREACHABLE(); set_interval_timer: if ( probe_timer_table->next->data != new_entry ) { return; } #if 0 set_interval_timer(); #endif }
static void insert_timer_callback( struct timer_info *timer, timer_callback_info *new_cb ) { assert( timer->timer_callbacks != NULL ); dlist_element *element, *last = timer->timer_callbacks; for ( element = timer->timer_callbacks->next; element != NULL; element = element->next ) { timer_callback_info *cb = element->data; if ( TIMESPEC_LESS_THEN( &new_cb->expires_at, &cb->expires_at ) ) { insert_before_dlist( element, new_cb ); return; } last = element; } insert_after_dlist( last, new_cb ); }
// new_element <-> "charlie" <-> "bravo" <-> "alpha" -> NULL static void test_insert_after_dlist() { char element_data1[] = "alpha"; char element_data2[] = "bravo"; char element_data3[] = "charlie"; dlist_element *new_element = create_dlist(); assert_true( insert_after_dlist( new_element, element_data1 ) ); assert_true( insert_after_dlist( new_element, element_data2 ) ); assert_true( insert_after_dlist( new_element, element_data3 ) ); assert_string_equal( new_element->next->data, "charlie" ); assert_string_equal( new_element->next->next->data, "bravo" ); assert_string_equal( new_element->next->next->next->data, "alpha" ); assert_true( new_element->next->next->next->next == NULL ); assert_true( new_element->next->prev == new_element ); assert_true( new_element->next->next->prev->prev == new_element ); assert_true( new_element->next->next->next->prev->prev->prev == new_element ); delete_dlist( new_element ); }
/** * Adds a timer event callback in the event list. * @param interval Time interval specification * @param callback Pointer to callback function * @param user_data Pointer string which would be passed as it is to callback function * @return bool True if event callback is updated in list, else False when timer is zero or not monotonic * @see add_periodic_event_callback */ bool add_timer_event_callback( struct itimerspec *interval, void ( *callback )( void *user_data ), void *user_data ) { assert( interval != NULL ); assert( callback != NULL ); debug( "Adding a timer event callback ( interval = %u.%09u, initial expiration = %u.%09u, callback = %p, user_data = %p ).", interval->it_interval.tv_sec, interval->it_interval.tv_nsec, interval->it_value.tv_sec, interval->it_value.tv_nsec, callback, user_data ); timer_callback *cb; struct timespec now; cb = xmalloc( sizeof( timer_callback ) ); memset( cb, 0, sizeof( timer_callback ) ); cb->function = callback; cb->user_data = user_data; if ( clock_gettime( CLOCK_MONOTONIC, &now ) != 0 ) { error( "Failed to retrieve monotonic time ( %s [%d] ).", strerror( errno ), errno ); xfree( cb ); return false; } cb->interval = interval->it_interval; if ( VALID_TIMESPEC( &interval->it_value ) ) { ADD_TIMESPEC( &now, &interval->it_value, &cb->expires_at ); } else if ( VALID_TIMESPEC( &interval->it_interval ) ) { ADD_TIMESPEC( &now, &interval->it_interval, &cb->expires_at ); } else { error( "Timer must not be zero when a timer event is added." ); xfree( cb ); return false; } debug( "Set an initial expiration time to %u.%09u.", now.tv_sec, now.tv_nsec ); assert( timer_callbacks != NULL ); insert_after_dlist( timer_callbacks, cb ); return true; }
static void test_insert_after_dlist_aborts_with_NULL_dlist() { expect_string( mock_die, output, "element must not be NULL" ); expect_assert_failure( insert_after_dlist( NULL, NULL ) ); }