diff --git a/.gitignore b/.gitignore index 2a8ecdc..af1bb41 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +.cproject +.project .*.swp *.a *.o diff --git a/gettimeofday.h b/gettimeofday.h new file mode 100644 index 0000000..975f754 --- /dev/null +++ b/gettimeofday.h @@ -0,0 +1,71 @@ +#ifdef WIN32 +#ifndef _GETTIMEOFDAY_H +#define _GETTIMEOFDAY_H + +#include + +struct timezone +{ + __int32 tz_minuteswest; /* minutes W of Greenwich */ + int tz_dsttime; /* type of dst correction */ +}; + +/* + * gettimeofday.c + * Win32 gettimeofday() replacement + * taken from PostgreSQL, according to + * https://stackoverflow.com/questions/1676036/what-should-i-use-to-replace-gettimeofday-on-windows + * + * src/port/gettimeofday.c + * + * Copyright (c) 2003 SRA, Inc. + * Copyright (c) 2003 SKC, Inc. + * + * Permission to use, copy, modify, and distribute this software and + * its documentation for any purpose, without fee, and without a + * written agreement is hereby granted, provided that the above + * copyright notice and this paragraph and the following two + * paragraphs appear in all copies. + * + * IN NO EVENT SHALL THE AUTHOR BE LIABLE TO ANY PARTY FOR DIRECT, + * INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING + * LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS + * DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE AUTHOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS + * IS" BASIS, AND THE AUTHOR HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, + * SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +/* FILETIME of Jan 1 1970 00:00:00. */ +static const unsigned __int64 epoch = ((unsigned __int64) 116444736000000000ULL); + +/* + * timezone information is stored outside the kernel so tzp isn't used anymore. + * + * Note: this function is not for Win32 high precision timing purpose. See + * elapsed_time(). + */ +int +gettimeofday(struct timeval * tp, struct timezone * tzp) +{ + FILETIME file_time; + SYSTEMTIME system_time; + ULARGE_INTEGER ularge; + + GetSystemTime(&system_time); + SystemTimeToFileTime(&system_time, &file_time); + ularge.LowPart = file_time.dwLowDateTime; + ularge.HighPart = file_time.dwHighDateTime; + + tp->tv_sec = (long) ((ularge.QuadPart - epoch) / 10000000L); + tp->tv_usec = (long) (system_time.wMilliseconds * 1000); + + return 0; +} + +#endif /* _GETTIMEOFDAY_H */ +#endif /* WIN32 */ diff --git a/index.c b/index.c index dc58231..80c302c 100644 --- a/index.c +++ b/index.c @@ -1,6 +1,10 @@ #include #include +#ifdef WIN32 +#include +#else #include +#endif #include #include #include "kthread.h" diff --git a/kthread.c b/kthread.c index f991714..972aace 100644 --- a/kthread.c +++ b/kthread.c @@ -1,6 +1,13 @@ #include #include #include +#include + +#ifdef WIN32 +#include +#define alloca _alloca +#define __sync_fetch_and_add(ptr, addend) _InterlockedExchangeAdd((void*)ptr, addend) +#endif /************ * kt_for() * diff --git a/main.c b/main.c index 7199a07..b954b60 100644 --- a/main.c +++ b/main.c @@ -2,8 +2,12 @@ #include #include #include +#ifdef WIN32 +#include +#else #include #include +#endif #include "bseq.h" #include "minimap.h" #include "mmpriv.h" diff --git a/misc.c b/misc.c index f6699ed..a667c73 100644 --- a/misc.c +++ b/misc.c @@ -1,17 +1,40 @@ -#include -#include -#include "minimap.h" - int mm_verbose = 3; int mm_dbg_flag = 0; double mm_realtime0; +#include "minimap.h" + +#ifdef WIN32 +#include "gettimeofday.h" + +// taken from https://stackoverflow.com/questions/5272470/c-get-cpu-usage-on-linux-and-windows +#include +double cputime() { + HANDLE hProcess = GetCurrentProcess(); + FILETIME ftCreation, ftExit, ftKernel, ftUser; + SYSTEMTIME stKernel; + SYSTEMTIME stUser; + + GetProcessTimes(hProcess, &ftCreation, &ftExit, &ftKernel, &ftUser); + FileTimeToSystemTime(&ftKernel, &stKernel); + FileTimeToSystemTime(&ftUser, &stUser); + + double kernelModeTime = ((stKernel.wHour * 60.) + stKernel.wMinute * 60.) + stKernel.wSecond * 1. + stKernel.wMilliseconds / 1000.; + double userModeTime = ((stUser.wHour * 60.) + stUser.wMinute * 60.) + stUser.wSecond * 1. + stUser.wMilliseconds / 1000.; + + return kernelModeTime + userModeTime; +} +#else +#include +#include + double cputime() { struct rusage r; getrusage(RUSAGE_SELF, &r); return r.ru_utime.tv_sec + r.ru_stime.tv_sec + 1e-6 * (r.ru_utime.tv_usec + r.ru_stime.tv_usec); } +#endif /* WIN32 */ double realtime() { diff --git a/sketch.c b/sketch.c index b141cba..bdb5efb 100644 --- a/sketch.c +++ b/sketch.c @@ -5,6 +5,11 @@ #include "kvec.h" #include "minimap.h" +#ifdef WIN32 +#include +#define alloca _alloca +#endif + unsigned char seq_nt4_table[256] = { 0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,