Sharvil Nanavati | 118bdd5 | 2014-05-07 22:09:12 -0700 | [diff] [blame] | 1 | /****************************************************************************** |
| 2 | * |
| 3 | * Copyright (C) 2014 Google, Inc. |
| 4 | * |
| 5 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 6 | * you may not use this file except in compliance with the License. |
| 7 | * You may obtain a copy of the License at: |
| 8 | * |
| 9 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 10 | * |
| 11 | * Unless required by applicable law or agreed to in writing, software |
| 12 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 14 | * See the License for the specific language governing permissions and |
| 15 | * limitations under the License. |
| 16 | * |
| 17 | ******************************************************************************/ |
| 18 | |
| 19 | #pragma once |
| 20 | |
Sharvil Nanavati | 7c19f01 | 2014-08-14 12:36:39 -0700 | [diff] [blame] | 21 | #include <stdbool.h> |
Chris Manton | bc93d57 | 2015-01-07 13:54:24 -0800 | [diff] [blame] | 22 | #include <stdlib.h> |
Sharvil Nanavati | 7c19f01 | 2014-08-14 12:36:39 -0700 | [diff] [blame] | 23 | |
Sharvil Nanavati | 118bdd5 | 2014-05-07 22:09:12 -0700 | [diff] [blame] | 24 | #define THREAD_NAME_MAX 16 |
| 25 | |
Sharvil Nanavati | 9d461af | 2014-07-24 14:24:27 -0700 | [diff] [blame] | 26 | typedef struct reactor_t reactor_t; |
Sharvil Nanavati | 118bdd5 | 2014-05-07 22:09:12 -0700 | [diff] [blame] | 27 | typedef struct thread_t thread_t; |
Sharvil Nanavati | 94347a5 | 2014-07-04 17:51:29 -0700 | [diff] [blame] | 28 | typedef void (*thread_fn)(void *context); |
Sharvil Nanavati | 118bdd5 | 2014-05-07 22:09:12 -0700 | [diff] [blame] | 29 | |
Sharvil Nanavati | 94347a5 | 2014-07-04 17:51:29 -0700 | [diff] [blame] | 30 | // Creates and starts a new thread with the given name. Only THREAD_NAME_MAX |
| 31 | // bytes from |name| will be assigned to the newly-created thread. Returns a |
| 32 | // thread object if the thread was successfully started, NULL otherwise. The |
| 33 | // returned thread object must be freed with |thread_free|. |name| may not |
| 34 | // be NULL. |
| 35 | thread_t *thread_new(const char *name); |
Sharvil Nanavati | 118bdd5 | 2014-05-07 22:09:12 -0700 | [diff] [blame] | 36 | |
Chris Manton | 7307d70 | 2014-08-05 11:10:12 -0700 | [diff] [blame] | 37 | // Similar to |thread_new| but creates with a given queue |size|. |
| 38 | thread_t *thread_new_sized(const char *name, size_t size); |
| 39 | |
Sharvil Nanavati | 94347a5 | 2014-07-04 17:51:29 -0700 | [diff] [blame] | 40 | // Frees the given |thread|. If the thread is still running, it is stopped |
| 41 | // and the calling thread will block until |thread| terminates. |thread| |
| 42 | // may be NULL. |
| 43 | void thread_free(thread_t *thread); |
Sharvil Nanavati | 118bdd5 | 2014-05-07 22:09:12 -0700 | [diff] [blame] | 44 | |
Zach Johnson | 40fbe5d | 2014-08-15 16:43:32 -0700 | [diff] [blame] | 45 | // Waits for |thread_stop|. Upon returning, the only other operations a caller |
| 46 | // may perform on |thread| are |thread_free| and |thread_join|. |thread_join| |
| 47 | // is idempotent and may be called from any thread. |thread| may not be NULL. |
| 48 | void thread_join(thread_t *thread); |
| 49 | |
Sharvil Nanavati | 94347a5 | 2014-07-04 17:51:29 -0700 | [diff] [blame] | 50 | // Call |func| with the argument |context| on |thread|. This function typically |
| 51 | // does not block unless there are an excessive number of functions posted to |
| 52 | // |thread| that have not been dispatched yet. Neither |thread| nor |func| may |
| 53 | // be NULL. |context| may be NULL. |
| 54 | bool thread_post(thread_t *thread, thread_fn func, void *context); |
| 55 | |
| 56 | // Requests |thread| to stop. Only |thread_free| and |thread_name| may be called |
| 57 | // after calling |thread_stop|. This function is guaranteed to not block. |
| 58 | // |thread| may not be NULL. |
| 59 | void thread_stop(thread_t *thread); |
| 60 | |
Sharvil Nanavati | 7c19f01 | 2014-08-14 12:36:39 -0700 | [diff] [blame] | 61 | // Returns true if the current thread is the same as the one represented by |thread|. |
| 62 | // |thread| may not be NULL. |
| 63 | bool thread_is_self(const thread_t *thread); |
| 64 | |
Sharvil Nanavati | fbf8908 | 2014-08-13 00:40:49 -0700 | [diff] [blame] | 65 | reactor_t *thread_get_reactor(const thread_t *thread); |
| 66 | |
Sharvil Nanavati | 94347a5 | 2014-07-04 17:51:29 -0700 | [diff] [blame] | 67 | // Returns the name of the given |thread|. |thread| may not be NULL. |
Sharvil Nanavati | 118bdd5 | 2014-05-07 22:09:12 -0700 | [diff] [blame] | 68 | const char *thread_name(const thread_t *thread); |