/* * */ #include #include #include #include #include "request.h" #include "globals.h" #include "global.h" #include "callaspi.h" #include "aspi_rw.h" #include "rb.h" #include "buf.h" #include "dmem.h" /*************************************************************************** * * (...) * ***************************************************************************/ struct RB_OBJ *rb_new(rb_list) struct RB_OBJ **rb_list; { long size; struct RB_OBJ *rb; struct RB_OBJ *rb_cur; rb_cur = *rb_list; size = sizeof(struct RB_OBJ) + sizeof(IO_REQ); rb = dmem_alloc(&size); // rb = malloc(size); if (!rb) { error("Cannot allocate memory for request structure\n"); return (NULL); } else { rb->tag = 0L; rb->pattern = PATTERN_NULL; rb->issued = FALSE; rb->req_size = size; rb->data_size = 0L; rb->prev = NULL; rb->next = NULL; if (rb_cur) { /* * Move to the end of the list. */ for (; rb_cur->next; rb_cur = rb_cur->next) ; rb_cur->next = rb; rb->prev = rb_cur; } } *rb_list = rb; /* Point to req just added */ return (rb); } /*************************************************************************** * * (...) * ***************************************************************************/ struct RB_OBJ *rb_free(rb_list) struct RB_OBJ **rb_list; { struct RB_OBJ *rb_prev, *rb_cur, *rb_next; rb_cur = *rb_list; if (!rb_cur) { error("Attempt to free a nonexistant request object\n"); return (NULL); } rb_prev = rb_cur->prev; rb_next = rb_cur->next; if (rb_cur->data_size) error ("Memory pointed to by request object still has a nonzero data size"); dmem_free(&rb_cur); if (rb_prev) rb_prev->next = rb_next; if (rb_next) rb_next->prev = rb_prev; // // After deleting point to up stream request, because of special case: // with aspi_poll, where if a request is freed then the search stops // even if a request has not been examined yet. // if (rb_next) *rb_list = rb_next; else *rb_list = rb_prev; return (*rb_list); } /*************************************************************************** * * (...) * ***************************************************************************/ struct RB_OBJ *rb_first(rb_list) struct RB_OBJ **rb_list; { if (!*rb_list) error("NULL request list, cannot go to first request"); else {for (; (*rb_list)->prev; *rb_list = (*rb_list)->prev) ; } return (*rb_list); } /*************************************************************************** * * (...) * ***************************************************************************/ struct RB_OBJ *rb_next(rb_list) struct RB_OBJ **rb_list; { struct RB_OBJ *rb_cur; rb_cur = *rb_list; if (!rb_cur) error("NULL request list, cannot go to next request"); else { rb_cur = rb_cur->next; /* Next req */ if (rb_cur) /* Next exists? */ *rb_list = rb_cur; /* New list pointer */ } return (rb_cur); }