Objectively 1.0.0
Ultra-lightweight object oriented framework for GNU C.
Macros | Functions
Condition.c File Reference
#include <assert.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include "Condition.h"

Go to the source code of this file.

Macros

#define _Class   _Condition
 

Functions

Class_Condition (void)
 
static void _signal (Condition *self)
 
static void _wait (Condition *self)
 
static void broadcast (Condition *self)
 
static void dealloc (Object *self)
 
static Conditioninit (Condition *self)
 
static void initialize (Class *clazz)
 
static _Bool waitUntilDate (Condition *self, const Date *date)
 

Macro Definition Documentation

◆ _Class

#define _Class   _Condition

Definition at line 34 of file Condition.c.

Function Documentation

◆ _Condition()

Class * _Condition ( void  )

Definition at line 141 of file Condition.c.

141 {
142 static Class *clazz;
143 static Once once;
144
145 do_once(&once, {
146 clazz = _initialize(&(const ClassDef) {
147 .name = "Condition",
148 .superclass = _Lock(),
149 .instanceSize = sizeof(Condition),
150 .interfaceOffset = offsetof(Condition, interface),
151 .interfaceSize = sizeof(ConditionInterface),
153 });
154 });
155
156 return clazz;
157}
Class * _initialize(const ClassDef *def)
Initializes the given Class.
Definition: Class.c:91
static void initialize(Class *clazz)
Definition: Condition.c:126
long Once
The Once type.
Definition: Once.h:37
#define do_once(once, block)
Executes the given block at most one time.
Definition: Once.h:43
ClassDefs are passed to _initialize via an archetype to initialize a Class.
Definition: Class.h:41
The runtime representation of a Class.
Definition: Class.h:95
POSIX Threads conditional variables.
Definition: Condition.h:44
Class * _Lock(void)
The Lock archetype.
Definition: Lock.c:129

◆ _signal()

static void _signal ( Condition self)
static

Definition at line 86 of file Condition.c.

86 {
87
88 int err = pthread_cond_signal(self->condition);
89 assert(err == 0);
90}

◆ _wait()

static void _wait ( Condition self)
static

Definition at line 96 of file Condition.c.

96 {
97
98 int err = pthread_cond_wait(self->condition, self->lock.lock);
99 assert(err == 0);
100}
Lock lock
The superclass.
Definition: Condition.h:49

◆ broadcast()

static void broadcast ( Condition self)
static

Definition at line 57 of file Condition.c.

57 {
58
59 int err = pthread_cond_broadcast(self->condition);
60 assert(err == 0);
61}

◆ dealloc()

static void dealloc ( Object self)
static
See also
Object::dealloc(Object *)

Definition at line 41 of file Condition.c.

41 {
42
43 Condition *this = (Condition *) self;
44
45 pthread_cond_destroy(this->condition);
46 free(this->condition);
47
48 super(Object, self, dealloc);
49}
#define super(type, obj, method,...)
Object is the root Class of The Objectively Class hierarchy.
Definition: Object.h:46
void dealloc(Object *self)
Frees all resources held by this Object.
Definition: Array.c:50

◆ init()

static Condition * init ( Condition self)
static

Definition at line 67 of file Condition.c.

67 {
68
69 self = (Condition *) super(Lock, self, init);
70 if (self) {
71
72 self->condition = calloc(1, sizeof(pthread_cond_t));
73 assert(self->condition);
74
75 const int err = pthread_cond_init(self->condition, NULL);
76 assert(err == 0);
77 }
78
79 return self;
80}
Condition * init(Condition *self)
Initializes this Condition.
Definition: Condition.c:67
POSIX Threads locks.
Definition: Lock.h:42

◆ initialize()

static void initialize ( Class clazz)
static
See also
Class::initialize(Class *)

Definition at line 126 of file Condition.c.

126 {
127
128 ((ObjectInterface *) clazz->interface)->dealloc = dealloc;
129
130 ((ConditionInterface *) clazz->interface)->broadcast = broadcast;
131 ((ConditionInterface *) clazz->interface)->init = init;
132 ((ConditionInterface *) clazz->interface)->signal = _signal;
133 ((ConditionInterface *) clazz->interface)->wait = _wait;
134 ((ConditionInterface *) clazz->interface)->waitUntilDate = waitUntilDate;
135}
static void _signal(Condition *self)
Definition: Condition.c:86
static void _wait(Condition *self)
Definition: Condition.c:96
ident interface
The interface of the Class.
Definition: Class.h:105
_Bool waitUntilDate(Condition *self, const Date *date)
Waits until the specified Date for this Condition to be signaled.
Definition: Condition.c:106
void signal(Condition *self)
Signals a single Thread waiting on this Condition.
void broadcast(Condition *self)
Signals all Threads waiting on this Condition.
Definition: Condition.c:57

◆ waitUntilDate()

static _Bool waitUntilDate ( Condition self,
const Date date 
)
static

Definition at line 106 of file Condition.c.

106 {
107
108 Lock *lock = (Lock *) self;
109
110 const struct timespec time = {
111 .tv_sec = date->time.tv_sec,
112 .tv_nsec = date->time.tv_usec * 1000
113 };
114
115 int err = pthread_cond_timedwait(self->condition, lock->lock, &time);
116 assert(err == 0 || err == ETIMEDOUT);
117
118 return err == 0;
119}
Time time
The time.
Definition: Date.h:86
Date * date(void)
Returns a new Date with the current Time.
Definition: Date.c:98
void lock(Lock *self)
Acquire this lock, waiting indefinitely.
Definition: Lock.c:81