Skip to content

Commit 4abd3e0

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 cfada6f commit 4abd3e0

35 files changed

+1120
-112
lines changed

include/ur_api.h

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,8 @@ typedef enum ur_function_t {
230230
UR_FUNCTION_COMMAND_BUFFER_UPDATE_SIGNAL_EVENT_EXP = 243, ///< Enumerator for ::urCommandBufferUpdateSignalEventExp
231231
UR_FUNCTION_COMMAND_BUFFER_UPDATE_WAIT_EVENTS_EXP = 244, ///< Enumerator for ::urCommandBufferUpdateWaitEventsExp
232232
UR_FUNCTION_BINDLESS_IMAGES_MAP_EXTERNAL_LINEAR_MEMORY_EXP = 245, ///< Enumerator for ::urBindlessImagesMapExternalLinearMemoryExp
233+
UR_FUNCTION_SET_LOGGER_CALLBACK = 246, ///< Enumerator for ::urSetLoggerCallback
234+
UR_FUNCTION_SET_LOGGER_CALLBACK_LEVEL = 247, ///< Enumerator for ::urSetLoggerCallbackLevel
233235
/// @cond
234236
UR_FUNCTION_FORCE_UINT32 = 0x7fffffff
235237
/// @endcond
@@ -1025,6 +1027,70 @@ typedef enum ur_adapter_backend_t {
10251027

10261028
} ur_adapter_backend_t;
10271029

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

11066+
///////////////////////////////////////////////////////////////////////////////
11067+
/// @brief Function parameters for urSetLoggerCallback
11068+
/// @details Each entry is a pointer to the parameter passed to the function;
11069+
/// allowing the callback the ability to modify the parameter's value
11070+
typedef struct ur_set_logger_callback_params_t {
11071+
ur_adapter_handle_t *phAdapter;
11072+
ur_logger_output_callback_t *ppfnLoggerCallback;
11073+
void **ppUserData;
11074+
ur_logger_level_t *plevel;
11075+
} ur_set_logger_callback_params_t;
11076+
11077+
///////////////////////////////////////////////////////////////////////////////
11078+
/// @brief Function parameters for urSetLoggerCallbackLevel
11079+
/// @details Each entry is a pointer to the parameter passed to the function;
11080+
/// allowing the callback the ability to modify the parameter's value
11081+
typedef struct ur_set_logger_callback_level_params_t {
11082+
ur_adapter_handle_t *phAdapter;
11083+
ur_logger_level_t *plevel;
11084+
} ur_set_logger_callback_level_params_t;
11085+
1100011086
///////////////////////////////////////////////////////////////////////////////
1100111087
/// @brief Function parameters for urEnqueueKernelLaunch
1100211088
/// @details Each entry is a pointer to the parameter passed to the function;

include/ur_api_funcs.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ _UR_API(urAdapterRelease)
101101
_UR_API(urAdapterRetain)
102102
_UR_API(urAdapterGetLastError)
103103
_UR_API(urAdapterGetInfo)
104+
_UR_API(urSetLoggerCallback)
105+
_UR_API(urSetLoggerCallbackLevel)
104106
_UR_API(urEnqueueKernelLaunch)
105107
_UR_API(urEnqueueEventsWait)
106108
_UR_API(urEnqueueEventsWaitWithBarrier)

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
@@ -1826,6 +1834,22 @@ UR_APIEXPORT ur_result_t UR_APICALL urPrintAdapterGetLastErrorParams(const struc
18261834
/// - `buff_size < out_size`
18271835
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);
18281836

1837+
///////////////////////////////////////////////////////////////////////////////
1838+
/// @brief Print ur_set_logger_callback_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 urPrintSetLoggerCallbackParams(const struct ur_set_logger_callback_params_t *params, char *buffer, const size_t buff_size, size_t *out_size);
1844+
1845+
///////////////////////////////////////////////////////////////////////////////
1846+
/// @brief Print ur_set_logger_callback_level_params_t struct
1847+
/// @returns
1848+
/// - ::UR_RESULT_SUCCESS
1849+
/// - ::UR_RESULT_ERROR_INVALID_SIZE
1850+
/// - `buff_size < out_size`
1851+
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);
1852+
18291853
///////////////////////////////////////////////////////////////////////////////
18301854
/// @brief Print ur_enqueue_kernel_launch_params_t struct
18311855
/// @returns

include/ur_print.hpp

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ inline std::ostream &operator<<(std::ostream &os, enum ur_loader_config_info_t v
230230
inline std::ostream &operator<<(std::ostream &os, [[maybe_unused]] const struct ur_code_location_t params);
231231
inline std::ostream &operator<<(std::ostream &os, enum ur_adapter_info_t value);
232232
inline std::ostream &operator<<(std::ostream &os, enum ur_adapter_backend_t value);
233+
inline std::ostream &operator<<(std::ostream &os, enum ur_logger_level_t value);
233234
inline std::ostream &operator<<(std::ostream &os, enum ur_platform_info_t value);
234235
inline std::ostream &operator<<(std::ostream &os, enum ur_api_version_t value);
235236
inline std::ostream &operator<<(std::ostream &os, [[maybe_unused]] const struct ur_platform_native_properties_t params);
@@ -954,6 +955,12 @@ inline std::ostream &operator<<(std::ostream &os, enum ur_function_t value) {
954955
case UR_FUNCTION_BINDLESS_IMAGES_MAP_EXTERNAL_LINEAR_MEMORY_EXP:
955956
os << "UR_FUNCTION_BINDLESS_IMAGES_MAP_EXTERNAL_LINEAR_MEMORY_EXP";
956957
break;
958+
case UR_FUNCTION_SET_LOGGER_CALLBACK:
959+
os << "UR_FUNCTION_SET_LOGGER_CALLBACK";
960+
break;
961+
case UR_FUNCTION_SET_LOGGER_CALLBACK_LEVEL:
962+
os << "UR_FUNCTION_SET_LOGGER_CALLBACK_LEVEL";
963+
break;
957964
default:
958965
os << "unknown enumerator";
959966
break;
@@ -1981,6 +1988,33 @@ inline std::ostream &operator<<(std::ostream &os, enum ur_adapter_backend_t valu
19811988
return os;
19821989
}
19831990
///////////////////////////////////////////////////////////////////////////////
1991+
/// @brief Print operator for the ur_logger_level_t type
1992+
/// @returns
1993+
/// std::ostream &
1994+
inline std::ostream &operator<<(std::ostream &os, enum ur_logger_level_t value) {
1995+
switch (value) {
1996+
case UR_LOGGER_LEVEL_DEBUG:
1997+
os << "UR_LOGGER_LEVEL_DEBUG";
1998+
break;
1999+
case UR_LOGGER_LEVEL_INFO:
2000+
os << "UR_LOGGER_LEVEL_INFO";
2001+
break;
2002+
case UR_LOGGER_LEVEL_WARN:
2003+
os << "UR_LOGGER_LEVEL_WARN";
2004+
break;
2005+
case UR_LOGGER_LEVEL_ERR:
2006+
os << "UR_LOGGER_LEVEL_ERR";
2007+
break;
2008+
case UR_LOGGER_LEVEL_QUIET:
2009+
os << "UR_LOGGER_LEVEL_QUIET";
2010+
break;
2011+
default:
2012+
os << "unknown enumerator";
2013+
break;
2014+
}
2015+
return os;
2016+
}
2017+
///////////////////////////////////////////////////////////////////////////////
19842018
/// @brief Print operator for the ur_platform_info_t type
19852019
/// @returns
19862020
/// std::ostream &
@@ -13021,6 +13055,56 @@ inline std::ostream &operator<<(std::ostream &os, [[maybe_unused]] const struct
1302113055
return os;
1302213056
}
1302313057

13058+
///////////////////////////////////////////////////////////////////////////////
13059+
/// @brief Print operator for the ur_set_logger_callback_params_t type
13060+
/// @returns
13061+
/// std::ostream &
13062+
inline std::ostream &operator<<(std::ostream &os, [[maybe_unused]] const struct ur_set_logger_callback_params_t *params) {
13063+
13064+
os << ".hAdapter = ";
13065+
13066+
ur::details::printPtr(os,
13067+
*(params->phAdapter));
13068+
13069+
os << ", ";
13070+
os << ".pfnLoggerCallback = ";
13071+
13072+
os << reinterpret_cast<void *>(
13073+
*(params->ppfnLoggerCallback));
13074+
13075+
os << ", ";
13076+
os << ".pUserData = ";
13077+
13078+
ur::details::printPtr(os,
13079+
*(params->ppUserData));
13080+
13081+
os << ", ";
13082+
os << ".level = ";
13083+
13084+
os << *(params->plevel);
13085+
13086+
return os;
13087+
}
13088+
13089+
///////////////////////////////////////////////////////////////////////////////
13090+
/// @brief Print operator for the ur_set_logger_callback_level_params_t type
13091+
/// @returns
13092+
/// std::ostream &
13093+
inline std::ostream &operator<<(std::ostream &os, [[maybe_unused]] const struct ur_set_logger_callback_level_params_t *params) {
13094+
13095+
os << ".hAdapter = ";
13096+
13097+
ur::details::printPtr(os,
13098+
*(params->phAdapter));
13099+
13100+
os << ", ";
13101+
os << ".level = ";
13102+
13103+
os << *(params->plevel);
13104+
13105+
return os;
13106+
}
13107+
1302413108
///////////////////////////////////////////////////////////////////////////////
1302513109
/// @brief Print operator for the ur_enqueue_kernel_launch_params_t type
1302613110
/// @returns
@@ -18317,6 +18401,12 @@ inline ur_result_t UR_APICALL printFunctionParams(std::ostream &os, ur_function_
1831718401
case UR_FUNCTION_ADAPTER_GET_INFO: {
1831818402
os << (const struct ur_adapter_get_info_params_t *)params;
1831918403
} break;
18404+
case UR_FUNCTION_SET_LOGGER_CALLBACK: {
18405+
os << (const struct ur_set_logger_callback_params_t *)params;
18406+
} break;
18407+
case UR_FUNCTION_SET_LOGGER_CALLBACK_LEVEL: {
18408+
os << (const struct ur_set_logger_callback_level_params_t *)params;
18409+
} break;
1832018410
case UR_FUNCTION_ENQUEUE_KERNEL_LAUNCH: {
1832118411
os << (const struct ur_enqueue_kernel_launch_params_t *)params;
1832218412
} 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:

0 commit comments

Comments
 (0)