| | |
| | | |
| | | inline int psem_timedwait(sem_t *sem, const struct timespec *ts) { |
| | | struct timespec abs_timeout = TimeUtil::calc_abs_time(ts); |
| | | return sem_timedwait(sem, &abs_timeout); |
| | | // int rv ; |
| | | // while ( (rv = sem_timedwait(sem, &abs_timeout)) == -1) { |
| | | // if(errno == EINTR) |
| | | // continue; |
| | | // else { |
| | | // // LoggerFactory::getLogger()->error(errno, "LockFreeQueue push_timeout"); |
| | | // return -1; |
| | | // } |
| | | // } |
| | | // return 0; |
| | | // return sem_timedwait(sem, &abs_timeout); |
| | | int rv ; |
| | | while ( (rv = sem_timedwait(sem, &abs_timeout)) == -1) { |
| | | if(errno == EINTR) |
| | | continue; |
| | | else { |
| | | // LoggerFactory::getLogger()->error(errno, "LockFreeQueue push_timeout"); |
| | | return -1; |
| | | } |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | |
| | | inline int psem_wait(sem_t *sem) { |
| | | return sem_wait(sem); |
| | | // int rv; |
| | | // while ( (rv = sem_wait(sem)) == -1) { |
| | | // if(errno == EINTR) |
| | | // continue; |
| | | // else { |
| | | // return -1; |
| | | // } |
| | | // } |
| | | // return 0; |
| | | // return sem_wait(sem); |
| | | int rv; |
| | | while ( (rv = sem_wait(sem)) == -1) { |
| | | if(errno == EINTR) |
| | | continue; |
| | | else { |
| | | return -1; |
| | | } |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | inline int psem_trywait(sem_t *sem) { |
| | |
| | | { |
| | | int rv; |
| | | |
| | | logger->debug("%d destroy threadlocal socket\n", pthread_self()); |
| | | logger->debug("%lu destroy threadlocal socket\n", pthread_self()); |
| | | |
| | | if(tmp_socket == NULL) |
| | | return; |
| | |
| | | "${PROJECT_BINARY_DIR}" |
| | | ${EXTRA_INCLUDES} |
| | | ) |
| | | |
| | | |
| | | |
| | | add_executable(test_sem2 test_sem2.cpp ) |
| | | target_link_libraries(test_sem2 PRIVATE ${EXTRA_LIBS} ) |
| | | target_include_directories(test_sem2 PRIVATE |
| | | "${PROJECT_BINARY_DIR}" |
| | | ${EXTRA_INCLUDES} |
| | | ) |
New file |
| | |
| | | #include <unistd.h> |
| | | #include <stdio.h> |
| | | #include <stdlib.h> |
| | | #include <semaphore.h> |
| | | #include <time.h> |
| | | #include <assert.h> |
| | | #include <errno.h> |
| | | #include <signal.h> |
| | | |
| | | sem_t sem; |
| | | |
| | | #define handle_error(msg) \ |
| | | do { perror(msg); exit(EXIT_FAILURE); } while (0) |
| | | |
| | | static void |
| | | handler(int sig) |
| | | { |
| | | puts("sig handler\n"); |
| | | // write(STDOUT_FILENO, "sem_post() from handler\n", 24); |
| | | // if (sem_post(&sem) == -1) |
| | | // { |
| | | // write(STDERR_FILENO, "sem_post() failed\n", 18); |
| | | // _exit(EXIT_FAILURE); |
| | | // } |
| | | } |
| | | |
| | | int |
| | | main(int argc, char *argv[]) |
| | | { |
| | | struct sigaction sa; |
| | | struct timespec ts; |
| | | int s; |
| | | |
| | | |
| | | |
| | | |
| | | if (sem_init(&sem, 0, 0) == -1) |
| | | handle_error("sem_init"); |
| | | |
| | | /* Establish SIGALRM handler; set alarm timer using argv[1] */ |
| | | |
| | | sa.sa_handler = handler; |
| | | sigemptyset(&sa.sa_mask); |
| | | sa.sa_flags = 0; |
| | | if (sigaction(SIGINT, &sa, NULL) == -1) |
| | | handle_error("sigaction"); |
| | | |
| | | |
| | | |
| | | /* Calculate relative interval as current time plus |
| | | number of seconds given argv[2] */ |
| | | |
| | | if (clock_gettime(CLOCK_REALTIME, &ts) == -1) |
| | | handle_error("clock_gettime"); |
| | | |
| | | ts.tv_sec += atoi(argv[2]); |
| | | |
| | | printf("main() about to call sem_wait()\n"); |
| | | while ((s = sem_wait(&sem)) == -1 ) |
| | | printf("%d , %d\n", errno, errno == EINTR); |
| | | |
| | | |
| | | |
| | | } |
| | |
| | | pthread_detach(pthread_self()); |
| | | |
| | | char action[512]; |
| | | while ( true) { |
| | | while ( true ) { |
| | | printf("Input action: Close?\n"); |
| | | if(scanf("%s",action) < 1) { |
| | | printf("Invalide action\n"); |
| | |
| | | opt = parse_args(argc, argv); |
| | | if(opt.bind == 0) { |
| | | usage(argv[0]); |
| | | exit(1); |
| | | } else { |
| | | start_recvfrom(opt.bind, opt.force); |
| | | } |