Ejemplo n.º 1
0
// 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 );
}
Ejemplo n.º 2
0
// 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 );
}
Ejemplo n.º 3
0
// "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 );
}
Ejemplo n.º 4
0
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
}
Ejemplo n.º 5
0
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 );
}
Ejemplo n.º 6
0
// 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 );
}
Ejemplo n.º 7
0
Archivo: timer.c Proyecto: nhst/trema
/**
 * 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;
}
Ejemplo n.º 8
0
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 ) );
}