Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 27 additions & 2 deletions smtpping.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,11 @@ using std::vector;
#include <errno.h>
#include <semaphore.h>
#include <sys/mman.h>
#if _POSIX_SEMAPHORES && MAP_ANONYMOUS
#ifdef __APPLE__
// use supported GCD semaphores instead of unsupported POSIX semaphores
#include <dispatch/dispatch.h>
#endif
#if (_POSIX_SEMAPHORES && MAP_ANONYMOUS) || __APPLE__
#define SUPPORT_RATE
#endif
#endif
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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

Expand Down