Serene Runtime 1.0.0-dev
C runtime for the Serene programming language
Loading...
Searching...
No Matches
thread.h File Reference

srn_thread_t, srn_mutex_t, and srn_cond_t model the thread-level operations the runtime needs, with semantics defined here rather than borrowed from one OS API. More...

#include <pthread.h>
Include dependency graph for thread.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  srn_thread_t
struct  srn_mutex_t
struct  srn_cond_t

Typedefs

typedef struct srn_thread_t srn_thread_t
typedef struct srn_mutex_t srn_mutex_t
typedef struct srn_cond_t srn_cond_t
typedef enum srn_thread_status_t srn_thread_status_t
 Result of a thread operation.

Enumerations

enum  srn_thread_status_t {
  SRN_THREAD_OK = 0 , SRN_THREAD_AGAIN , SRN_THREAD_NOMEM , SRN_THREAD_PERM ,
  SRN_THREAD_ERROR
}
 Result of a thread operation. More...

Functions

srn_thread_status_t srn_thread_spawn (srn_thread_t *t, void(*fn)(void *), void *arg)
 Run fn(arg) on a new OS thread.
srn_thread_status_t srn_thread_join (srn_thread_t *t)
 Block until the thread started for t returns.
srn_thread_status_t srn_mutex_init (srn_mutex_t *m)
srn_thread_status_t srn_mutex_lock (srn_mutex_t *m)
srn_thread_status_t srn_mutex_unlock (srn_mutex_t *m)
srn_thread_status_t srn_mutex_destroy (srn_mutex_t *m)
 Release a mutex's resources.
srn_thread_status_t srn_cond_init (srn_cond_t *c)
srn_thread_status_t srn_cond_wait (srn_cond_t *c, srn_mutex_t *m)
 Release m, sleep until notified, then re-acquire m before returning.
srn_thread_status_t srn_cond_notify_one (srn_cond_t *c)
 Wake one waiter.
srn_thread_status_t srn_cond_notify_all (srn_cond_t *c)
 Wake every waiter.
srn_thread_status_t srn_cond_destroy (srn_cond_t *c)
 Release a condition's resources.

Detailed Description

srn_thread_t, srn_mutex_t, and srn_cond_t model the thread-level operations the runtime needs, with semantics defined here rather than borrowed from one OS API.

The status enum and the operation signatures below are platform-neutral. Only the type realizations differ per platform, so each backend defines the three types over its own primitives inside the matching branch. pthreads back them on POSIX. A Windows backend realises the same operations on the Win32 API directly, so neither platform emulates the other. The types are thin wrappers so they embed inline in another struct rather than needing a separate allocation.

Bear in mind that, we only expose what we need. THIS IS NOT A GENERICE THREAD INTERFACE.

Definition in file thread.h.

Typedef Documentation

◆ srn_cond_t

typedef struct srn_cond_t srn_cond_t

◆ srn_mutex_t

typedef struct srn_mutex_t srn_mutex_t

◆ srn_thread_status_t

Result of a thread operation.

Each backend maps its own error space onto these, so a caller never sees a pthread or Win32 code.

◆ srn_thread_t

typedef struct srn_thread_t srn_thread_t

Enumeration Type Documentation

◆ srn_thread_status_t

Result of a thread operation.

Each backend maps its own error space onto these, so a caller never sees a pthread or Win32 code.

Enumerator
SRN_THREAD_OK 
SRN_THREAD_AGAIN 

The system lacked the resources to start the thread, such as a per-process thread limit.

Retrying after others exit may succeed.

SRN_THREAD_NOMEM 

Out of memory.

SRN_THREAD_PERM 

The caller lacks permission for the requested operation.

SRN_THREAD_ERROR 

A failure the backend could not map to the above.

Definition at line 61 of file thread.h.

61 {
62 SRN_THREAD_OK = 0,
63 /// The system lacked the resources to start the thread, such as a per-process
64 /// thread limit. Retrying after others exit may succeed.
66 /// Out of memory.
68 /// The caller lacks permission for the requested operation.
70 /// A failure the backend could not map to the above.
srn_thread_status_t
Result of a thread operation.
Definition thread.h:61
@ SRN_THREAD_AGAIN
The system lacked the resources to start the thread, such as a per-process thread limit.
Definition thread.h:65
@ SRN_THREAD_OK
Definition thread.h:62
@ SRN_THREAD_ERROR
A failure the backend could not map to the above.
Definition thread.h:71
@ SRN_THREAD_PERM
The caller lacks permission for the requested operation.
Definition thread.h:69
@ SRN_THREAD_NOMEM
Out of memory.
Definition thread.h:67

Function Documentation

◆ srn_cond_destroy()

srn_thread_status_t srn_cond_destroy ( srn_cond_t * c)

Release a condition's resources.

It must have no waiters, and must not be used again without a fresh srn_cond_init.

Here is the caller graph for this function:

◆ srn_cond_init()

srn_thread_status_t srn_cond_init ( srn_cond_t * c)
Here is the caller graph for this function:

◆ srn_cond_notify_all()

srn_thread_status_t srn_cond_notify_all ( srn_cond_t * c)

Wake every waiter.

Here is the caller graph for this function:

◆ srn_cond_notify_one()

srn_thread_status_t srn_cond_notify_one ( srn_cond_t * c)

Wake one waiter.

Here is the caller graph for this function:

◆ srn_cond_wait()

srn_thread_status_t srn_cond_wait ( srn_cond_t * c,
srn_mutex_t * m )

Release m, sleep until notified, then re-acquire m before returning.

A wait can wake spuriously, so the caller must re-check its predicate in a loop.

Here is the caller graph for this function:

◆ srn_mutex_destroy()

srn_thread_status_t srn_mutex_destroy ( srn_mutex_t * m)

Release a mutex's resources.

The mutex must be unlocked and have no waiters, and must not be used again without a fresh srn_mutex_init.

Here is the caller graph for this function:

◆ srn_mutex_init()

srn_thread_status_t srn_mutex_init ( srn_mutex_t * m)
Here is the caller graph for this function:

◆ srn_mutex_lock()

srn_thread_status_t srn_mutex_lock ( srn_mutex_t * m)
Here is the caller graph for this function:

◆ srn_mutex_unlock()

srn_thread_status_t srn_mutex_unlock ( srn_mutex_t * m)
Here is the caller graph for this function:

◆ srn_thread_join()

srn_thread_status_t srn_thread_join ( srn_thread_t * t)

Block until the thread started for t returns.

Here is the caller graph for this function:

◆ srn_thread_spawn()

srn_thread_status_t srn_thread_spawn ( srn_thread_t * t,
void(* fn )(void *),
void * arg )

Run fn(arg) on a new OS thread.

Returns SRN_THREAD_OK, or a status describing why the thread could not be created. The caller owns t and must keep it alive until srn_thread_join returns.

Here is the caller graph for this function: