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_rtl_unresolved_compact (void) { rtems_rtl_unresolved_t* unresolved = rtems_rtl_unresolved (); if (unresolved) { /* * Iterate backwards over the blocks removing any used records. A block is * compacted moving up the block. */ rtems_chain_node* node = rtems_chain_last (&unresolved->blocks); while (!rtems_chain_is_head (&unresolved->blocks, node)) { rtems_chain_node* prev = rtems_chain_previous (node); rtems_rtl_unresolv_block_t* block = (rtems_rtl_unresolv_block_t*) node; rtems_rtl_unresolv_rec_t* rec = rtems_rtl_unresolved_rec_first (block); while (!rtems_rtl_unresolved_rec_is_last (block, rec)) { bool next = true; if (rec->type == rtems_rtl_unresolved_name) { if (rec->rec.name.refs == 0) { size_t name_recs = rtems_rtl_unresolved_name_recs (rec->rec.name.name); rtems_rtl_unresolved_clean_block (block, rec, name_recs, unresolved->block_recs); next = false; } } else if (rec->type == rtems_rtl_unresolved_reloc) { if (!rec->rec.reloc.obj) { rtems_rtl_unresolved_clean_block (block, rec, 1, unresolved->block_recs); next = false; } } if (next) rec = rtems_rtl_unresolved_rec_next (rec); } if (block->recs == 0) { rtems_chain_extract (node); free (block); } node = prev; } } }
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); }
/** * Scan the chain for a buffer that matches the block number. * * @param chain The chain to scan. * @param count The number of items on the chain. * @param block The block number to find. * @return rtems_rfs_buffer* The buffer if found else NULL. */ static rtems_rfs_buffer* rtems_rfs_scan_chain (rtems_chain_control* chain, uint32_t* count, rtems_rfs_buffer_block block) { rtems_rfs_buffer* buffer; rtems_chain_node* node; node = rtems_chain_last (chain); if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_CHAINS)) printf ("rtems-rfs: buffer-scan: count=%" PRIu32 ", block=%" PRIu32 ": ", *count, block); while (!rtems_chain_is_head (chain, node)) { buffer = (rtems_rfs_buffer*) node; if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_CHAINS)) printf ("%" PRIuPTR " ", ((intptr_t) buffer->user)); if (((rtems_rfs_buffer_block) ((intptr_t)(buffer->user))) == block) { if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_CHAINS)) printf (": found block=%" PRIuPTR "\n", ((intptr_t)(buffer->user))); (*count)--; rtems_chain_extract (node); rtems_chain_set_off_chain (node); return buffer; } node = rtems_chain_previous (node); } if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_CHAINS)) printf (": not found\n"); return NULL; }
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; }