/******************************************************************************
 *
 *  Copyright 2014 Google, Inc.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at:
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 ******************************************************************************/

#pragma once

#include <stdbool.h>
#include <stdlib.h>

#define THREAD_NAME_MAX 16

typedef struct reactor_t reactor_t;
typedef struct thread_t thread_t;

typedef void (*thread_fn)(void* context);

// Creates and starts a new thread with the given name. Only THREAD_NAME_MAX
// bytes from |name| will be assigned to the newly-created thread. Returns a
// thread object if the thread was successfully started, NULL otherwise. The
// returned thread object must be freed with |thread_free|. |name| may not
// be NULL.
thread_t* thread_new(const char* name);

// Similar to |thread_new| but creates with a given queue |size|.
thread_t* thread_new_sized(const char* name, size_t size);

// Frees the given |thread|. If the thread is still running, it is stopped
// and the calling thread will block until |thread| terminates. |thread|
// may be NULL.
void thread_free(thread_t* thread);

// Waits for |thread_stop|. Upon returning, the only other operations a caller
// may perform on |thread| are |thread_free| and |thread_join|. |thread_join|
// is idempotent and may be called from any thread. |thread| may not be NULL.
void thread_join(thread_t* thread);

// Call |func| with the argument |context| on |thread|. This function typically
// does not block unless there are an excessive number of functions posted to
// |thread| that have not been dispatched yet. Neither |thread| nor |func| may
// be NULL. |context| may be NULL.
// Return true on success, otherwise false.
bool thread_post(thread_t* thread, thread_fn func, void* context);

// Requests |thread| to stop. Only |thread_free| and |thread_name| may be called
// after calling |thread_stop|. This function is guaranteed to not block.
// |thread| may not be NULL.
void thread_stop(thread_t* thread);

// Attempts to sets the |priority| of a given |thread|.
// The |thread| has to be running for this call to succeed.
// Returns true on success.
bool thread_set_priority(thread_t* thread, int priority);

// Attempts to set |thread| to the real-time SCHED_FIFO |priority|.
// The |thread| has to be running for this call to succeed.
// Priority values are valid in the range sched_get_priority_max(SCHED_FIFO)
// to sched_get_priority_min(SCHED_FIFO).  Larger values are higher priority.
// Returns true on success.
bool thread_set_rt_priority(thread_t* thread, int priority);

// Returns true if the current thread is the same as the one represented by
// |thread|.
// |thread| may not be NULL.
bool thread_is_self(const thread_t* thread);

// Returns the reactor for the given |thread|. |thread| may not be NULL.
reactor_t* thread_get_reactor(const thread_t* thread);

// Returns the name of the given |thread|. |thread| may not be NULL.
const char* thread_name(const thread_t* thread);
