#include "orconfig.h"
#include <stdlib.h>
#include "lib/thread/threads.h"
#include "lib/thread/thread_sys.h"
#include "lib/log/log.h"
#include "lib/log/util_bug.h"
#include "lib/subsys/subsys.h"
#include <string.h>
tor_cond_t *
tor_cond_new(void)
{
tor_cond_t *cond = tor_malloc(sizeof(tor_cond_t));
if (BUG(tor_cond_init(cond)<0))
tor_free(cond); return cond;
}
void
tor_cond_free_(tor_cond_t *c)
{
if (!c)
return;
tor_cond_uninit(c);
tor_free(c);
}
static unsigned long main_thread_id = -1;
void
set_main_thread(void)
{
main_thread_id = tor_get_thread_id();
}
int
in_main_thread(void)
{
return main_thread_id == tor_get_thread_id();
}
#ifndef HAVE_WORKING_STDATOMIC
void
atomic_counter_init(atomic_counter_t *counter)
{
memset(counter, 0, sizeof(*counter));
tor_mutex_init_nonrecursive(&counter->mutex);
}
void
atomic_counter_destroy(atomic_counter_t *counter)
{
tor_mutex_uninit(&counter->mutex);
memset(counter, 0, sizeof(*counter));
}
void
atomic_counter_add(atomic_counter_t *counter, size_t add)
{
tor_mutex_acquire(&counter->mutex);
counter->val += add;
tor_mutex_release(&counter->mutex);
}
void
atomic_counter_sub(atomic_counter_t *counter, size_t sub)
{
atomic_counter_add(counter, -sub);
}
size_t
atomic_counter_get(atomic_counter_t *counter)
{
size_t val;
tor_mutex_acquire(&counter->mutex);
val = counter->val;
tor_mutex_release(&counter->mutex);
return val;
}
size_t
atomic_counter_exchange(atomic_counter_t *counter, size_t newval)
{
size_t oldval;
tor_mutex_acquire(&counter->mutex);
oldval = counter->val;
counter->val = newval;
tor_mutex_release(&counter->mutex);
return oldval;
}
#endif
static int
subsys_threads_initialize(void)
{
tor_threads_init();
return 0;
}
const subsys_fns_t sys_threads = {
.name = "threads",
SUBSYS_DECLARE_LOCATION(),
.supported = true,
.level = -89,
.initialize = subsys_threads_initialize,
};