2010-09-07 5 views
25

Les gens, dans mon application J'utilise clock_gettime(CLOCK_MONOTONIC) afin de mesurer le temps delta entre les images (une approche typique de gamedev) et de temps en temps je suis confronté à un étrange comportement de clock_gettime(..) - les valeurs retournées ne sont parfois pas monotones (c'est-à-dire que le temps passé est supérieur à par rapport à l'heure actuelle).Linux clock_gettime (CLOCK_MONOTONIC) étrange comportement non-monotone

Actuellement, si un tel paradoxe se produit, je saute simplement l'image en cours et commence à traiter la suivante. La question est de savoir comment cela peut être possible du tout? Est-ce un bug dans l'implémentation Linux POSIX de clock_gettime? J'utilise Ubuntu Server Edition 10.04 (noyau 2.6.32-24, x86_64), gcc-4.4.3.

+0

L'exécutez-vous dans un environnement virtualisé par hasard? – caf

+0

Non, aucune virtualisation impliquée – pachanga

Répondre

22

man clock_gettime dit:

CLOCK_MONOTONIC_RAW (depuis Linux 2.6.28, Linux spécifique)

similaires à CLOCK_MONOTONIC, mais donne accès à un temps basé sur le matériel brut qui ne sont pas soumis à Ajustements NTP.

Depuis CLOCK_MONOTONIC_RAW est pas l'objet d'ajustements NTP, je suppose que CLOCK_MONOTONIC pourrait être.

Nous avons rencontré des problèmes similaires avec Redhat Enterprise 5.0 avec le noyau 2.6.18 et certains processeurs Itanium spécifiques. Nous n'avons pas pu le reproduire avec un autre processeur sur le même système d'exploitation. Il a été corrigé dans RHEL 5.3 avec un noyau légèrement plus récent et quelques patchs Redhat.

+0

Merci pour le conseil.Une autre leçon pour moi - ne jamais jamais absolument faire confiance même les bibliothèques les plus fiables :) – pachanga

+0

Intéressant. Mais selon http://markmail.org/thread/54bb663vi47kjxnu même CLOCK_MONOTONIC n'est pas censé pouvoir sauter. Donc, ne devrait-il pas toujours être au moins en augmentation? – Thomas

+0

Il est dit que l'horloge peut pivoter (peut revenir en arrière IIUC), elle pourrait donc diminuer. –

6

Essayez CLOCK_MONOTONIC_RAW.

4

Sure semble être un bug pour moi. Peut-être que vous devriez le signaler en Ubuntu's bug tracker.

+5

Les outils de suivi des bogues sont agréables, tout comme les bogues soumis (ce que tout le monde devrait faire), mais ils sont impopulaires parce que les programmeurs veulent des correctifs MAINTENANT. En général, les bogues en amont ne sont pas corrigés longtemps après que vous avez fini de coder la majorité d'un projet, et vous devez de toute façon prendre en charge les personnes qui n'ont pas mis à jour les bibliothèques en amont depuis longtemps. :( –

+0

Si triste, si vrai ... – pachanga

21

On dirait une instance de

commit 0696b711e4be45fa104c12329f617beb29c03f78 
Author: Lin Ming <[email protected]> 
Date: Tue Nov 17 13:49:50 2009 +0800 

timekeeping: Fix clock_gettime vsyscall time warp 

Since commit 0a544198 "timekeeping: Move NTP adjusted clock 
multiplier to struct timekeeper" the clock multiplier of vsyscall is updated with 
the unmodified clock multiplier of the clock source and not with the 
NTP adjusted multiplier of the timekeeper. 

This causes user space observerable time warps: 
new CLOCK-warp maximum: 120 nsecs, 00000025c337c537 -> 00000025c337c4bf 

Voir here pour un patch. Ceci a été inclus dans 2.6.32.19, mais n'a peut-être pas été rétroporté par l'équipe Debian (?). Tu devrais y jeter un coup d'oeil.

-1

C'est un bug de Linux. Aucun ajustement dans une horloge monotone ne peut le faire reculer. Vous utilisez un noyau très ancien et une distribution très ancienne.

Éditer: êtes-vous sûr de vouloir sauter le cadre? Si vous appelez clock_gettime à nouveau, que se passe-t-il?