emscripten-tutorial

How to build an increasingly complex C/C++ codebase to WebAssembly
git clone https://git.tronto.net/emscripten-tutorial
Download | Log | Files | Refs | README

primes.c (1027B)


      1 #include <stdbool.h>
      2 #include <pthread.h>
      3 
      4 #define NTHREADS 16
      5 
      6 bool isprime(int);
      7 void *pthread_routine(void *);
      8 
      9 struct interval { int low; int high; int count; };
     10 
     11 int primes_in_range(int low, int high) {
     12 	pthread_t threads[NTHREADS];
     13 	struct interval args[NTHREADS];
     14 
     15 	if (low < 0 || high < low)
     16 		return 0;
     17 
     18 	int interval_size = (high-low)/NTHREADS + 1;
     19 	for (int i = 0; i < NTHREADS; i++) {
     20 		args[i].low = low + i*interval_size;
     21 		args[i].high = args[i].low + interval_size;
     22 		pthread_create(&threads[i], NULL, pthread_routine, &args[i]);
     23 	}
     24 
     25 	int result = 0;
     26 	for (int i = 0; i < NTHREADS; i++) {
     27 		pthread_join(threads[i], NULL);
     28 		result += args[i].count;
     29 	}
     30 
     31 	return result;
     32 }
     33 
     34 bool isprime(int n) {
     35 	if (n < 2)
     36 		return false;
     37 
     38 	for (int i = 2; i*i <= n; i++)
     39 		if (n % i == 0)
     40 			return false;
     41 	return true;
     42 }
     43 
     44 void *pthread_routine(void *arg) {
     45 	struct interval *interval = arg;
     46 
     47 	interval->count = 0;
     48 	for (int i = interval->low; i < interval->high; i++)
     49 		if (isprime(i))
     50 			interval->count++;
     51 
     52 	return NULL;
     53 }