ssm  0.0.2
Runtime Library for the Sparse Synchronous Model
ssm-closure.c
Go to the documentation of this file.
1 /** @file ssm-closure.c
2  * @brief SSM closure management and allocation.
3  *
4  * @author Hans Montero (hmontero1205)
5  */
6 #include <assert.h>
7 #include <ssm-internal.h>
8 #include <ssm.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 
13  ssm_value_t new_closure =
15  ssm_closure_arg_count(new_closure) = ssm_closure_arg_count(closure);
16 
17  for (size_t i = 0; i < ssm_closure_arg_count(closure); i++) {
18  ssm_dup(ssm_closure_arg(closure, i));
19  ssm_closure_arg(new_closure, i) = ssm_closure_arg(closure, i);
20  }
21 
22  return new_closure;
23 }
24 
26  ssm_priority_t prio, ssm_depth_t depth,
27  ssm_value_t *ret) {
28  if (ssm_closure_arg_cap(closure) == ssm_closure_arg_count(closure) + 1) {
29  // Call ssm_dup() on all previously applied arguments of closure, since they
30  // will be shared by the child process.
32  ssm_closure_push(closure, arg);
33  ssm_closure_activate(closure, parent, prio, depth, ret);
34  ssm_closure_pop(closure);
35  } else {
36  // No need to call ssm_dups() since ssm_closure_clone() already dups
37  // all the arguments.
38  *(ret) = ssm_closure_clone(closure);
39  ssm_closure_push(*(ret), arg);
40  }
41 }
42 
44  ssm_act_t *parent, ssm_priority_t prio,
45  ssm_depth_t depth, ssm_value_t *ret) {
46  SSM_ASSERT(!ssm_is_shared(closure));
47 
48  if (ssm_closure_arg_cap(closure) == ssm_closure_arg_count(closure) + 1) {
49  ssm_closure_push(closure, arg);
50  ssm_closure_activate(closure, parent, prio, depth, ret);
51 
52  // We can directly call ssm_mem_free() because we already know (1) closure
53  // is a heap object and (2) this is the last time it will be used.
54  //
55  // We don't need to call ssm_drop() on any of its arguments since those are
56  // moved into the newly activated process (also why we didn't need to call
57  // ssm_dup() before activating the process).
58  ssm_closure_free(closure);
59  } else {
60  // Just modify the closure in-place.
61  ssm_closure_push(closure, arg);
62  *(ret) = (closure);
63  }
64 }
uint8_t ssm_depth_t
Index of least significant bit in a group of priorities.
Definition: ssm.h:111
uint32_t ssm_priority_t
Thread priority.
Definition: ssm.h:102
#define ssm_closure_activate(closure, parent, prio, depth, ret)
Spawn and schedule a new child process from a fully-applied closure.
Definition: ssm.h:868
#define ssm_closure_pop(closure)
Remove an argument from a closure.
Definition: ssm.h:858
void ssm_closure_apply(ssm_value_t closure, ssm_value_t arg, ssm_act_t *parent, ssm_priority_t prio, ssm_depth_t depth, ssm_value_t *ret)
Apply an argument to a closure.
Definition: ssm-closure.c:25
#define ssm_closure_arg_count(v)
Obtain the number of argument values owned by a closure.
Definition: ssm.h:811
#define ssm_closure_push(closure, arg)
Add an argument to a closure.
Definition: ssm.h:846
#define ssm_closure_arg(v, i)
Obtain the ith argument of a closure.
Definition: ssm.h:827
ssm_value_t ssm_closure_clone(ssm_value_t closure)
Create a copy of a closure.
Definition: ssm-closure.c:12
void ssm_closure_apply_final(ssm_value_t closure, ssm_value_t arg, ssm_act_t *parent, ssm_priority_t prio, ssm_depth_t depth, ssm_value_t *ret)
Apply an argument to a closure that is used for the last time.
Definition: ssm-closure.c:43
#define ssm_closure_arg_cap(v)
Obtain the number of argument values accommodated by a closure.
Definition: ssm.h:815
#define ssm_closure_argv(v)
Retrieve the argument array of a closure.
Definition: ssm.h:823
#define ssm_new_closure(f, args)
Definition: ssm.h:880
#define ssm_closure_free(closure)
Helper to free a closure (without reference counting).
Definition: ssm.h:996
#define ssm_closure_func(v)
Obtain the enter function pointer of a closure.
Definition: ssm.h:819
#define SSM_ASSERT(cond)
Throw an internal error.
Definition: ssm-internal.h:23
#define ssm_dup(v)
Duplicate a possible heap reference, incrementing its ref count.
Definition: ssm.h:325
#define ssm_is_shared(v)
Whether a value is shared, i.e., unsafe to modify.
Definition: ssm.h:315
void ssm_dups(size_t cnt, ssm_value_t *arr)
Call ssm_dup() on an array of values.
Definition: ssm-mem.c:367
The internal interface of the SSM runtime.
Interface to the SSM runtime.
Activation record for an SSM routine.
Definition: ssm.h:125
SSM values are either "packed" values or heap-allocated.
Definition: ssm.h:232