util/log: improve logger_android

Avoid __android_log_vprint which can truncate messages.  Also add
MESA_LOG=wait to lower the chance of logger_android dropping messages.

Reviewed-by: Emma Anholt <emma@anholt.net>
Reviewed-by: Jesse Natalie <jenatali@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21454>
This commit is contained in:
Chia-I Wu
2023-02-17 15:22:17 -08:00
committed by Marge Bot
parent 7a18a1712a
commit bbd19527c1
2 changed files with 28 additions and 1 deletions
+5
View File
@@ -2,6 +2,11 @@
extern "C" {
int __android_log_write(int prio, const char* tag, const char* text)
{
return 0;
}
int __android_log_print(int prio, const char* tag, const char* fmt, ...)
{
return 0;
+23 -1
View File
@@ -40,6 +40,8 @@ enum mesa_log_control {
MESA_LOG_CONTROL_FILE = 1 << 1,
MESA_LOG_CONTROL_ANDROID = 1 << 2,
MESA_LOG_CONTROL_LOGGER_MASK = 0xff,
MESA_LOG_CONTROL_WAIT = 1 << 8,
};
static const struct debug_control mesa_log_control_options[] = {
@@ -47,6 +49,8 @@ static const struct debug_control mesa_log_control_options[] = {
{ "null", MESA_LOG_CONTROL_NULL },
{ "file", MESA_LOG_CONTROL_FILE },
{ "android", MESA_LOG_CONTROL_ANDROID },
/* flags */
{ "wait", MESA_LOG_CONTROL_WAIT },
{ NULL, 0 },
};
@@ -203,7 +207,25 @@ logger_android(enum mesa_log_level level,
const char *format,
va_list va)
{
__android_log_vprint(level_to_android(level), tag, format, va);
/* Android can truncate/drop messages
*
* - the internal buffer for vsnprintf has a fixed size (usually 1024)
* - the socket to logd is non-blocking
*
* and provides no way to detect. Try our best.
*/
char local_msg[1024];
char *msg = logger_vasnprintf(local_msg, sizeof(local_msg), 0, level, tag,
format, va);
__android_log_write(level_to_android(level), tag, msg);
if (msg != local_msg)
free(msg);
/* increase the chance of logd doing its part */
if (mesa_log_control & MESA_LOG_CONTROL_WAIT)
thrd_yield();
}
#endif /* DETECT_OS_ANDROID */