Skip to content

Commit a6ae39f

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 9d3bce6 commit a6ae39f

33 files changed

+1053
-111
lines changed

include/ur_api.h

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,8 @@ typedef enum ur_function_t {
226226
UR_FUNCTION_BINDLESS_IMAGES_IMPORT_EXTERNAL_MEMORY_EXP = 226, ///< Enumerator for ::urBindlessImagesImportExternalMemoryExp
227227
UR_FUNCTION_BINDLESS_IMAGES_IMPORT_EXTERNAL_SEMAPHORE_EXP = 227, ///< Enumerator for ::urBindlessImagesImportExternalSemaphoreExp
228228
UR_FUNCTION_ENQUEUE_NATIVE_COMMAND_EXP = 228, ///< Enumerator for ::urEnqueueNativeCommandExp
229+
UR_FUNCTION_SET_LOGGER_CALLBACK = 229, ///< Enumerator for ::urSetLoggerCallback
230+
UR_FUNCTION_SET_LOGGER_CALLBACK_LEVEL = 230, ///< Enumerator for ::urSetLoggerCallbackLevel
229231
/// @cond
230232
UR_FUNCTION_FORCE_UINT32 = 0x7fffffff
231233
/// @endcond
@@ -987,6 +989,70 @@ typedef enum ur_adapter_backend_t {
987989

988990
} ur_adapter_backend_t;
989991

992+
///////////////////////////////////////////////////////////////////////////////
993+
/// @brief Minimum level of messages to be processed by the logger.
994+
typedef enum ur_logger_level_t {
995+
UR_LOGGER_LEVEL_DEBUG = 0, ///< Debugging messages used for development purposes.
996+
UR_LOGGER_LEVEL_INFO = 1, ///< General messages not related to debugging, warnings or errors.
997+
UR_LOGGER_LEVEL_WARN = 2, ///< Used to warn users about potential problems.
998+
UR_LOGGER_LEVEL_ERR = 3, ///< Used when an error has occurred.
999+
UR_LOGGER_LEVEL_QUIET = 4, ///< Restrict logger processing any messages.
1000+
/// @cond
1001+
UR_LOGGER_LEVEL_FORCE_UINT32 = 0x7fffffff
1002+
/// @endcond
1003+
1004+
} ur_logger_level_t;
1005+
1006+
///////////////////////////////////////////////////////////////////////////////
1007+
/// @brief Callback function to retrieve output from the logger.
1008+
typedef void (*ur_logger_output_callback_t)(
1009+
ur_logger_level_t level, ///< [out] Minimum level of messages to be processed by the logger.
1010+
const char *pLoggerMsg, ///< [in][out] pointer to data to be passed to callback
1011+
void *pUserData ///< [in][out] pointer to data to be passed to callback
1012+
);
1013+
1014+
///////////////////////////////////////////////////////////////////////////////
1015+
/// @brief Set a callback function for use by the logger to retrieve logging output.
1016+
/// It is a requirement that the callback function is thread safe and the
1017+
/// creator of the function will be responsible for this.
1018+
///
1019+
/// @returns
1020+
/// - ::UR_RESULT_SUCCESS
1021+
/// - ::UR_RESULT_ERROR_UNINITIALIZED
1022+
/// - ::UR_RESULT_ERROR_DEVICE_LOST
1023+
/// - ::UR_RESULT_ERROR_ADAPTER_SPECIFIC
1024+
/// - ::UR_RESULT_ERROR_INVALID_NULL_HANDLE
1025+
/// + `NULL == hAdapter`
1026+
/// - ::UR_RESULT_ERROR_INVALID_NULL_POINTER
1027+
/// + `NULL == pfnLoggerCallback`
1028+
/// - ::UR_RESULT_ERROR_INVALID_ENUMERATION
1029+
/// + `::UR_LOGGER_LEVEL_QUIET < level`
1030+
UR_APIEXPORT ur_result_t UR_APICALL
1031+
urSetLoggerCallback(
1032+
ur_adapter_handle_t hAdapter, ///< [in] handle of the adapter
1033+
ur_logger_output_callback_t pfnLoggerCallback, ///< [in] Function pointer to callback from the logger.
1034+
void *pUserData, ///< [in][out][optional] pointer to data to be passed to callback
1035+
ur_logger_level_t level ///< [in] logging level
1036+
);
1037+
1038+
///////////////////////////////////////////////////////////////////////////////
1039+
/// @brief Set the minimum logging level for the logger Callback function.
1040+
///
1041+
/// @returns
1042+
/// - ::UR_RESULT_SUCCESS
1043+
/// - ::UR_RESULT_ERROR_UNINITIALIZED
1044+
/// - ::UR_RESULT_ERROR_DEVICE_LOST
1045+
/// - ::UR_RESULT_ERROR_ADAPTER_SPECIFIC
1046+
/// - ::UR_RESULT_ERROR_INVALID_NULL_HANDLE
1047+
/// + `NULL == hAdapter`
1048+
/// - ::UR_RESULT_ERROR_INVALID_ENUMERATION
1049+
/// + `::UR_LOGGER_LEVEL_QUIET < level`
1050+
UR_APIEXPORT ur_result_t UR_APICALL
1051+
urSetLoggerCallbackLevel(
1052+
ur_adapter_handle_t hAdapter, ///< [in] handle of the adapter
1053+
ur_logger_level_t level ///< [in] logging level
1054+
);
1055+
9901056
#if !defined(__GNUC__)
9911057
#pragma endregion
9921058
#endif
@@ -10565,6 +10631,26 @@ typedef struct ur_adapter_get_info_params_t {
1056510631
size_t **ppPropSizeRet;
1056610632
} ur_adapter_get_info_params_t;
1056710633

10634+
///////////////////////////////////////////////////////////////////////////////
10635+
/// @brief Function parameters for urSetLoggerCallback
10636+
/// @details Each entry is a pointer to the parameter passed to the function;
10637+
/// allowing the callback the ability to modify the parameter's value
10638+
typedef struct ur_set_logger_callback_params_t {
10639+
ur_adapter_handle_t *phAdapter;
10640+
ur_logger_output_callback_t *ppfnLoggerCallback;
10641+
void **ppUserData;
10642+
ur_logger_level_t *plevel;
10643+
} ur_set_logger_callback_params_t;
10644+
10645+
///////////////////////////////////////////////////////////////////////////////
10646+
/// @brief Function parameters for urSetLoggerCallbackLevel
10647+
/// @details Each entry is a pointer to the parameter passed to the function;
10648+
/// allowing the callback the ability to modify the parameter's value
10649+
typedef struct ur_set_logger_callback_level_params_t {
10650+
ur_adapter_handle_t *phAdapter;
10651+
ur_logger_level_t *plevel;
10652+
} ur_set_logger_callback_level_params_t;
10653+
1056810654
///////////////////////////////////////////////////////////////////////////////
1056910655
/// @brief Function parameters for urEnqueueKernelLaunch
1057010656
/// @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
@@ -1037,6 +1037,20 @@ typedef ur_result_t(UR_APICALL *ur_pfnAdapterGetInfo_t)(
10371037
void *,
10381038
size_t *);
10391039

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

10501066
///////////////////////////////////////////////////////////////////////////////

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
@@ -1802,6 +1810,22 @@ UR_APIEXPORT ur_result_t UR_APICALL urPrintAdapterGetLastErrorParams(const struc
18021810
/// - `buff_size < out_size`
18031811
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);
18041812

1813+
///////////////////////////////////////////////////////////////////////////////
1814+
/// @brief Print ur_set_logger_callback_params_t struct
1815+
/// @returns
1816+
/// - ::UR_RESULT_SUCCESS
1817+
/// - ::UR_RESULT_ERROR_INVALID_SIZE
1818+
/// - `buff_size < out_size`
1819+
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);
1820+
1821+
///////////////////////////////////////////////////////////////////////////////
1822+
/// @brief Print ur_set_logger_callback_level_params_t struct
1823+
/// @returns
1824+
/// - ::UR_RESULT_SUCCESS
1825+
/// - ::UR_RESULT_ERROR_INVALID_SIZE
1826+
/// - `buff_size < out_size`
1827+
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);
1828+
18051829
///////////////////////////////////////////////////////////////////////////////
18061830
/// @brief Print ur_enqueue_kernel_launch_params_t struct
18071831
/// @returns

include/ur_print.hpp

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ inline std::ostream &operator<<(std::ostream &os, enum ur_loader_config_info_t v
232232
inline std::ostream &operator<<(std::ostream &os, [[maybe_unused]] const struct ur_code_location_t params);
233233
inline std::ostream &operator<<(std::ostream &os, enum ur_adapter_info_t value);
234234
inline std::ostream &operator<<(std::ostream &os, enum ur_adapter_backend_t value);
235+
inline std::ostream &operator<<(std::ostream &os, enum ur_logger_level_t value);
235236
inline std::ostream &operator<<(std::ostream &os, enum ur_platform_info_t value);
236237
inline std::ostream &operator<<(std::ostream &os, enum ur_api_version_t value);
237238
inline std::ostream &operator<<(std::ostream &os, [[maybe_unused]] const struct ur_platform_native_properties_t params);
@@ -942,6 +943,12 @@ inline std::ostream &operator<<(std::ostream &os, enum ur_function_t value) {
942943
case UR_FUNCTION_ENQUEUE_NATIVE_COMMAND_EXP:
943944
os << "UR_FUNCTION_ENQUEUE_NATIVE_COMMAND_EXP";
944945
break;
946+
case UR_FUNCTION_SET_LOGGER_CALLBACK:
947+
os << "UR_FUNCTION_SET_LOGGER_CALLBACK";
948+
break;
949+
case UR_FUNCTION_SET_LOGGER_CALLBACK_LEVEL:
950+
os << "UR_FUNCTION_SET_LOGGER_CALLBACK_LEVEL";
951+
break;
945952
default:
946953
os << "unknown enumerator";
947954
break;
@@ -1958,6 +1965,33 @@ inline std::ostream &operator<<(std::ostream &os, enum ur_adapter_backend_t valu
19581965
return os;
19591966
}
19601967
///////////////////////////////////////////////////////////////////////////////
1968+
/// @brief Print operator for the ur_logger_level_t type
1969+
/// @returns
1970+
/// std::ostream &
1971+
inline std::ostream &operator<<(std::ostream &os, enum ur_logger_level_t value) {
1972+
switch (value) {
1973+
case UR_LOGGER_LEVEL_DEBUG:
1974+
os << "UR_LOGGER_LEVEL_DEBUG";
1975+
break;
1976+
case UR_LOGGER_LEVEL_INFO:
1977+
os << "UR_LOGGER_LEVEL_INFO";
1978+
break;
1979+
case UR_LOGGER_LEVEL_WARN:
1980+
os << "UR_LOGGER_LEVEL_WARN";
1981+
break;
1982+
case UR_LOGGER_LEVEL_ERR:
1983+
os << "UR_LOGGER_LEVEL_ERR";
1984+
break;
1985+
case UR_LOGGER_LEVEL_QUIET:
1986+
os << "UR_LOGGER_LEVEL_QUIET";
1987+
break;
1988+
default:
1989+
os << "unknown enumerator";
1990+
break;
1991+
}
1992+
return os;
1993+
}
1994+
///////////////////////////////////////////////////////////////////////////////
19611995
/// @brief Print operator for the ur_platform_info_t type
19621996
/// @returns
19631997
/// std::ostream &
@@ -12759,6 +12793,56 @@ inline std::ostream &operator<<(std::ostream &os, [[maybe_unused]] const struct
1275912793
return os;
1276012794
}
1276112795

12796+
///////////////////////////////////////////////////////////////////////////////
12797+
/// @brief Print operator for the ur_set_logger_callback_params_t type
12798+
/// @returns
12799+
/// std::ostream &
12800+
inline std::ostream &operator<<(std::ostream &os, [[maybe_unused]] const struct ur_set_logger_callback_params_t *params) {
12801+
12802+
os << ".hAdapter = ";
12803+
12804+
ur::details::printPtr(os,
12805+
*(params->phAdapter));
12806+
12807+
os << ", ";
12808+
os << ".pfnLoggerCallback = ";
12809+
12810+
os << reinterpret_cast<void *>(
12811+
*(params->ppfnLoggerCallback));
12812+
12813+
os << ", ";
12814+
os << ".pUserData = ";
12815+
12816+
ur::details::printPtr(os,
12817+
*(params->ppUserData));
12818+
12819+
os << ", ";
12820+
os << ".level = ";
12821+
12822+
os << *(params->plevel);
12823+
12824+
return os;
12825+
}
12826+
12827+
///////////////////////////////////////////////////////////////////////////////
12828+
/// @brief Print operator for the ur_set_logger_callback_level_params_t type
12829+
/// @returns
12830+
/// std::ostream &
12831+
inline std::ostream &operator<<(std::ostream &os, [[maybe_unused]] const struct ur_set_logger_callback_level_params_t *params) {
12832+
12833+
os << ".hAdapter = ";
12834+
12835+
ur::details::printPtr(os,
12836+
*(params->phAdapter));
12837+
12838+
os << ", ";
12839+
os << ".level = ";
12840+
12841+
os << *(params->plevel);
12842+
12843+
return os;
12844+
}
12845+
1276212846
///////////////////////////////////////////////////////////////////////////////
1276312847
/// @brief Print operator for the ur_enqueue_kernel_launch_params_t type
1276412848
/// @returns
@@ -17591,6 +17675,12 @@ inline ur_result_t UR_APICALL printFunctionParams(std::ostream &os, ur_function_
1759117675
case UR_FUNCTION_ADAPTER_GET_INFO: {
1759217676
os << (const struct ur_adapter_get_info_params_t *)params;
1759317677
} break;
17678+
case UR_FUNCTION_SET_LOGGER_CALLBACK: {
17679+
os << (const struct ur_set_logger_callback_params_t *)params;
17680+
} break;
17681+
case UR_FUNCTION_SET_LOGGER_CALLBACK_LEVEL: {
17682+
os << (const struct ur_set_logger_callback_level_params_t *)params;
17683+
} break;
1759417684
case UR_FUNCTION_ENQUEUE_KERNEL_LAUNCH: {
1759517685
os << (const struct ur_enqueue_kernel_launch_params_t *)params;
1759617686
} 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)