1 /*
2  * Copyright (c) 2014-2017, Siemens AG. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  * 1. Redistributions of source code must retain the above copyright notice,
8  * this list of conditions and the following disclaimer.
9  *
10  * 2. Redistributions in binary form must reproduce the above copyright notice,
11  * this list of conditions and the following disclaimer in the documentation
12  * and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
18  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24  * POSSIBILITY OF SUCH DAMAGE.
25  */
26 
27 #include <assert.h>
28 
29 #include <embb/base/c/internal/bitset.h>
30 
31 #include <embb/mtapi/c/mtapi.h>
32 
33 #include <embb_mtapi_log.h>
34 #include <mtapi_status_t.h>
35 #include <embb_mtapi_node_t.h>
36 
37 
38 /* ---- INTERFACE FUNCTIONS ------------------------------------------------ */
39 
mtapi_affinity_init(MTAPI_OUT mtapi_affinity_t * mask,MTAPI_IN mtapi_boolean_t affinity,MTAPI_OUT mtapi_status_t * status)40 void mtapi_affinity_init(
41   MTAPI_OUT mtapi_affinity_t* mask,
42   MTAPI_IN mtapi_boolean_t affinity,
43   MTAPI_OUT mtapi_status_t* status) {
44   mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;
45   embb_mtapi_node_t * node = embb_mtapi_node_get_instance();
46 
47   embb_mtapi_log_trace("mtapi_affinity_init() called\n");
48 
49   if (embb_mtapi_node_is_initialized()) {
50     if (MTAPI_NULL != mask) {
51       embb_bitset_clear_all(mask);
52       if (affinity) {
53         embb_bitset_set_n(mask, node->attributes.num_cores);
54       }
55       local_status = MTAPI_SUCCESS;
56     } else {
57       local_status = MTAPI_ERR_PARAMETER;
58     }
59   } else {
60     local_status = MTAPI_ERR_NODE_NOTINIT;
61   }
62 
63   mtapi_status_set(status, local_status);
64 }
65 
mtapi_affinity_set(MTAPI_INOUT mtapi_affinity_t * mask,MTAPI_IN mtapi_uint_t core_num,MTAPI_IN mtapi_boolean_t affinity,MTAPI_OUT mtapi_status_t * status)66 void mtapi_affinity_set(
67   MTAPI_INOUT mtapi_affinity_t* mask,
68   MTAPI_IN mtapi_uint_t core_num,
69   MTAPI_IN mtapi_boolean_t affinity,
70   MTAPI_OUT mtapi_status_t* status) {
71   mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;
72   embb_mtapi_node_t * node = embb_mtapi_node_get_instance();
73 
74   embb_mtapi_log_trace("mtapi_affinity_set() called\n");
75 
76   if (embb_mtapi_node_is_initialized()) {
77     if (MTAPI_NULL != mask) {
78       if (core_num < node->attributes.num_cores) {
79         if (affinity) {
80           embb_bitset_set(mask, core_num);
81         } else {
82           embb_bitset_clear(mask, core_num);
83         }
84         local_status = MTAPI_SUCCESS;
85       } else {
86         local_status = MTAPI_ERR_CORE_NUM;
87       }
88     } else {
89       local_status = MTAPI_ERR_PARAMETER;
90     }
91   } else {
92     local_status = MTAPI_ERR_NODE_NOTINIT;
93   }
94 
95   mtapi_status_set(status, local_status);
96 }
97 
mtapi_affinity_get(MTAPI_OUT mtapi_affinity_t * mask,MTAPI_IN mtapi_uint_t core_num,MTAPI_OUT mtapi_status_t * status)98 mtapi_boolean_t mtapi_affinity_get(
99   MTAPI_OUT mtapi_affinity_t* mask,
100   MTAPI_IN mtapi_uint_t core_num,
101   MTAPI_OUT mtapi_status_t* status) {
102   mtapi_status_t local_status = MTAPI_ERR_UNKNOWN;
103   mtapi_boolean_t affinity = MTAPI_FALSE;
104   embb_mtapi_node_t * node = embb_mtapi_node_get_instance();
105 
106   embb_mtapi_log_trace("mtapi_affinity_get() called\n");
107 
108   if (embb_mtapi_node_is_initialized()) {
109     if (MTAPI_NULL != mask) {
110       if (core_num < node->attributes.num_cores) {
111         affinity =
112           embb_bitset_is_set(mask, core_num) ? MTAPI_TRUE : MTAPI_FALSE;
113         local_status = MTAPI_SUCCESS;
114       } else {
115         local_status = MTAPI_ERR_CORE_NUM;
116       }
117     } else {
118       local_status = MTAPI_ERR_PARAMETER;
119     }
120   } else {
121     local_status = MTAPI_ERR_NODE_NOTINIT;
122   }
123 
124   mtapi_status_set(status, local_status);
125   return affinity;
126 }
127