for MinGW32 compatibility

get rid of alloca()
This commit is contained in:
Heng Li 2017-09-02 18:23:29 -04:00
parent 2b8681ead7
commit 00416c76d1
3 changed files with 10 additions and 11 deletions

View File

@ -11,12 +11,16 @@ int optind=1, opterr=1, optopt, __optpos, optreset=0;
static void __getopt_msg(const char *a, const char *b, const char *c, size_t l) static void __getopt_msg(const char *a, const char *b, const char *c, size_t l)
{ {
FILE *f = stderr; FILE *f = stderr;
#if !defined(WIN32) && !defined(_WIN32)
flockfile(f); flockfile(f);
#endif
fputs(a, f); fputs(a, f);
fwrite(b, strlen(b), 1, f); fwrite(b, strlen(b), 1, f);
fwrite(c, 1, l, f); fwrite(c, 1, l, f);
fputc('\n', f); fputc('\n', f);
#if !defined(WIN32) && !defined(_WIN32)
funlockfile(f); funlockfile(f);
#endif
} }
int getopt(int argc, char * const argv[], const char *optstring) int getopt(int argc, char * const argv[], const char *optstring)

View File

@ -3,9 +3,7 @@
#include <limits.h> #include <limits.h>
#include <stdint.h> #include <stdint.h>
#if defined(WIN32) || defined(_WIN32) #if (defined(WIN32) || defined(_WIN32)) && defined(_MSC_VER)
#include <malloc.h>
#define alloca _alloca
#define __sync_fetch_and_add(ptr, addend) _InterlockedExchangeAdd((void*)ptr, addend) #define __sync_fetch_and_add(ptr, addend) _InterlockedExchangeAdd((void*)ptr, addend)
#endif #endif
@ -59,12 +57,13 @@ void kt_for(int n_threads, void (*func)(void*,long,int), void *data, long n)
kt_for_t t; kt_for_t t;
pthread_t *tid; pthread_t *tid;
t.func = func, t.data = data, t.n_threads = n_threads, t.n = n; t.func = func, t.data = data, t.n_threads = n_threads, t.n = n;
t.w = (ktf_worker_t*)alloca(n_threads * sizeof(ktf_worker_t)); t.w = (ktf_worker_t*)calloc(n_threads, sizeof(ktf_worker_t));
tid = (pthread_t*)alloca(n_threads * sizeof(pthread_t)); tid = (pthread_t*)calloc(n_threads, sizeof(pthread_t));
for (i = 0; i < n_threads; ++i) for (i = 0; i < n_threads; ++i)
t.w[i].t = &t, t.w[i].i = i; t.w[i].t = &t, t.w[i].i = i;
for (i = 0; i < n_threads; ++i) pthread_create(&tid[i], 0, ktf_worker, &t.w[i]); for (i = 0; i < n_threads; ++i) pthread_create(&tid[i], 0, ktf_worker, &t.w[i]);
for (i = 0; i < n_threads; ++i) pthread_join(tid[i], 0); for (i = 0; i < n_threads; ++i) pthread_join(tid[i], 0);
free(tid); free(t.w);
} else { } else {
long j; long j;
for (j = 0; j < n; ++j) func(data, j, 0); for (j = 0; j < n; ++j) func(data, j, 0);

View File

@ -5,11 +5,6 @@
#include "kvec.h" #include "kvec.h"
#include "minimap.h" #include "minimap.h"
#if defined(WIN32) || defined(_WIN32)
#include <malloc.h>
#define alloca _alloca
#endif
unsigned char seq_nt4_table[256] = { unsigned char seq_nt4_table[256] = {
0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 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, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
@ -86,7 +81,7 @@ void mm_sketch(void *km, const char *str, int len, int w, int k, uint32_t rid, i
tiny_queue_t tq; tiny_queue_t tq;
assert(len > 0 && w > 0 && k > 0 && k <= 28); // 56 bits for k-mer; could use long k-mers, but 28 enough in practice assert(len > 0 && w > 0 && k > 0 && k <= 28); // 56 bits for k-mer; could use long k-mers, but 28 enough in practice
buf = (mm128_t*)alloca(w * 16); buf = (mm128_t*)calloc(w, 16);
memset(buf, 0xff, w * 16); memset(buf, 0xff, w * 16);
memset(&tq, 0, sizeof(tiny_queue_t)); memset(&tq, 0, sizeof(tiny_queue_t));
kv_resize(mm128_t, km, *p, p->n + len/w); kv_resize(mm128_t, km, *p, p->n + len/w);
@ -145,4 +140,5 @@ void mm_sketch(void *km, const char *str, int len, int w, int k, uint32_t rid, i
} }
if (min.x != UINT64_MAX) if (min.x != UINT64_MAX)
kv_push(mm128_t, km, *p, min); kv_push(mm128_t, km, *p, min);
free(buf);
} }