Fix a ref count mistake and add a long-overdue tf_util_print_backtrace() that helped me find it.

This commit is contained in:
Cory McWilliams 2024-06-20 19:49:21 -04:00
parent 9de8b0f449
commit 410bb7c09d
4 changed files with 16 additions and 4 deletions

View File

@ -1019,7 +1019,7 @@ void tf_http_request_unref(tf_http_request_t* request)
tf_free(request); tf_free(request);
} }
if (--connection->ref_count == 0) if (connection && --connection->ref_count == 0)
{ {
if (connection->http->is_shutting_down) if (connection->http->is_shutting_down)
{ {

View File

@ -1541,7 +1541,6 @@ static void _httpd_endpoint_login_work(tf_ssb_t* ssb, void* user_data)
} }
else else
{ {
tf_http_request_ref(request);
login->name = account_name_copy; login->name = account_name_copy;
login->error = login_error; login->error = login_error;
@ -1566,6 +1565,7 @@ static void _httpd_endpoint_login_work(tf_ssb_t* ssb, void* user_data)
} }
login->pending++; login->pending++;
tf_http_request_ref(request);
tf_file_read(login->request->user_data, "core/auth.html", _httpd_endpoint_login_file_read_callback, login); tf_file_read(login->request->user_data, "core/auth.html", _httpd_endpoint_login_file_read_callback, login);
account_name_copy = NULL; account_name_copy = NULL;
@ -1584,9 +1584,9 @@ done:
static void _httpd_endpoint_login_after_work(tf_ssb_t* ssb, int status, void* user_data) static void _httpd_endpoint_login_after_work(tf_ssb_t* ssb, int status, void* user_data)
{ {
login_request_t* login = user_data; login_request_t* login = user_data;
tf_http_request_t* request = login->request;
if (login->pending == 1) if (login->pending == 1)
{ {
tf_http_request_t* request = login->request;
if (*login->location_header) if (*login->location_header)
{ {
const char* headers[] = { const char* headers[] = {
@ -1597,8 +1597,8 @@ static void _httpd_endpoint_login_after_work(tf_ssb_t* ssb, int status, void* us
}; };
tf_http_respond(request, 303, headers, tf_countof(headers) / 2, NULL, 0); tf_http_respond(request, 303, headers, tf_countof(headers) / 2, NULL, 0);
} }
tf_http_request_unref(request);
} }
tf_http_request_unref(request);
_login_release(login); _login_release(login);
} }

View File

@ -435,6 +435,13 @@ const char* tf_util_backtrace_string()
return tf_util_backtrace_to_string(buffer, count); return tf_util_backtrace_to_string(buffer, count);
} }
void tf_util_print_backtrace()
{
const char* bt = tf_util_backtrace_string();
tf_printf("%s\n", bt);
tf_free((void*)bt);
}
#if defined(__ANDROID__) #if defined(__ANDROID__)
typedef struct _android_backtrace_t typedef struct _android_backtrace_t
{ {

View File

@ -126,6 +126,11 @@ const char* tf_util_backtrace_to_string(void* const* buffer, int count);
*/ */
const char* tf_util_backtrace_string(); const char* tf_util_backtrace_string();
/**
** Print a stack backtrace of the calling thread.
*/
void tf_util_print_backtrace();
/** /**
** Convert a function pointer to its name, if possible. ** Convert a function pointer to its name, if possible.
** @return The function name or null. ** @return The function name or null.