codes-mapping-context.c 4.54 KB
Newer Older
1 2 3 4 5 6 7 8 9
/*
 * Copyright (C) 2015 University of Chicago.
 * See COPYRIGHT notice in top-level directory.
 *
 */

#include <codes/codes-mapping-context.h>
#include <codes/codes_mapping.h>

10
static struct codes_mctx const CODES_MCTX_DEFAULT_VAL = {
Jonathan Jenkins's avatar
Jonathan Jenkins committed
11 12 13 14 15 16 17 18 19 20 21
    .type = CODES_MCTX_GROUP_MODULO,
    .u = {
        .group_modulo = {
            .anno = {
                .annotation = NULL,
                .ignore_annotations = true
            }
        }
    }
};

22 23
struct codes_mctx const * const CODES_MCTX_DEFAULT = &CODES_MCTX_DEFAULT_VAL;

24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
struct codes_mctx codes_mctx_set_global_direct(tw_lpid lpid)
{
    struct codes_mctx rtn;
    rtn.type = CODES_MCTX_GLOBAL_DIRECT;
    rtn.u.global_direct.lpid = lpid;
    return rtn;
}
struct codes_mctx codes_mctx_set_group_modulo(
        char const * annotation,
        bool ignore_annotations)
{
    struct codes_mctx rtn;
    rtn.type = CODES_MCTX_GROUP_MODULO;
    rtn.u.group_modulo.anno.annotation = annotation;
    rtn.u.group_modulo.anno.ignore_annotations = ignore_annotations;
    return rtn;
}
struct codes_mctx codes_mctx_set_group_direct(
        int offset,
        char const * annotation,
        bool ignore_annotations)
{
    struct codes_mctx rtn;
    rtn.type = CODES_MCTX_GROUP_DIRECT;
    rtn.u.group_direct.offset = offset;
    rtn.u.group_direct.anno.annotation = annotation;
    rtn.u.group_direct.anno.ignore_annotations = ignore_annotations;
    return rtn;
}

/* helper function to do a codes mapping - this function is subject to change
 * based on what types of ctx exist */
tw_lpid codes_mctx_to_lpid(
        struct codes_mctx const * ctx,
        char const * dest_lp_name,
59
        tw_lpid sender_gid)
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
{
    struct codes_mctx_annotation const *anno;
    // short circuit for direct mappings
    switch (ctx->type) {
        case CODES_MCTX_GLOBAL_DIRECT:
            return ctx->u.global_direct.lpid;
        case CODES_MCTX_GROUP_MODULO:
            anno = &ctx->u.group_modulo.anno;
            break;
        case CODES_MCTX_GROUP_DIRECT:
            anno = &ctx->u.group_direct.anno;
            break;
        default:
            assert(0);
    }

    char sender_group[MAX_NAME_LENGTH];
    int unused, rep_id, offset;

    // get sender info
80
    codes_mapping_get_lp_info(sender_gid, sender_group, &unused, NULL, &unused,
81 82 83 84 85 86 87 88 89 90
            NULL, &rep_id, &offset);

    int dest_offset;
    if (ctx->type == CODES_MCTX_GROUP_MODULO) {
        int num_dest_lps = codes_mapping_get_lp_count(sender_group, 1,
                dest_lp_name, anno->annotation, anno->ignore_annotations);
        if (num_dest_lps == 0)
            tw_error(TW_LOC,
                    "ERROR: Found no LPs of type %s in group %s "
                    "(source lpid %lu) with annotation: %s\n",
91
                    dest_lp_name, sender_group, sender_gid,
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
                    anno->ignore_annotations ? "ignored" :
                    (anno->annotation ? anno->annotation : "none"));

        dest_offset = offset % num_dest_lps;
    }
    else if (ctx->type == CODES_MCTX_GROUP_DIRECT) {
        dest_offset = ctx->u.group_direct.offset;
    }
    else
        assert(0);

    tw_lpid rtn;
    codes_mapping_get_lp_id(sender_group, dest_lp_name, anno->annotation,
            anno->ignore_annotations, rep_id, dest_offset, &rtn);
    return rtn;
}

109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
char const * codes_mctx_get_annotation(
        struct codes_mctx const *ctx,
        char const * dest_lp_name,
        tw_lpid sender_id)
{
    switch(ctx->type) {
        case CODES_MCTX_GLOBAL_DIRECT:
            return codes_mapping_get_annotation_by_lpid(sender_id);
        case CODES_MCTX_GROUP_MODULO:
            // if not ignoring the annotation, just return what's in the
            // context
            if (!ctx->u.group_modulo.anno.ignore_annotations)
                return ctx->u.group_modulo.anno.annotation;
            break;
        case CODES_MCTX_GROUP_DIRECT:
            if (!ctx->u.group_direct.anno.ignore_annotations)
                return ctx->u.group_direct.anno.annotation;
            break;
        default:
            tw_error(TW_LOC, "unrecognized or uninitialized context type: %d",
                    ctx->type);
            return NULL;
    }
    // at this point, we must be a group-wise mapping ignoring annotations

    char group[MAX_NAME_LENGTH];
    int dummy;
    // only need the group name
    codes_mapping_get_lp_info(sender_id, group, &dummy, NULL, &dummy, NULL,
            &dummy, &dummy);

    return codes_mapping_get_annotation_by_name(group, dest_lp_name);
}

143 144 145 146 147 148 149 150 151
/*
 * Local variables:
 *  c-indent-level: 4
 *  c-basic-offset: 4
 *  indent-tabs-mode: nil
 * End:
 *
 * vim: ts=8 sts=4 sw=4 expandtab
 */