diff --git a/smtpping.cpp b/smtpping.cpp index cdf8b78..aee57fe 100644 --- a/smtpping.cpp +++ b/smtpping.cpp @@ -45,7 +45,11 @@ using std::vector; #include #include #include -#if _POSIX_SEMAPHORES && MAP_ANONYMOUS +#ifdef __APPLE__ +// use supported GCD semaphores instead of unsupported POSIX semaphores +#include +#endif +#if (_POSIX_SEMAPHORES && MAP_ANONYMOUS) || __APPLE__ #define SUPPORT_RATE #endif #endif @@ -438,9 +442,14 @@ int main(int argc, char* argv[]) } #ifdef SUPPORT_RATE +#ifdef __APPLE__ + dispatch_semaphore_t sem; + sem = dispatch_semaphore_create(1); +#else sem_t* sem = (sem_t*)mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); if (sem_init(sem, 1, 1) != 0) - fprintf(stderr, "sem_init: failed\n"); + perror("sem_init"); +#endif size_t* counter = (size_t*)mmap(NULL, sizeof(size_t), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); *counter = 0; #else @@ -464,10 +473,18 @@ int main(int argc, char* argv[]) } #ifdef SUPPORT_RATE while (show_rate && !abort_ping) { +#ifdef __APPLE__ + dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); +#else sem_wait(sem); +#endif printf("%zu\n", *counter); *counter = 0; +#ifdef __APPLE__ + dispatch_semaphore_signal(sem); +#else sem_post(sem); +#endif sleep(1); } #endif @@ -773,9 +790,17 @@ int main(int argc, char* argv[]) #ifdef SUPPORT_RATE if (show_rate) { +#ifdef __APPLE__ + dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); +#else sem_wait(sem); +#endif (*counter)++; +#ifdef __APPLE__ + dispatch_semaphore_signal(sem); +#else sem_post(sem); +#endif } #endif