segunda-feira, 25 de maio de 2009

Implementação da função gettimeofday para Windows

Qualquer programador que algum dia teve ou terá que portar código de algum programa Unix para Windows irá se deparar com diversos trechos de código que dependem da função gettimeofday.

De acordo com o padrão Posix, gettimeofday retorna a hora atual em segundos e microsegundos desde Epoch, armazenando-a na estrutura timeval apontada por tv. Ela sempre retorna 0 e nenhum valor deve ser reservado para indicar erro. (Porque diabos o retorno não é void ?)

Segue abaixo uma implementação para windows originalmente escrita pelo pessoal do OpenAsthra e cujo post original pode ser encontrado aqui.
Apenas a estrutura timezone é definida pois as outras já estão presentes em time.h.


#include

#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
#define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64
#else
#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
#endif

struct timezone
{
int tz_minuteswest; /* minutes W of Greenwich */
int tz_dsttime; /* type of dst correction */
};

int gettimeofday(struct timeval *tv, struct timezone *tz)
{
FILETIME ft;
unsigned __int64 tmpres = 0;
static int tzflag;

if (NULL != tv)
{
GetSystemTimeAsFileTime(&ft);

tmpres |= ft.dwHighDateTime;
tmpres <<= 32;
tmpres |= ft.dwLowDateTime;

/*converting file time to unix epoch*/
tmpres /= 10; /*convert into microseconds*/
tmpres -= DELTA_EPOCH_IN_MICROSECS;
tv->tv_sec = (long)(tmpres / 1000000UL);
tv->tv_usec = (long)(tmpres % 1000000UL);
}

if (NULL != tz)
{
if (!tzflag)
{
_tzset();
tzflag++;
}
tz->tz_minuteswest = _timezone / 60;
tz->tz_dsttime = _daylight;
}

return 0;
}


Para utilizar basta escrever:



struct timeval now;
struct timezone tzone;

gettimeofday(&now, NULL);



[]'s

Leonardo X. T. Cardoso

Palavras-chave: gettimeofday windows
blog comments powered by Disqus