Skip to content

Commit df90943

Browse files
committed
Added new output sink to the logger which is a user configurable callback function.
Configurable through two new entry points with adapter implementations: urAdapterSetLoggerCallback() and urAdapterSetLoggerCallbackLevel(). Moved logger::level enum to the spec, named ur_logger_level_t. Added new unit test suite for these entry points.
1 parent 40a790f commit df90943

33 files changed

+1102
-111
lines changed

include/ur_api.h

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,8 @@ typedef enum ur_function_t {
228228
UR_FUNCTION_LOADER_CONFIG_SET_MOCKING_ENABLED = 229, ///< Enumerator for ::urLoaderConfigSetMockingEnabled
229229
UR_FUNCTION_BINDLESS_IMAGES_RELEASE_EXTERNAL_MEMORY_EXP = 230, ///< Enumerator for ::urBindlessImagesReleaseExternalMemoryExp
230230
UR_FUNCTION_BINDLESS_IMAGES_MAP_EXTERNAL_LINEAR_MEMORY_EXP = 231, ///< Enumerator for ::urBindlessImagesMapExternalLinearMemoryExp
231+
UR_FUNCTION_SET_LOGGER_CALLBACK = 232, ///< Enumerator for ::urSetLoggerCallback
232+
UR_FUNCTION_SET_LOGGER_CALLBACK_LEVEL = 233, ///< Enumerator for ::urSetLoggerCallbackLevel
231233
/// @cond
232234
UR_FUNCTION_FORCE_UINT32 = 0x7fffffff
233235
/// @endcond
@@ -1013,6 +1015,70 @@ typedef enum ur_adapter_backend_t {
10131015

10141016
} ur_adapter_backend_t;
10151017

1018+
///////////////////////////////////////////////////////////////////////////////
1019+
/// @brief Minimum level of messages to be processed by the logger.
1020+
typedef enum ur_logger_level_t {
1021+
UR_LOGGER_LEVEL_DEBUG = 0, ///< Debugging messages used for development purposes.
1022+
UR_LOGGER_LEVEL_INFO = 1, ///< General messages not related to debugging, warnings or errors.
1023+
UR_LOGGER_LEVEL_WARN = 2, ///< Used to warn users about potential problems.
1024+
UR_LOGGER_LEVEL_ERR = 3, ///< Used when an error has occurred.
1025+
UR_LOGGER_LEVEL_QUIET = 4, ///< Restrict logger processing any messages.
1026+
/// @cond
1027+
UR_LOGGER_LEVEL_FORCE_UINT32 = 0x7fffffff
1028+
/// @endcond
1029+
1030+
} ur_logger_level_t;
1031+
1032+
///////////////////////////////////////////////////////////////////////////////
1033+
/// @brief Callback function to retrieve output from the logger.
1034+
typedef void (*ur_logger_output_callback_t)(
1035+
ur_logger_level_t level, ///< [out] Minimum level of messages to be processed by the logger.
1036+
const char *pLoggerMsg, ///< [in][out] pointer to data to be passed to callback
1037+
void *pUserData ///< [in][out] pointer to data to be passed to callback
1038+
);
1039+
1040+
///////////////////////////////////////////////////////////////////////////////
1041+
/// @brief Set a callback function for use by the logger to retrieve logging output.
1042+
/// It is a requirement that the callback function is thread safe and the
1043+
/// creator of the function will be responsible for this.
1044+
///
1045+
/// @returns
1046+
/// - ::UR_RESULT_SUCCESS
1047+
/// - ::UR_RESULT_ERROR_UNINITIALIZED
1048+
/// - ::UR_RESULT_ERROR_DEVICE_LOST
1049+
/// - ::UR_RESULT_ERROR_ADAPTER_SPECIFIC
1050+
/// - ::UR_RESULT_ERROR_INVALID_NULL_HANDLE
1051+
/// + `NULL == hAdapter`
1052+
/// - ::UR_RESULT_ERROR_INVALID_NULL_POINTER
1053+
/// + `NULL == pfnLoggerCallback`
1054+
/// - ::UR_RESULT_ERROR_INVALID_ENUMERATION
1055+
/// + `::UR_LOGGER_LEVEL_QUIET < level`
1056+
UR_APIEXPORT ur_result_t UR_APICALL
1057+
urSetLoggerCallback(
1058+
ur_adapter_handle_t hAdapter, ///< [in] handle of the adapter
1059+
ur_logger_output_callback_t pfnLoggerCallback, ///< [in] Function pointer to callback from the logger.
1060+
void *pUserData, ///< [in][out][optional] pointer to data to be passed to callback
1061+
ur_logger_level_t level ///< [in] logging level
1062+
);
1063+
1064+
///////////////////////////////////////////////////////////////////////////////
1065+
/// @brief Set the minimum logging level for the logger Callback function.
1066+
///
1067+
/// @returns
1068+
/// - ::UR_RESULT_SUCCESS
1069+
/// - ::UR_RESULT_ERROR_UNINITIALIZED
1070+
/// - ::UR_RESULT_ERROR_DEVICE_LOST
1071+
/// - ::UR_RESULT_ERROR_ADAPTER_SPECIFIC
1072+
/// - ::UR_RESULT_ERROR_INVALID_NULL_HANDLE
1073+
/// + `NULL == hAdapter`
1074+
/// - ::UR_RESULT_ERROR_INVALID_ENUMERATION
1075+
/// + `::UR_LOGGER_LEVEL_QUIET < level`
1076+
UR_APIEXPORT ur_result_t UR_APICALL
1077+
urSetLoggerCallbackLevel(
1078+
ur_adapter_handle_t hAdapter, ///< [in] handle of the adapter
1079+
ur_logger_level_t level ///< [in] logging level
1080+
);
1081+
10161082
#if !defined(__GNUC__)
10171083
#pragma endregion
10181084
#endif
@@ -10651,6 +10717,26 @@ typedef struct ur_adapter_get_info_params_t {
1065110717
size_t **ppPropSizeRet;
1065210718
} ur_adapter_get_info_params_t;
1065310719

10720+
///////////////////////////////////////////////////////////////////////////////
10721+
/// @brief Function parameters for urSetLoggerCallback
10722+
/// @details Each entry is a pointer to the parameter passed to the function;
10723+
/// allowing the callback the ability to modify the parameter's value
10724+
typedef struct ur_set_logger_callback_params_t {
10725+
ur_adapter_handle_t *phAdapter;
10726+
ur_logger_output_callback_t *ppfnLoggerCallback;
10727+
void **ppUserData;
10728+
ur_logger_level_t *plevel;
10729+
} ur_set_logger_callback_params_t;
10730+
10731+
///////////////////////////////////////////////////////////////////////////////
10732+
/// @brief Function parameters for urSetLoggerCallbackLevel
10733+
/// @details Each entry is a pointer to the parameter passed to the function;
10734+
/// allowing the callback the ability to modify the parameter's value
10735+
typedef struct ur_set_logger_callback_level_params_t {
10736+
ur_adapter_handle_t *phAdapter;
10737+
ur_logger_level_t *plevel;
10738+
} ur_set_logger_callback_level_params_t;
10739+
1065410740
///////////////////////////////////////////////////////////////////////////////
1065510741
/// @brief Function parameters for urEnqueueKernelLaunch
1065610742
/// @details Each entry is a pointer to the parameter passed to the function;

include/ur_ddi.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,6 +1038,20 @@ typedef ur_result_t(UR_APICALL *ur_pfnAdapterGetInfo_t)(
10381038
void *,
10391039
size_t *);
10401040

1041+
///////////////////////////////////////////////////////////////////////////////
1042+
/// @brief Function-pointer for urSetLoggerCallback
1043+
typedef ur_result_t(UR_APICALL *ur_pfnSetLoggerCallback_t)(
1044+
ur_adapter_handle_t,
1045+
ur_logger_output_callback_t,
1046+
void *,
1047+
ur_logger_level_t);
1048+
1049+
///////////////////////////////////////////////////////////////////////////////
1050+
/// @brief Function-pointer for urSetLoggerCallbackLevel
1051+
typedef ur_result_t(UR_APICALL *ur_pfnSetLoggerCallbackLevel_t)(
1052+
ur_adapter_handle_t,
1053+
ur_logger_level_t);
1054+
10411055
///////////////////////////////////////////////////////////////////////////////
10421056
/// @brief Table of Global functions pointers
10431057
typedef struct ur_global_dditable_t {
@@ -1046,6 +1060,8 @@ typedef struct ur_global_dditable_t {
10461060
ur_pfnAdapterRetain_t pfnAdapterRetain;
10471061
ur_pfnAdapterGetLastError_t pfnAdapterGetLastError;
10481062
ur_pfnAdapterGetInfo_t pfnAdapterGetInfo;
1063+
ur_pfnSetLoggerCallback_t pfnSetLoggerCallback;
1064+
ur_pfnSetLoggerCallbackLevel_t pfnSetLoggerCallbackLevel;
10491065
} ur_global_dditable_t;
10501066

10511067
///////////////////////////////////////////////////////////////////////////////

include/ur_print.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,14 @@ UR_APIEXPORT ur_result_t UR_APICALL urPrintAdapterInfo(enum ur_adapter_info_t va
114114
/// - `buff_size < out_size`
115115
UR_APIEXPORT ur_result_t UR_APICALL urPrintAdapterBackend(enum ur_adapter_backend_t value, char *buffer, const size_t buff_size, size_t *out_size);
116116

117+
///////////////////////////////////////////////////////////////////////////////
118+
/// @brief Print ur_logger_level_t enum
119+
/// @returns
120+
/// - ::UR_RESULT_SUCCESS
121+
/// - ::UR_RESULT_ERROR_INVALID_SIZE
122+
/// - `buff_size < out_size`
123+
UR_APIEXPORT ur_result_t UR_APICALL urPrintLoggerLevel(enum ur_logger_level_t value, char *buffer, const size_t buff_size, size_t *out_size);
124+
117125
///////////////////////////////////////////////////////////////////////////////
118126
/// @brief Print ur_platform_info_t enum
119127
/// @returns
@@ -1818,6 +1826,22 @@ UR_APIEXPORT ur_result_t UR_APICALL urPrintAdapterGetLastErrorParams(const struc
18181826
/// - `buff_size < out_size`
18191827
UR_APIEXPORT ur_result_t UR_APICALL urPrintAdapterGetInfoParams(const struct ur_adapter_get_info_params_t *params, char *buffer, const size_t buff_size, size_t *out_size);
18201828

1829+
///////////////////////////////////////////////////////////////////////////////
1830+
/// @brief Print ur_set_logger_callback_params_t struct
1831+
/// @returns
1832+
/// - ::UR_RESULT_SUCCESS
1833+
/// - ::UR_RESULT_ERROR_INVALID_SIZE
1834+
/// - `buff_size < out_size`
1835+
UR_APIEXPORT ur_result_t UR_APICALL urPrintSetLoggerCallbackParams(const struct ur_set_logger_callback_params_t *params, char *buffer, const size_t buff_size, size_t *out_size);
1836+
1837+
///////////////////////////////////////////////////////////////////////////////
1838+
/// @brief Print ur_set_logger_callback_level_params_t struct
1839+
/// @returns
1840+
/// - ::UR_RESULT_SUCCESS
1841+
/// - ::UR_RESULT_ERROR_INVALID_SIZE
1842+
/// - `buff_size < out_size`
1843+
UR_APIEXPORT ur_result_t UR_APICALL urPrintSetLoggerCallbackLevelParams(const struct ur_set_logger_callback_level_params_t *params, char *buffer, const size_t buff_size, size_t *out_size);
1844+
18211845
///////////////////////////////////////////////////////////////////////////////
18221846
/// @brief Print ur_enqueue_kernel_launch_params_t struct
18231847
/// @returns

include/ur_print.hpp

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@ inline std::ostream &operator<<(std::ostream &os, enum ur_loader_config_info_t v
228228
inline std::ostream &operator<<(std::ostream &os, [[maybe_unused]] const struct ur_code_location_t params);
229229
inline std::ostream &operator<<(std::ostream &os, enum ur_adapter_info_t value);
230230
inline std::ostream &operator<<(std::ostream &os, enum ur_adapter_backend_t value);
231+
inline std::ostream &operator<<(std::ostream &os, enum ur_logger_level_t value);
231232
inline std::ostream &operator<<(std::ostream &os, enum ur_platform_info_t value);
232233
inline std::ostream &operator<<(std::ostream &os, enum ur_api_version_t value);
233234
inline std::ostream &operator<<(std::ostream &os, [[maybe_unused]] const struct ur_platform_native_properties_t params);
@@ -945,6 +946,12 @@ inline std::ostream &operator<<(std::ostream &os, enum ur_function_t value) {
945946
case UR_FUNCTION_BINDLESS_IMAGES_MAP_EXTERNAL_LINEAR_MEMORY_EXP:
946947
os << "UR_FUNCTION_BINDLESS_IMAGES_MAP_EXTERNAL_LINEAR_MEMORY_EXP";
947948
break;
949+
case UR_FUNCTION_SET_LOGGER_CALLBACK:
950+
os << "UR_FUNCTION_SET_LOGGER_CALLBACK";
951+
break;
952+
case UR_FUNCTION_SET_LOGGER_CALLBACK_LEVEL:
953+
os << "UR_FUNCTION_SET_LOGGER_CALLBACK_LEVEL";
954+
break;
948955
default:
949956
os << "unknown enumerator";
950957
break;
@@ -1969,6 +1976,33 @@ inline std::ostream &operator<<(std::ostream &os, enum ur_adapter_backend_t valu
19691976
return os;
19701977
}
19711978
///////////////////////////////////////////////////////////////////////////////
1979+
/// @brief Print operator for the ur_logger_level_t type
1980+
/// @returns
1981+
/// std::ostream &
1982+
inline std::ostream &operator<<(std::ostream &os, enum ur_logger_level_t value) {
1983+
switch (value) {
1984+
case UR_LOGGER_LEVEL_DEBUG:
1985+
os << "UR_LOGGER_LEVEL_DEBUG";
1986+
break;
1987+
case UR_LOGGER_LEVEL_INFO:
1988+
os << "UR_LOGGER_LEVEL_INFO";
1989+
break;
1990+
case UR_LOGGER_LEVEL_WARN:
1991+
os << "UR_LOGGER_LEVEL_WARN";
1992+
break;
1993+
case UR_LOGGER_LEVEL_ERR:
1994+
os << "UR_LOGGER_LEVEL_ERR";
1995+
break;
1996+
case UR_LOGGER_LEVEL_QUIET:
1997+
os << "UR_LOGGER_LEVEL_QUIET";
1998+
break;
1999+
default:
2000+
os << "unknown enumerator";
2001+
break;
2002+
}
2003+
return os;
2004+
}
2005+
///////////////////////////////////////////////////////////////////////////////
19722006
/// @brief Print operator for the ur_platform_info_t type
19732007
/// @returns
19742008
/// std::ostream &
@@ -12845,6 +12879,56 @@ inline std::ostream &operator<<(std::ostream &os, [[maybe_unused]] const struct
1284512879
return os;
1284612880
}
1284712881

12882+
///////////////////////////////////////////////////////////////////////////////
12883+
/// @brief Print operator for the ur_set_logger_callback_params_t type
12884+
/// @returns
12885+
/// std::ostream &
12886+
inline std::ostream &operator<<(std::ostream &os, [[maybe_unused]] const struct ur_set_logger_callback_params_t *params) {
12887+
12888+
os << ".hAdapter = ";
12889+
12890+
ur::details::printPtr(os,
12891+
*(params->phAdapter));
12892+
12893+
os << ", ";
12894+
os << ".pfnLoggerCallback = ";
12895+
12896+
os << reinterpret_cast<void *>(
12897+
*(params->ppfnLoggerCallback));
12898+
12899+
os << ", ";
12900+
os << ".pUserData = ";
12901+
12902+
ur::details::printPtr(os,
12903+
*(params->ppUserData));
12904+
12905+
os << ", ";
12906+
os << ".level = ";
12907+
12908+
os << *(params->plevel);
12909+
12910+
return os;
12911+
}
12912+
12913+
///////////////////////////////////////////////////////////////////////////////
12914+
/// @brief Print operator for the ur_set_logger_callback_level_params_t type
12915+
/// @returns
12916+
/// std::ostream &
12917+
inline std::ostream &operator<<(std::ostream &os, [[maybe_unused]] const struct ur_set_logger_callback_level_params_t *params) {
12918+
12919+
os << ".hAdapter = ";
12920+
12921+
ur::details::printPtr(os,
12922+
*(params->phAdapter));
12923+
12924+
os << ", ";
12925+
os << ".level = ";
12926+
12927+
os << *(params->plevel);
12928+
12929+
return os;
12930+
}
12931+
1284812932
///////////////////////////////////////////////////////////////////////////////
1284912933
/// @brief Print operator for the ur_enqueue_kernel_launch_params_t type
1285012934
/// @returns
@@ -17726,6 +17810,12 @@ inline ur_result_t UR_APICALL printFunctionParams(std::ostream &os, ur_function_
1772617810
case UR_FUNCTION_ADAPTER_GET_INFO: {
1772717811
os << (const struct ur_adapter_get_info_params_t *)params;
1772817812
} break;
17813+
case UR_FUNCTION_SET_LOGGER_CALLBACK: {
17814+
os << (const struct ur_set_logger_callback_params_t *)params;
17815+
} break;
17816+
case UR_FUNCTION_SET_LOGGER_CALLBACK_LEVEL: {
17817+
os << (const struct ur_set_logger_callback_level_params_t *)params;
17818+
} break;
1772917819
case UR_FUNCTION_ENQUEUE_KERNEL_LAUNCH: {
1773017820
os << (const struct ur_enqueue_kernel_launch_params_t *)params;
1773117821
} break;

scripts/core/INTRO.rst

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,9 +202,9 @@ By default, no messages are printed.
202202

203203
By default, there is a guarantee that *error* messages are flushed immediately. One can change this behavior to flush on lower-level messages.
204204

205-
Loggers redirect messages to *stdout*, *stderr*, or a file (default: *stderr*).
205+
Loggers redirect messages to *stdout*, *stderr*, a file or a user configurable callback function (default: *stderr*).
206206

207-
All of these logging options can be set with **UR_LOG_LOADER** and **UR_LOG_NULL** environment variables described in the **Environment Variables** section below.
207+
All of these logging options (except the callback) can be set with **UR_LOG_LOADER** and **UR_LOG_NULL** environment variables described in the **Environment Variables** section below.
208208
Both of these environment variables have the same syntax for setting logger options:
209209

210210
"[level:debug|info|warning|error];[flush:<debug|info|warning|error>];[output:stdout|stderr|file,<path>]"
@@ -232,6 +232,10 @@ An example of an environment variable for setting up the null adapter library wi
232232

233233
UR_LOG_NULL="level:warning;output:stdout"
234234

235+
Logging callback
236+
^^^^^^^^^^^^^^^^^^^^^
237+
An API is available to configure the logging callback function :ref:`urSetLoggerCallback`. Additionally, the logging level can be set using :ref:`urSetLoggerCallbackLevel`.
238+
235239
Adapter Discovery
236240
---------------------
237241
UR is capable of discovering adapter libraries in the following ways in the listed order:

scripts/core/adapter.yml

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,3 +200,76 @@ etors:
200200
- name: NATIVE_CPU
201201
value: "5"
202202
desc: "The backend is Native CPU"
203+
--- #--------------------------------------------------------------------------
204+
type: enum
205+
desc: "Minimum level of messages to be processed by the logger."
206+
class: $x
207+
name: $x_logger_level_t
208+
etors:
209+
- name: DEBUG
210+
value: "0"
211+
desc: "Debugging messages used for development purposes."
212+
- name: INFO
213+
value: "1"
214+
desc: "General messages not related to debugging, warnings or errors."
215+
- name: WARN
216+
value: "2"
217+
desc: "Used to warn users about potential problems."
218+
- name: ERR
219+
value: "3"
220+
desc: "Used when an error has occurred."
221+
- name: QUIET
222+
value: "4"
223+
desc: "Restrict logger processing any messages."
224+
--- #--------------------------------------------------------------------------
225+
type: fptr_typedef
226+
desc: "Callback function to retrieve output from the logger."
227+
name: $x_logger_output_callback_t
228+
return: "void"
229+
params:
230+
- type: $x_logger_level_t
231+
name: level
232+
desc: "[out] Minimum level of messages to be processed by the logger."
233+
init: DEBUG
234+
- type: const char*
235+
name: pLoggerMsg
236+
desc: "[in][out] pointer to data to be passed to callback"
237+
- type: void*
238+
name: pUserData
239+
desc: "[in][out] pointer to data to be passed to callback"
240+
--- #--------------------------------------------------------------------------
241+
type: function
242+
desc: |
243+
Set a callback function for use by the logger to retrieve logging output.
244+
It is a requirement that the callback function is thread safe and the
245+
creator of the function will be responsible for this.
246+
class: $x
247+
name: SetLoggerCallback
248+
decl: static
249+
params:
250+
- type: $x_adapter_handle_t
251+
name: hAdapter
252+
desc: "[in] handle of the adapter"
253+
- type: $x_logger_output_callback_t
254+
name: pfnLoggerCallback
255+
desc: "[in] Function pointer to callback from the logger."
256+
- type: void*
257+
name: pUserData
258+
desc: "[in][out][optional] pointer to data to be passed to callback"
259+
- type: $x_logger_level_t
260+
name: level
261+
desc: "[in] logging level"
262+
init: 0
263+
--- #--------------------------------------------------------------------------
264+
type: function
265+
desc: "Set the minimum logging level for the logger Callback function."
266+
class: $x
267+
name: SetLoggerCallbackLevel
268+
decl: static
269+
params:
270+
- type: $x_adapter_handle_t
271+
name: hAdapter
272+
desc: "[in] handle of the adapter"
273+
- type: $x_logger_level_t
274+
name: level
275+
desc: "[in] logging level"

0 commit comments

Comments
 (0)