some samples can't run on MacOS

This commit is contained in:
shuxin   zheng 2019-08-11 15:22:10 +08:00
parent 8d96beb9b0
commit 639501690a
6 changed files with 97 additions and 16 deletions

View File

@ -1,4 +1,5 @@
#include "lib_acl.h" #include "lib_acl.h"
#include "../stamp.h"
static ACL_ATOMIC *__counter; static ACL_ATOMIC *__counter;
static unsigned __nproducers = 5; static unsigned __nproducers = 5;
@ -15,7 +16,7 @@ static void* consumer(void *ctx)
n = acl_atomic_int64_add_fetch(__counter, 1); n = acl_atomic_int64_add_fetch(__counter, 1);
if (n <= 10) { if (n <= 10) {
printf("thread: %ld, n=%lld\r\n", acl_pthread_self(), n); printf("thread: %ld, n=%lld\r\n", (long) acl_pthread_self(), n);
} }
o = (void*) acl_mbox_read(box, 0, &succ); o = (void*) acl_mbox_read(box, 0, &succ);
@ -51,6 +52,8 @@ int main(int argc, char *argv[])
acl_pthread_t *producers, consumer_tid; acl_pthread_t *producers, consumer_tid;
acl_pthread_attr_t attr; acl_pthread_attr_t attr;
static long long value = 0, counter; static long long value = 0, counter;
struct timeval begin, end;
double spent, speed;
ACL_MBOX *box; ACL_MBOX *box;
int ch, ret; int ch, ret;
@ -81,6 +84,8 @@ int main(int argc, char *argv[])
acl_pthread_attr_init(&attr); acl_pthread_attr_init(&attr);
gettimeofday(&begin, NULL);
ret = acl_pthread_create(&consumer_tid, &attr, consumer, box); ret = acl_pthread_create(&consumer_tid, &attr, consumer, box);
for (i = 0; i < __nproducers; i++) { for (i = 0; i < __nproducers; i++) {
@ -97,7 +102,11 @@ int main(int argc, char *argv[])
usleep(100); usleep(100);
} }
printf("at last, counter=%lld, loop=%lld\r\n", value, counter); gettimeofday(&end, NULL);
spent = stamp_sub(&end, &begin);
speed = (counter * 1000) / (spent >= 1.0 ? spent : 1.0);
printf("counter=%lld, loop=%lld, spent=%.2f ms, speed=%.2f\r\n",
value, counter, spent, speed);
acl_atomic_free(__counter); acl_atomic_free(__counter);
acl_pthread_join(consumer_tid, NULL); acl_pthread_join(consumer_tid, NULL);

View File

@ -0,0 +1,20 @@
#ifndef __STAMP_INCLUDE_H__
#define __STAMP_INCLUDE_H__
static double stamp_sub(const struct timeval *from, const struct timeval *sub)
{
struct timeval res;
memcpy(&res, from, sizeof(struct timeval));
res.tv_usec -= sub->tv_usec;
if (res.tv_usec < 0) {
--res.tv_sec;
res.tv_usec += 1000000;
}
res.tv_sec -= sub->tv_sec;
return (res.tv_sec * 1000.0 + res.tv_usec/1000.0);
}
#endif

View File

@ -1,4 +1,5 @@
base_path = ../../.. base_path = ../../..
include ../../Makefile.in include ../../Makefile.in
#CFLAGS += -DLOCK_FREE #CFLAGS += -DLOCK_FREE
CFLAGS += -Wno-deprecated-declarations
PROG = taskq PROG = taskq

View File

@ -1,4 +1,5 @@
#include "lib_acl.h" #include "lib_acl.h"
#include "../stamp.h"
#include "taskq.h" #include "taskq.h"
static ACL_ATOMIC *__counter; static ACL_ATOMIC *__counter;
@ -9,7 +10,7 @@ static void consumer(void *ctx acl_unused)
//int *o = (int*) ctx; //int *o = (int*) ctx;
long long n = acl_atomic_int64_add_fetch(__counter, 1); long long n = acl_atomic_int64_add_fetch(__counter, 1);
if (n <= 10) { if (n <= 10) {
printf("thread: %ld, n=%lld\r\n", acl_pthread_self(), n); printf("thread: %ld, n=%lld\r\n", (long)acl_pthread_self(), n);
} }
//free(o); //free(o);
} }
@ -44,6 +45,8 @@ int main(int argc, char *argv[])
TASKQ* taskq; TASKQ* taskq;
acl_pthread_t *producers; acl_pthread_t *producers;
acl_pthread_attr_t attr; acl_pthread_attr_t attr;
struct timeval begin, end;
double spent, speed;
static long long value = 0, counter; static long long value = 0, counter;
int ch; int ch;
@ -79,6 +82,8 @@ int main(int argc, char *argv[])
acl_pthread_attr_init(&attr); acl_pthread_attr_init(&attr);
gettimeofday(&begin, NULL);
for (i = 0; i < nproducers; i++) { for (i = 0; i < nproducers; i++) {
int ret = acl_pthread_create(&producers[i], &attr, producer, taskq); int ret = acl_pthread_create(&producers[i], &attr, producer, taskq);
assert(ret == 0); assert(ret == 0);
@ -93,7 +98,11 @@ int main(int argc, char *argv[])
usleep(100); usleep(100);
} }
printf("at last, counter=%lld, loop=%lld\r\n", value, counter); gettimeofday(&end, NULL);
spent = stamp_sub(&end, &begin);
speed = (counter * 1000) / (spent >= 1.0 ? spent : 1);
printf("counter=%lld, loop=%lld, spent %.2f ms ,speed=%.2f\r\n",
value, counter, spent, speed);
acl_atomic_free(__counter); acl_atomic_free(__counter);
taskq_destroy(taskq); taskq_destroy(taskq);

View File

@ -20,8 +20,12 @@ typedef struct TASKQ {
unsigned slot_full; unsigned slot_full;
unsigned nthreads; unsigned nthreads;
acl_pthread_t *threads; acl_pthread_t *threads;
sem_t sem_empty; #if defined(__APPLE__)
sem_t sem_full; char *path_empty;
char *path_full;
#endif
sem_t *sem_empty;
sem_t *sem_full;
} TASKQ; } TASKQ;
static void *taskq_pop(void *ctx); static void *taskq_pop(void *ctx);
@ -30,6 +34,9 @@ TASKQ *taskq_create(unsigned qsize, unsigned nthreads)
{ {
TASKQ *taskq = (TASKQ*) acl_mycalloc(1, sizeof(TASKQ)); TASKQ *taskq = (TASKQ*) acl_mycalloc(1, sizeof(TASKQ));
acl_pthread_attr_t attr; acl_pthread_attr_t attr;
#if defined(__APPLE__)
const char *path = ".";
#endif
int ret, i; int ret, i;
ret = acl_pthread_mutex_init(&taskq->lock, NULL); ret = acl_pthread_mutex_init(&taskq->lock, NULL);
@ -43,10 +50,25 @@ TASKQ *taskq_create(unsigned qsize, unsigned nthreads)
taskq->nthreads = nthreads; taskq->nthreads = nthreads;
taskq->threads = (acl_pthread_t*) acl_mycalloc(nthreads, sizeof(acl_pthread_t)); taskq->threads = (acl_pthread_t*) acl_mycalloc(nthreads, sizeof(acl_pthread_t));
ret = sem_init(&taskq->sem_empty, 0, qsize); #if defined(__APPLE__)
assert(path && *path);
taskq->path_empty = acl_concatenate(path, "/", "sem_empty", NULL);
taskq->sem_empty = sem_open(taskq->path_empty, O_CREAT, S_IRUSR | S_IWUSR, qsize);
assert(taskq->sem_empty != SEM_FAILED);
#else
taskq->sem_empty = (sem_t*) acl_mycalloc(1, sizeof(sem_t));
ret = sem_init(taskq->sem_empty, 0, qsize);
assert(ret == 0); assert(ret == 0);
ret = sem_init(&taskq->sem_full, 0, 0); #endif
#if defined(__APPLE__)
taskq->path_full = acl_concatenate(path, "/", "sem_full", NULL);
taskq->sem_full = sem_open(taskq->path_full, O_CREAT, S_IRUSR | S_IWUSR, 0);
assert(taskq->sem_full != SEM_FAILED);
#else
taskq->sem_full = (sem_t*) acl_mycalloc(1, sizeof(sem_t));
ret = sem_init(taskq->sem_full, 0, 0);
assert(ret == 0); assert(ret == 0);
#endif
taskq->slot_empty = 0; taskq->slot_empty = 0;
taskq->slot_full = 0; taskq->slot_full = 0;
@ -58,6 +80,7 @@ TASKQ *taskq_create(unsigned qsize, unsigned nthreads)
ret = pthread_create(&taskq->threads[i], &attr, taskq_pop, taskq); ret = pthread_create(&taskq->threads[i], &attr, taskq_pop, taskq);
assert(ret == 0); assert(ret == 0);
} }
printf("ok\n");
return taskq; return taskq;
} }
@ -70,8 +93,17 @@ void taskq_destroy(TASKQ *taskq)
(void) acl_pthread_join(taskq->threads[i], NULL); (void) acl_pthread_join(taskq->threads[i], NULL);
} }
(void) sem_destroy(&taskq->sem_empty); #if defined(__APPLE__)
(void) sem_destroy(&taskq->sem_full); sem_close(taskq->sem_empty);
sem_close(taskq->sem_full);
acl_myfree(taskq->path_empty);
acl_myfree(taskq->path_full);
#else
(void) sem_destroy(taskq->sem_empty);
(void) sem_destroy(taskq->sem_full);
acl_myfree(taskq->sem_empty);
acl_myfree(taskq->sem_full);
#endif
(void) acl_pthread_mutex_destroy(&taskq->lock); (void) acl_pthread_mutex_destroy(&taskq->lock);
acl_myfree(taskq->threads); acl_myfree(taskq->threads);
acl_myfree(taskq->tasks); acl_myfree(taskq->tasks);
@ -84,7 +116,7 @@ static void *taskq_pop(void *ctx)
TASK task; TASK task;
while (1) { while (1) {
int ret = sem_wait(&taskq->sem_full); int ret = sem_wait(taskq->sem_full);
if (ret != 0) { if (ret != 0) {
if (errno == EINTR) { if (errno == EINTR) {
continue; continue;
@ -103,7 +135,7 @@ static void *taskq_pop(void *ctx)
ret = acl_pthread_mutex_unlock(&taskq->lock); ret = acl_pthread_mutex_unlock(&taskq->lock);
assert(ret == 0); assert(ret == 0);
ret = sem_post(&taskq->sem_empty); ret = sem_post(taskq->sem_empty);
assert(ret == 0); assert(ret == 0);
task.callback(task.ctx); task.callback(task.ctx);
@ -114,7 +146,7 @@ static void *taskq_pop(void *ctx)
void taskq_push(TASKQ *taskq, void (*callback)(void*), void *ctx) void taskq_push(TASKQ *taskq, void (*callback)(void*), void *ctx)
{ {
int ret = sem_wait(&taskq->sem_empty); int ret = sem_wait(taskq->sem_empty);
assert(ret == 0); assert(ret == 0);
ret = acl_pthread_mutex_lock(&taskq->lock); ret = acl_pthread_mutex_lock(&taskq->lock);
@ -127,6 +159,6 @@ void taskq_push(TASKQ *taskq, void (*callback)(void*), void *ctx)
ret = acl_pthread_mutex_unlock(&taskq->lock); ret = acl_pthread_mutex_unlock(&taskq->lock);
assert(ret == 0); assert(ret == 0);
ret = sem_post(&taskq->sem_full); ret = sem_post(taskq->sem_full);
assert(ret == 0); assert(ret == 0);
} }

View File

@ -1,4 +1,5 @@
#include "lib_acl.h" #include "lib_acl.h"
#include "../stamp.h"
static ACL_ATOMIC *__counter; static ACL_ATOMIC *__counter;
static int __max = 10000; static int __max = 10000;
@ -7,7 +8,7 @@ static void consumer(void *ctx acl_unused)
{ {
long long n = acl_atomic_int64_add_fetch(__counter, 1); long long n = acl_atomic_int64_add_fetch(__counter, 1);
if (n <= 10) { if (n <= 10) {
printf("thread: %ld, n=%lld\r\n", acl_pthread_self(), n); printf("thread: %ld, n=%lld\r\n", (long) acl_pthread_self(), n);
} }
} }
@ -38,6 +39,8 @@ int main(int argc, char *argv[])
acl_pthread_pool_t *tpool; acl_pthread_pool_t *tpool;
acl_pthread_attr_t attr; acl_pthread_attr_t attr;
acl_pthread_t *producers; acl_pthread_t *producers;
struct timeval begin, end;
double spent, speed;
static long long value = 0, counter; static long long value = 0, counter;
int ch, debug = 0; int ch, debug = 0;
@ -81,6 +84,8 @@ int main(int argc, char *argv[])
acl_pthread_attr_init(&attr); acl_pthread_attr_init(&attr);
gettimeofday(&begin, NULL);
for (i = 0; i < nproducers; i++) { for (i = 0; i < nproducers; i++) {
int ret = acl_pthread_create(&producers[i], &attr, producer, tpool); int ret = acl_pthread_create(&producers[i], &attr, producer, tpool);
assert(ret == 0); assert(ret == 0);
@ -95,7 +100,12 @@ int main(int argc, char *argv[])
usleep(100); usleep(100);
} }
printf("at last, counter=%lld, loop=%lld\r\n", value, counter); gettimeofday(&end, NULL);
spent = stamp_sub(&end, &begin);
speed = (counter * 1000) / (spent >= 1.0 ? spent : 1.0);
printf("counter=%lld, loop=%lld, spent=%.2f ms, speed=%.2f\r\n",
value, counter, spent, speed);
acl_atomic_free(__counter); acl_atomic_free(__counter);
acl_pthread_pool_destroy(tpool); acl_pthread_pool_destroy(tpool);