Capture (almost) all worker thread time.

git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4373 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
2023-07-29 22:29:09 +00:00
parent 3e5abf3a4d
commit b5768dd927
3 changed files with 37 additions and 5 deletions

View File

@ -1144,12 +1144,25 @@ static void _tf_ssb_rpc_connections_changed_callback(tf_ssb_t* ssb, tf_ssb_chang
}
}
typedef struct _delete_blobs_work_t
{
uv_work_t work;
uv_thread_t thread_id;
tf_ssb_t* ssb;
uint64_t start_time;
uint64_t end_time;
} delete_blobs_work_t;
static void _tf_ssb_rpc_delete_blobs_work(uv_work_t* work)
{
tf_ssb_t* ssb = work->data;
delete_blobs_work_t* delete = work->data;
delete->start_time = uv_hrtime();
delete->thread_id = uv_thread_self();
tf_ssb_t* ssb = delete->ssb;
int64_t age = _get_global_setting_int64(ssb, "blob_expire_age_seconds", -1);
if (age <= 0)
{
delete->end_time = uv_hrtime();
return;
}
int64_t start_ns = uv_hrtime();
@ -1189,11 +1202,14 @@ static void _tf_ssb_rpc_delete_blobs_work(uv_work_t* work)
int64_t duration_ms = (uv_hrtime() - start_ns) / 1000000LL;
tf_printf("Deleted %d blobs in %d ms.\n", deleted, (int)duration_ms);
_tf_ssb_rpc_start_delete_blobs(ssb, deleted ? (int)duration_ms : (15 * 60 * 1000));
delete->end_time = uv_hrtime();
}
static void _tf_ssb_rpc_delete_blobs_after_work(uv_work_t* work, int status)
{
tf_free(work);
delete_blobs_work_t* delete = work->data;
tf_ssb_record_thread_time(delete->ssb, (int64_t)delete->thread_id, delete->end_time - delete->start_time);
tf_free(delete);
}
static void _tf_ssb_rpc_timer_on_close(uv_handle_t* handle)
@ -1204,9 +1220,9 @@ static void _tf_ssb_rpc_timer_on_close(uv_handle_t* handle)
static void _tf_ssb_rpc_start_delete_timer(uv_timer_t* timer)
{
tf_ssb_t* ssb = timer->data;
uv_work_t* work = tf_malloc(sizeof(uv_work_t));
*work = (uv_work_t) { .data = ssb };
int r = uv_queue_work(tf_ssb_get_loop(ssb), work, _tf_ssb_rpc_delete_blobs_work, _tf_ssb_rpc_delete_blobs_after_work);
delete_blobs_work_t* work = tf_malloc(sizeof(delete_blobs_work_t));
*work = (delete_blobs_work_t) { .work = { .data = work}, .ssb = ssb };
int r = uv_queue_work(tf_ssb_get_loop(ssb), &work->work, _tf_ssb_rpc_delete_blobs_work, _tf_ssb_rpc_delete_blobs_after_work);
if (r)
{
tf_printf("uv_queue_work: %s\n", uv_strerror(r));