Ваша первая функция округляется, так что 1.000999 секунд округляется до 1000 мс, а не до 1001 мс. Чтобы исправить это (сделать округление до ближайшей миллисекунды), вы можете сделать это:
long visual_time_get_msec(VisTime *time_)
{
visual_log_return_val_if_fail(time_ != NULL, 0);
return time_->tv_sec * 1000 + (time_->tv_usec + 500) / 1000;
}
Fuzz уже указал на усечение во втором примере. Единственное, что я хотел бы добавить, это то, что вы можете немного упростить его, используя оператор по модулю:
long sec = msec / 1000;
long usec = (msec % 1000) * 1000;
(Выше всего предполагается, что вы не имеете дело с отрицательными временными интервалами - если это так, все усложняется).