Appendix A. libreact API Example

The following shows a simple libreact API example:

/*
 *  # cc libreact-api.c -lreact
 */


#include <stdio.h>
#include <stdlib.h>
#include <bitmask.h>
#include <cpuset.h>
#include <react.h>

/*
 * Set to 1 for cpu_sysrt_irq example.
 * Additional IRQ setup info needed below
 */
#define IRQ_TEST 0

static char *bmp_to_list(const struct bitmask *bmp)
{
        char *buf = NULL;
        int buflen;
        char c;

        /* First bitmask_displaylist() call just to get the length */
        buflen = bitmask_displaylist(&c, 1, bmp) + 1;   /* "+ 1" for nul */
        if ((buf = malloc(buflen)) == NULL)
                return NULL;

        bitmask_displaylist(buf, buflen, bmp);
        return buf;
}

void display_react_info(void)
{
        struct bitmask *i_cpus = NULL;
        char *dp;

        if ((i_cpus = bitmask_alloc(cpuset_cpus_nbits())) == NULL) {
                perror("cpuset: bitmask alloc failed:");
                exit (1);
        }

        if (cpu_sysrt_info(&i_cpus, QBOOTCPUS)){
                perror("cpu_sysrt_info failed:");
        }
        dp = bmp_to_list(i_cpus);
        printf("/boot cpus %s, ",dp);
        free(dp);

        if (cpu_sysrt_info(&i_cpus, QBOOTMEMS)){
                perror("cpu_sysrt_info failed:");
        }
        dp = bmp_to_list(i_cpus);
        printf("/boot mems %s\n",dp);
        free(dp);

        if (cpu_sysrt_info(&i_cpus, QRTCPUS)){
                perror("cpu_sysrt_info failed:");
        }
        dp = bmp_to_list(i_cpus);
        printf("/rtcpus cpus %s, ",dp);
        free(dp);

        if (cpu_sysrt_info(&i_cpus, QRTMEMS)){
                perror("cpu_sysrt_info failed:");
        }
        dp = bmp_to_list(i_cpus);
        printf("/rtcpus mems %s\n",dp);
        free(dp);

        bitmask_free(i_cpus);

}

int main(int argc, char **argv)
{
        struct bitmask *cpus = NULL;

        /* List of new rtcpus, [0] = #of rtcpus in array */
        int cpulist[10] = {2,2,3};
        int i, cpu_to_runon = 2;

        if ((cpus = bitmask_alloc(cpuset_cpus_nbits())) == NULL) {
                perror("cpuset: bitmask alloc failed:");
                exit (1);
        }

        printf("Original REACT setup.\n");
        printf("==============================\n");
        display_react_info();
        printf("==============================\n");

        for (i = 1; i <= cpulist[0]; i++) {
                bitmask_setbit(cpus, cpulist[i]);
        }

        /* Add rtcpus */
        if (cpu_sysrt_add(cpus, RT_WAIT)){
                perror("cpu_sysrt_add failed:");
        }

        /* Set permissions of REACT bits*/
        gid_t           group_id = 117; /* group id or PARAMETER_UNCHANGED, READ_FROM_FILE */
        mode_t          mode     = 01644; /* permissions or PARAMETER_UNCHANGED, READ_FROM_FILE*/
        unsigned long   mask     = RT_NO_WAIT;    /* or RT_WAIT  */

        if (cpu_sysrt_perm(group_id, mode,  mask) < 0){
                perror("Permissions failed");
        }

#ifdef IRQ_TEST
        /* IRQ */
        char user_irq_input_buf[45] = "86:2,89:1,87:3,18:4,88:6";

        if (cpu_sysrt_irq(user_irq_input_buf, RT_WAIT)){
                perror("cpu_sysrt_irq failed");
        }
#endif
        /* Move ourselves to an rtcpu */
        cpu_sysrt_runon(cpu_to_runon);

        printf("\nProgram modified REACT setup\n");
        printf("==============================\n");
        display_react_info();
        printf("==============================\n");
        printf("\nNow running on /rtcpus/rtcpu%d, press 'Enter' to cont..\n",cpu_to_runon);
        getchar();


        /* Delete rtcpus that were added */
        if (cpu_sysrt_delete(cpus, RT_WAIT)){
                perror("cpu_sysrt_del failed:");
        }

        bitmask_free(cpus);

        return 0;
}