#include "iperf_config.h"

#if defined(HAVE_PTHREAD) && defined(__ANDROID__)

/* Workaround for `pthread_cancel()` in Android, using `pthread_kill()` instead,
 * as Android NDK does not support `pthread_cancel()`.
 */

#include <string.h>
#include <signal.h>
#include "iperf_pthread.h"

void iperf_thread_exit_handler(int sig) {
    pthread_exit(0);
}

int iperf_set_thread_exit_handler() {
    int rc;
    struct sigaction actions;

    memset(&actions, 0, sizeof(actions));
    sigemptyset(&actions.sa_mask);
    actions.sa_flags = 0;
    actions.sa_handler = iperf_thread_exit_handler;

    rc = sigaction(SIGUSR1, &actions, NULL);
    return rc;
}

int pthread_setcanceltype(int type, int *oldtype) { return 0; }
int pthread_setcancelstate(int state, int *oldstate) { return 0; }
int pthread_cancel(pthread_t thread_id) {
    int status;
    if ((status = iperf_set_thread_exit_handler()) == 0) {
        status = pthread_kill(thread_id, SIGUSR1);
    }
    return status;
}

#endif // defined(HAVE_PTHREAD) && defined(__ANDROID__)
