rtems_aio_request_chain * rtems_aio_search_fd (rtems_chain_control *chain, int fildes, int create) { rtems_aio_request_chain *r_chain; rtems_chain_node *node; node = rtems_chain_first (chain); r_chain = (rtems_aio_request_chain *) node; while (r_chain->fildes < fildes && !rtems_chain_is_tail (chain, node)) { node = rtems_chain_next (node); r_chain = (rtems_aio_request_chain *) node; } if (r_chain->fildes == fildes) r_chain->new_fd = 0; else { if (create == 0) r_chain = NULL; else { r_chain = malloc (sizeof (rtems_aio_request_chain)); rtems_chain_initialize_empty (&r_chain->perfd); if (rtems_chain_is_empty (chain)) rtems_chain_prepend (chain, &r_chain->next_fd); else rtems_chain_insert (rtems_chain_previous (node), &r_chain->next_fd); r_chain->new_fd = 1; r_chain->fildes = fildes; } } return r_chain; }
static void rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req) { rtems_chain_node *node; AIO_printf ("FD exists \n"); node = rtems_chain_first (chain); if (rtems_chain_is_empty (chain)) { AIO_printf ("First in chain \n"); rtems_chain_prepend (chain, &req->next_prio); } else { AIO_printf ("Add by priority \n"); int prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio; while (req->aiocbp->aio_reqprio > prio && !rtems_chain_is_tail (chain, node)) { node = rtems_chain_next (node); prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio; } rtems_chain_insert (node->previous, &req->next_prio); } }
static void test_chain_first_and_last(void) { rtems_chain_control chain; rtems_chain_node node1, node2; rtems_chain_node *cnode; rtems_chain_initialize_empty( &chain ); rtems_chain_append( &chain, &node1 ); rtems_chain_insert( &node1, &node2 ); puts( "INIT - Verify rtems_chain_is_first" ); cnode = rtems_chain_first(&chain); rtems_test_assert( rtems_chain_is_first( cnode ) ); puts( "INIT - Verify rtems_chain_is_last" ); cnode = rtems_chain_last(&chain); rtems_test_assert( rtems_chain_is_last( cnode ) ); cnode = rtems_chain_get_first_unprotected( &chain ); rtems_test_assert( cnode == &node1 ); cnode = rtems_chain_first( &chain ); rtems_test_assert( cnode == &node2 ); cnode = rtems_chain_last( &chain ); rtems_test_assert( cnode == &node2 ); }
rtems_task Init( rtems_task_argument ignored ) { rtems_chain_control chain1; rtems_chain_node *p; test_node node1, node2; int id; TEST_BEGIN(); puts( "Init - Initialize chain empty" ); rtems_chain_initialize_empty( &chain1 ); /* verify that the chain append and insert work */ puts( "INIT - Verify rtems_chain_insert" ); node1.id = 1; node2.id = 2; rtems_chain_append( &chain1, &node1.Node ); rtems_chain_insert( &node1.Node, &node2.Node ); for ( p = rtems_chain_first(&chain1), id = 1 ; !rtems_chain_is_tail(&chain1, p) ; p = p->next , id++ ) { test_node *t = (test_node *)p; if ( id > 2 ) { puts( "INIT - TOO MANY NODES ON CHAIN" ); rtems_test_exit(0); } if ( t->id != id ) { puts( "INIT - ERROR ON CHAIN ID MISMATCH" ); rtems_test_exit(0); } } test_chain_first_and_last(); test_chain_with_empty_check(); test_chain_with_notification(); test_chain_get_with_wait(); test_chain_control_layout(); test_chain_control_initializer(); test_chain_node_count(); test_chain_insert_ordered(); test_chain_iterator(); TEST_END(); rtems_test_exit(0); }
static void rtems_aio_move_to_work (rtems_aio_request_chain *r_chain) { rtems_aio_request_chain *temp; rtems_chain_node *node; node = rtems_chain_first (&aio_request_queue.work_req); temp = (rtems_aio_request_chain *) node; while (temp->fildes < r_chain->fildes && !rtems_chain_is_tail (&aio_request_queue.work_req, node)) { node = rtems_chain_next (node); temp = (rtems_aio_request_chain *) node; } rtems_chain_insert (rtems_chain_previous (node), &r_chain->next_fd); }
int rtems_bsd_rc_conf_service_add(const char* name, const char* control, rtems_bsd_rc_conf_service entry) { service* srv; char* ctl = NULL; char* s; char* c; srv = malloc(sizeof(*srv)); if (srv == NULL) { errno = ENOMEM; return -1; } memset(srv, 0, sizeof(*srv)); srv->name = strdup(name); if (control != NULL) { ctl = strdup(control); srv->control = ctl; } srv->entry = entry; if (srv->name == NULL || (control != NULL && ctl == NULL)) { fprintf(stderr, "error: rc.conf: add service: no memory\n"); free((void*) srv->control); free((void*) srv->name); free(srv); errno = ENOMEM; return -1; } if (control != NULL) { s = c = ctl; while (*c != '\0') { if (*c == ';') { *c = '\0'; if (strncasecmp("before:", s, sizeof("before:") - 1) == 0) { if (srv->before == NULL) { srv->before = s + sizeof("before:") - 1; s = NULL; } else { fprintf(stderr, "error: rc.conf: add service: repeated 'before'\n"); c = NULL; } } else if (strncasecmp("after:", s, sizeof("after:") - 1) == 0) { if (srv->after == NULL) { srv->after = s + sizeof("after:") - 1; s = NULL; } else { fprintf(stderr, "error: rc.conf: add service: repeated 'after'\n"); c = NULL; } } else if (strncasecmp("require:", s, sizeof("require:") - 1) == 0) { if (srv->require == NULL) { srv->require = s + sizeof("require:") - 1; s = NULL; } else { fprintf(stderr, "error: rc.conf: add service: repeated 'require'\n"); c = NULL; } } else { fprintf(stderr, "error: rc.conf: add service: unknown keyword: %s\n", s); c = NULL; } if (c == NULL) { free((void*) srv->control); free((void*) srv->name); free(srv); errno = EINVAL; return -1; } } else if (s == NULL) { s = c; } ++c; } if (s != NULL) { fprintf(stderr, "error: rc.conf: add service: no ';' found\n"); free((void*) srv->control); free((void*) srv->name); free(srv); errno = EINVAL; return -1; } /* * Place on the services list. The node is removed before being inserted. If * there are competing positions the last position is used. As a result * handle 'after' before 'before'. */ rtems_chain_prepend(&services, &srv->node); } else { /* * No control string, add the end. */ rtems_chain_append(&services, &srv->node); } /* * After. */ if (srv->after != NULL) { const char* cc = srv->after; while (*cc != '\0') { const char* cs = cc; size_t l; while (*cc != ',' && *cc != '\0') ++cc; l = cc - cs; if (strncasecmp(cs, "last", l) == 0) { fprintf(stderr, "error: rc.conf: add service: 'last' in 'after': %s\n", control); rtems_chain_extract(&srv->node); free((void*) srv->control); free((void*) srv->name); free(srv); errno = EINVAL; return -1; } else if (strncasecmp(cs, "first", l) == 0) { /* already prepended */ } else { rtems_chain_node* node = rtems_chain_first(&services); while (!rtems_chain_is_tail(&services, node)) { service* ss = (service*) node; if (ss != srv && strlen(ss->name) == l && strncasecmp(ss->name, cs, l) == 0) { rtems_chain_extract(&srv->node); rtems_chain_insert(&ss->node, &srv->node); break; } node = rtems_chain_next(node); } } } } /* * Before. */ if (srv->before != NULL) { const char* cc = srv->before; while (*cc != '\0') { const char* cs = cc; size_t l; while (*cc != ',' && *cc != '\0') ++cc; l = cc - cs; if (strncasecmp(cs, "first", l) == 0) { fprintf(stderr, "error: rc.conf: add service: 'first' in 'before'\n"); rtems_chain_extract(&srv->node); free((void*) srv->control); free((void*) srv->name); free(srv); errno = EINVAL; return -1; } else if (strncasecmp(cs, "last", l) == 0) { rtems_chain_extract(&srv->node); rtems_chain_append(&services, &srv->node); } else { rtems_chain_node* node = rtems_chain_first(&services); while (!rtems_chain_is_tail(&services, node)) { service* ss = (service*) node; if (strlen(ss->name) == l && strncasecmp(ss->name, cs, l) == 0) { rtems_chain_extract(&srv->node); if (rtems_chain_is_first(node)) rtems_chain_prepend(&services, &srv->node); else { service* sp = (service*) rtems_chain_previous(node); rtems_chain_insert(&sp->node, &srv->node); } break; } node = rtems_chain_next(node); } } } } return 0; }