Могу ли я обойти необходимость SCM_TIMESTAMP? - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь перенести приложение в Solaris 10 (длинный рассказ), и большая проблема заключается в том, что одна часть кода хочет использовать функцию ядра SCM_TIMESTAMP, которая не была реализована позднее.

    for (cm = CMSG_FIRSTHDR(&m); cm; cm = CMSG_NXTHDR(&m, cm)) {
    if (cm->cmsg_level == SOL_SOCKET && cm->cmsg_type == SCM_TIMESTAMP)
        memcpy(tstamp, CMSG_DATA(cm), sizeof(struct timeval));
        found_tstamp = TRUE;
        break;
    }

if (!found_tstamp) {
    pa_log_warn("Couldn't find SCM_TIMESTAMP data in auxiliary recvmsg() data!");
    memset(tstamp, 0, sizeof(tstamp));
}

return 0;

У меня не было большого успеха в поиске обходных путей для SO_TIMESTAMP / SCM_TIMESTAMP, потому что код либо вообще не удосужился воспользоваться ими, либо просто сдался, не сказав, что нет точного способавремя без наличия этого в ядре (похоже, он пытается сказать, что всем на старых ОС навсегда не повезло, когда приложение решит, что оно нуждается в этом).

Предположим, я действительно не нуждаюсь в разахс точностью до наносекунды для типа пакетов UDP, с которыми я имею дело (на самом деле это просто аудиопакеты), какой обходной путь я мог бы подать в приложение, чтобы оно получало любой тип данных, ожидаемый для SCM_TIMESTAMP,но с меньшей точностью? Что-то вроде ...

#ifndef SCM_TIMESTAMP

//do this workaround

#endif

Сверху моей головы, я думаю, что может быть какой-то способ "подделать это", используя clock_gettime и recvmsg, а затем отформатировать вывод изте, что в SCM_TIMESTAMP, как правило, дают приложение. Очевидно, это не будет той же точностью, но я предпочел бы иметь что-то подобное, а не просто ничего, просто потому, что они решили использовать это в одном месте.

...