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