diff options
Diffstat (limited to 'lib/libtle_dring/dring.c')
-rw-r--r-- | lib/libtle_dring/dring.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/lib/libtle_dring/dring.c b/lib/libtle_dring/dring.c new file mode 100644 index 0000000..e0fae19 --- /dev/null +++ b/lib/libtle_dring/dring.c @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2016 Intel Corporation. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <tle_dring.h> + +static const char * +str_drb_dummy(const struct tle_dring *dr, const struct tle_drb *db) +{ + return (db == &dr->dummy) ? "<dummy>" : ""; +} + +static const char * +str_obj_state(const struct tle_dring *dr, const struct tle_drb *db, + uint32_t idx) +{ + if (db->start + idx < dr->cons.tail) + return "<stale>"; + else if (db->start + idx >= dr->prod.tail) + return "<free>"; + else + return NULL; +} + +static void +drb_obj_dump(FILE *f, int32_t verb, const struct tle_dring *dr, + const struct tle_drb *db, uint32_t idx) +{ + const char *st; + + st = str_obj_state(dr, db, idx); + + /* pointer to object is valid, dump it. */ + if (st == NULL) + fprintf(f, "\t\t\t\t%u:%p\n", db->start + idx, db->objs[idx]); + + /* dump in verbose mode only. */ + else if (verb > 0) + fprintf(f, "\t\t\t\t%u:%p%s\n", + db->start + idx, db->objs[idx], st); +} + +static void +drb_dump(FILE *f, int32_t verb, const struct tle_dring *dr, + const struct tle_drb *db) +{ + uint32_t i; + + fprintf(f, "\t\t@%p%s={\n", db, str_drb_dummy(dr, db)); + fprintf(f, "\t\t\tnext=%p,\n", db->next); + fprintf(f, "\t\t\tsize=%u,\n", db->size); + fprintf(f, "\t\t\tstart=%u,\n", db->start); + + fprintf(f, "\t\t\tobjs[]={\n"); + for (i = 0; i != db->size; i++) + drb_obj_dump(f, verb, dr, db, i); + fprintf(f, "\t\t\t},\n"); + + fprintf(f, "\t\t},\n"); +} + +void +tle_dring_dump(FILE *f, int32_t verb, const struct tle_dring *dr) +{ + struct tle_drb *db; + + fprintf(f, "tle_dring@%p={\n", dr); + fprintf(f, "\tflags=%#x,\n", dr->flags); + + fprintf(f, "\tprod={,\n"); + fprintf(f, "\t\thead=%u,\n", dr->prod.head); + fprintf(f, "\t\ttail=%u,\n", dr->prod.tail); + fprintf(f, "\t\tcrb=%p%s,\n", dr->prod.crb, + str_drb_dummy(dr, dr->prod.crb)); + fprintf(f, "\t},\n"); + + fprintf(f, "\tcons={,\n"); + fprintf(f, "\t\thead=%u,\n", dr->cons.head); + fprintf(f, "\t\ttail=%u,\n", dr->cons.tail); + fprintf(f, "\t\tcrb=%p%s,\n", dr->cons.crb, + str_drb_dummy(dr, dr->cons.crb)); + fprintf(f, "\t},\n"); + + fprintf(f, "\tdrbs[] = {\n"); + for (db = dr->prod.crb; db != NULL; db = db->next) + drb_dump(f, verb, dr, db); + fprintf(f, "\t},\n"); + + fprintf(f, "};\n"); +} |