libaramid
Portable Multiprocessing Library for C
aramid.h
Go to the documentation of this file.
1 
10 #ifndef ARAMID_ARAMID_H
11 #define ARAMID_ARAMID_H
12 
13 #ifdef __cplusplus
14 #include <cstddef>
15 #include <cstdint>
16 #else
17 #include <stddef.h>
18 #include <stdint.h>
19 #endif
20 
21 #ifdef __cplusplus
22 #define ARMD_EXTERN_C extern "C"
23 #else
24 #define ARMD_EXTERN_C
25 #endif
26 
30 typedef size_t ARMD_Size;
34 typedef int ARMD_Bool;
38 typedef double ARMD_Real;
42 typedef uint64_t ARMD_Handle;
43 
48 typedef struct TAG_ARMD_Job ARMD_Job;
55 typedef struct TAG_ARMD_Procedure ARMD_Procedure;
56 
64 typedef void *(*ARMD_MemoryAllocatorAllocateFunc)(void *context,
65  ARMD_Size size);
73 typedef void (*ARMD_MemoryAllocatorFreeFunc)(void *context, void *buf);
74 
82 typedef struct TAG_ARMD_MemoryAllocator {
88  void *context;
98 
105 ARMD_EXTERN_C void *
107  ARMD_Size size);
115 ARMD_EXTERN_C void
116 armd_memory_allocator_free(const ARMD_MemoryAllocator *allocator, void *buf);
117 
124 ARMD_EXTERN_C void
126 
135 typedef struct TAG_ARMD_MemoryRegion ARMD_MemoryRegion;
136 
142 ARMD_EXTERN_C ARMD_MemoryRegion *
143 armd_memory_region_create(const ARMD_MemoryAllocator *memory_allocator);
149 ARMD_EXTERN_C ARMD_Size
151 
158 ARMD_EXTERN_C void *
160 
168 ARMD_EXTERN_C void armd_memory_region_free(ARMD_MemoryRegion *memory_region,
169  void *buf);
170 
174 ARMD_EXTERN_C char *armd_memory_region_strdup(ARMD_MemoryRegion *memory_region,
175  const char *str);
176 
183 typedef struct TAG_ARMD_Context ARMD_Context;
184 
192 ARMD_EXTERN_C ARMD_Context *
193 armd_context_create(const ARMD_MemoryAllocator *memory_allocator,
194  ARMD_Size num_executors);
200 ARMD_EXTERN_C int armd_context_destroy(ARMD_Context *context);
201 
213  ARMD_Procedure *procedure, void *args,
214  ARMD_Size num_dependencies,
215  const ARMD_Handle *dependencies);
224 ARMD_EXTERN_C int armd_await(ARMD_Context *context, ARMD_Handle handle);
225 
233 ARMD_EXTERN_C int armd_detach(ARMD_Context *context, ARMD_Handle handle);
234 
238 ARMD_EXTERN_C int armd_await_all(ARMD_Context *context);
239 
245 typedef void (*ARMD_PromiseCallbackFunc)(ARMD_Handle handle,
246  void *callback_context, int has_error);
255 ARMD_EXTERN_C
257  void *callback_context,
258  ARMD_PromiseCallbackFunc callback_func);
259 
269 ARMD_EXTERN_C ARMD_Size armd_job_get_num_executors(ARMD_Job *job);
277 ARMD_EXTERN_C ARMD_Size armd_job_get_executor_id(ARMD_Job *job);
278 
290 ARMD_EXTERN_C int armd_fork(ARMD_Job *parent_job, ARMD_Procedure *procedure,
291  void *args);
304 ARMD_EXTERN_C int armd_fork_with_id(ARMD_Size executor_id, ARMD_Job *parent_job,
305  ARMD_Procedure *procedure, void *args);
306 
311  ARMD_ContinuationResult_Error,
312  ARMD_ContinuationResult_Ended,
313  ARMD_ContinuationResult_Repeat,
315 
323  ARMD_Job *job, const void *constants, void *args, void *frame,
324  const void *continuation_constants, void *continuation_frame);
325 
330  ARMD_Job *job, const void *constants, void *args, void *frame,
331  const void *continuation_constants, void *continuation_frame);
332 
337  ARMD_MemoryAllocator *memory_region, void *continuation_constants);
338 
345 typedef void *(*ARMD_ContinuationFrameCreator)(
346  ARMD_MemoryRegion *memory_region);
354  ARMD_MemoryRegion *memory_region, void *continuation_frame);
355 
362 typedef int (*ARMD_SingleContinuationFunc)(ARMD_Job *job, const void *constants,
363  void *args, void *frame);
364 
369 typedef ARMD_Size (*ARMD_SequentialForCountFunc)(void *args, void *frame);
377  const void *constants,
378  void *args, void *frame,
379  ARMD_Size index);
380 
385 typedef ARMD_Size (*ARMD_ParallelForCountFunc)(void *args, void *frame);
393  const void *constants,
394  void *args, void *frame,
395  ARMD_Size index);
396 
403 typedef ARMD_Bool (*ARMD_SetupFunc)(ARMD_Job *job, const void *constants,
404  void *args, void *frame,
405  int dependency_has_error);
406 
413 typedef void (*ARMD_UnwindFunc)(ARMD_Job *job, const void *constants,
414  void *args, void *frame);
415 
419 typedef struct TAG_ARMD_ProcedureBuilder ARMD_ProcedureBuilder;
420 
428 ARMD_EXTERN_C ARMD_ProcedureBuilder *
430  ARMD_Size constant_size, ARMD_Size frame_size);
437 ARMD_EXTERN_C int
445  ARMD_ProcedureBuilder *procedure_builder);
451 ARMD_EXTERN_C void *
460  ARMD_ProcedureBuilder *procedure_builder);
461 
470 ARMD_EXTERN_C int
471 armd_then(ARMD_ProcedureBuilder *procedure_builder,
472  ARMD_ContinuationFunc continuation_func, void *continuation_constants,
473  ARMD_ContinuationConstantsDestroyer continuation_constants_destroyer,
474  ARMD_ErrorTrapFunc error_trap_func,
475  ARMD_ContinuationFrameCreator continuation_frame_creator,
476  ARMD_ContinuationFrameDestroyer continuation_frame_destroyer);
477 
484 ARMD_EXTERN_C int
485 armd_then_single(ARMD_ProcedureBuilder *procedure_builder,
486  ARMD_SingleContinuationFunc single_continuation_func);
487 
495 ARMD_EXTERN_C int armd_then_sequential_for(
496  ARMD_ProcedureBuilder *procedure_builder,
497  ARMD_SequentialForCountFunc sequential_for_count_func,
498  ARMD_SequentialForContinuationFunc sequential_for_continuation_func);
499 
503 ARMD_EXTERN_C int armd_then_parallel_for(
504  ARMD_ProcedureBuilder *procedure_builder,
505  ARMD_ParallelForCountFunc parallel_for_count_func,
506  ARMD_ParallelForContinuationFunc parallel_for_continuation_func);
507 
513 int armd_setup(ARMD_ProcedureBuilder *builder, ARMD_SetupFunc setup_func);
514 
520 ARMD_EXTERN_C int armd_unwind(ARMD_ProcedureBuilder *procedure_builder,
521  ARMD_UnwindFunc unwind_func);
522 
528 ARMD_EXTERN_C int armd_procedure_destroy(ARMD_Procedure *procedure);
529 
535 ARMD_EXTERN_C void *armd_procedure_get_constants(ARMD_Procedure *procedure);
536 
537 /* Time */
538 
539 typedef struct TAG_ARMD_Timespec {
540  int64_t seconds;
541  int64_t nanoseconds;
542 } ARMD_Timespec;
543 
544 ARMD_EXTERN_C int armd_get_time(ARMD_Timespec *result);
545 ARMD_EXTERN_C char *armd_format_time_iso8601(ARMD_MemoryRegion *memory_region,
546  const ARMD_Timespec *timespec);
547 
548 /* Logger */
549 
550 typedef enum TAG_ARMD_LogLevel {
551  ARMD_LogLevel_Fatal,
552  ARMD_LogLevel_Error,
553  ARMD_LogLevel_Warn,
554  ARMD_LogLevel_Info,
555  ARMD_LogLevel_Debug,
556  ARMD_LogLevel_Trace,
557 } ARMD_LogLevel;
558 
559 typedef struct TAG_ARMD_Logger ARMD_Logger;
560 
561 typedef struct TAG_ARMD_LogElement {
562  ARMD_Timespec timespec;
563  ARMD_LogLevel level;
564  const char *filename;
565  ARMD_Size lineno;
566  char *message;
568 
569 typedef void (*ARMD_LoggerCallbackFunc)(void *context, ARMD_Logger *logger);
570 
571 ARMD_EXTERN_C ARMD_Logger *armd_logger_create(ARMD_MemoryRegion *memory_region,
572  ARMD_LogLevel level);
573 ARMD_EXTERN_C void armd_logger_increment_reference_count(ARMD_Logger *logger);
574 ARMD_EXTERN_C ARMD_Bool
575 armd_logger_decrement_reference_count(ARMD_Logger *logger);
576 
577 ARMD_EXTERN_C void
578 armd_logger_set_callback(ARMD_Logger *logger,
579  ARMD_LoggerCallbackFunc callback_func,
580  void *callback_context);
581 ARMD_EXTERN_C void armd_logger_set_stdout_callback(ARMD_Logger *logger);
582 ARMD_EXTERN_C void armd_logger_set_stderr_callback(ARMD_Logger *logger);
583 
584 ARMD_EXTERN_C ARMD_MemoryRegion *
585 armd_logger_get_memory_region(ARMD_Logger *logger);
586 ARMD_EXTERN_C int armd_logger_get_log_element(ARMD_Logger *logger,
587  ARMD_LogElement **log_element);
588 ARMD_EXTERN_C void
589 armd_logger_destroy_log_element(ARMD_Logger *logger,
590  ARMD_LogElement *log_element);
591 
592 ARMD_EXTERN_C
593 void armd_logger_log_string(ARMD_Logger *logger, ARMD_LogLevel level,
594  const char *filename, ARMD_Size lineno,
595  char *message);
596 
597 #if defined(__GNUC__) || defined(__clang__)
598 #define ARMD_LOGGER_LOG_FORMAT_ATTRIBUTE __attribute__((format(printf, 5, 6)))
599 #else
600 #define ARMD_LOGGER_LOG_FORMAT_ATTRIBUTE
601 #endif
602 
603 ARMD_EXTERN_C
604 void armd_logger_log_format(ARMD_Logger *logger, ARMD_LogLevel level,
605  const char *filename, ARMD_Size lineno,
606  const char *format,
607  ...) ARMD_LOGGER_LOG_FORMAT_ATTRIBUTE;
608 
609 #undef ARMD_LOGGER_LOG_FORMAT_ATTRIBUTE
610 
611 #define armd_log_fatal(logger, format, ...) \
612  armd_logger_log_format(logger, ARMD_LogLevel_Fatal, __FILE__, __LINE__, \
613  format, __VA_ARGS__)
614 
615 #define armd_log_error(logger, format, ...) \
616  armd_logger_log_format(logger, ARMD_LogLevel_Error, __FILE__, __LINE__, \
617  format, __VA_ARGS__)
618 
619 #define armd_log_warn(logger, format, ...) \
620  armd_logger_log_format(logger, ARMD_LogLevel_Warn, __FILE__, __LINE__, \
621  format, __VA_ARGS__)
622 
623 #define armd_log_info(logger, format, ...) \
624  armd_logger_log_format(logger, ARMD_LogLevel_Info, __FILE__, __LINE__, \
625  format, __VA_ARGS__)
626 
627 #define armd_log_debug(logger, format, ...) \
628  armd_logger_log_format(logger, ARMD_LogLevel_Debug, __FILE__, __LINE__, \
629  format, __VA_ARGS__)
630 
631 #define armd_log_trace(logger, format, ...) \
632  armd_logger_log_format(logger, ARMD_LogLevel_Trace, __FILE__, __LINE__, \
633  format, __VA_ARGS__)
634 
635 #endif
void(* ARMD_PromiseCallbackFunc)(ARMD_Handle handle, void *callback_context, int has_error)
Promise callback.
Definition: aramid.h:245
ARMD_MemoryAllocatorAllocateFunc allocate
Memory allocation function.
Definition: aramid.h:92
int(* ARMD_SequentialForContinuationFunc)(ARMD_Job *job, const void *constants, void *args, void *frame, ARMD_Size index)
Sequential-For Continuation Function.
Definition: aramid.h:376
Definition: aramid.h:561
struct TAG_ARMD_MemoryAllocator ARMD_MemoryAllocator
Abstract memory allocator.
ARMD_EXTERN_C void armd_memory_region_free(ARMD_MemoryRegion *memory_region, void *buf)
Free memory area allocated with ARMD_MemoryRegion.
ARMD_ContinuationResult(* ARMD_ErrorTrapFunc)(ARMD_Job *job, const void *constants, void *args, void *frame, const void *continuation_constants, void *continuation_frame)
Error Trap Function.
Definition: aramid.h:329
ARMD_EXTERN_C ARMD_Size armd_memory_region_destroy(ARMD_MemoryRegion *memory_region)
Destroy ARMD_MemoryRegion.
ARMD_EXTERN_C int armd_then_sequential_for(ARMD_ProcedureBuilder *procedure_builder, ARMD_SequentialForCountFunc sequential_for_count_func, ARMD_SequentialForContinuationFunc sequential_for_continuation_func)
Appends a sequential-for continuation to the procedure.
struct TAG_ARMD_ProcedureBuilder ARMD_ProcedureBuilder
Builder object for ARMD_Procedure.
Definition: aramid.h:419
ARMD_EXTERN_C int armd_detach(ARMD_Context *context, ARMD_Handle handle)
Detach promise.
ARMD_EXTERN_C void * armd_memory_region_allocate(ARMD_MemoryRegion *memory_region, ARMD_Size size)
Allocates memory area with ARMD_MemoryRegion.
ARMD_EXTERN_C ARMD_Procedure * armd_procedure_builder_build_and_destroy(ARMD_ProcedureBuilder *procedure_builder)
Build ARMD_Procedure and destroy ARMD_ProcedureBuilder.
enum TAG_ARMD_ContinuationResult ARMD_ContinuationResult
Continuation Status.
void *(* ARMD_ContinuationFrameCreator)(ARMD_MemoryRegion *memory_region)
Continuation Frame Creator.
Definition: aramid.h:345
ARMD_EXTERN_C void armd_memory_allocator_init_default(ARMD_MemoryAllocator *memory_allocator)
Initialize ARMD_MemoryAllocator with default value.
ARMD_EXTERN_C ARMD_MemoryAllocator armd_procedure_builder_get_memory_allocator(ARMD_ProcedureBuilder *procedure_builder)
Get the memory allocator used in ARMD_ProcedureBuilder.
int armd_setup(ARMD_ProcedureBuilder *builder, ARMD_SetupFunc setup_func)
Add unwind callback to the procedure.
ARMD_EXTERN_C ARMD_Size armd_job_get_num_executors(ARMD_Job *job)
Get the number of executors in the ARMD_Context via ARMD_Job.
ARMD_EXTERN_C int armd_then_parallel_for(ARMD_ProcedureBuilder *procedure_builder, ARMD_ParallelForCountFunc parallel_for_count_func, ARMD_ParallelForContinuationFunc parallel_for_continuation_func)
Appends a parallel-for continuation to the procedure.
ARMD_EXTERN_C void * armd_procedure_get_constants(ARMD_Procedure *procedure)
Get the pointer to constant table.
TAG_ARMD_ContinuationResult
Continuation Status.
Definition: aramid.h:310
ARMD_EXTERN_C int armd_await(ARMD_Context *context, ARMD_Handle handle)
Await promise.
ARMD_EXTERN_C ARMD_Size armd_job_get_executor_id(ARMD_Job *job)
Get the executor id via ARMD_Job.
size_t ARMD_Size
Size type.
Definition: aramid.h:30
ARMD_EXTERN_C int armd_add_promise_callback(ARMD_Context *context, ARMD_Handle handle, void *callback_context, ARMD_PromiseCallbackFunc callback_func)
Add callback to the promise.
ARMD_EXTERN_C int armd_then_single(ARMD_ProcedureBuilder *procedure_builder, ARMD_SingleContinuationFunc single_continuation_func)
Appends a single continuation to the procedure.
ARMD_EXTERN_C int armd_fork_with_id(ARMD_Size executor_id, ARMD_Job *parent_job, ARMD_Procedure *procedure, void *args)
Fork and invoke procedure specifying the executor.
ARMD_EXTERN_C void * armd_procedure_builder_get_constants(ARMD_ProcedureBuilder *procedure_builder)
Get the pointer to constant table.
ARMD_EXTERN_C void armd_memory_allocator_free(const ARMD_MemoryAllocator *allocator, void *buf)
Free memory area allocated with ARMD_MemoryAllocator.
void(* ARMD_UnwindFunc)(ARMD_Job *job, const void *constants, void *args, void *frame)
Unwind Function.
Definition: aramid.h:413
ARMD_EXTERN_C int armd_then(ARMD_ProcedureBuilder *procedure_builder, ARMD_ContinuationFunc continuation_func, void *continuation_constants, ARMD_ContinuationConstantsDestroyer continuation_constants_destroyer, ARMD_ErrorTrapFunc error_trap_func, ARMD_ContinuationFrameCreator continuation_frame_creator, ARMD_ContinuationFrameDestroyer continuation_frame_destroyer)
Appends a versatile continuation to the procedure.
struct TAG_ARMD_Procedure ARMD_Procedure
Aramid Procedure.
Definition: aramid.h:55
ARMD_EXTERN_C ARMD_Context * armd_context_create(const ARMD_MemoryAllocator *memory_allocator, ARMD_Size num_executors)
Create ARMD_Context.
ARMD_EXTERN_C int armd_fork(ARMD_Job *parent_job, ARMD_Procedure *procedure, void *args)
Fork and invoke procedure.
void(* ARMD_ContinuationFrameDestroyer)(ARMD_MemoryRegion *memory_region, void *continuation_frame)
Continuation Frame Destroyer.
Definition: aramid.h:353
struct TAG_ARMD_Job ARMD_Job
Aramid Job.
Definition: aramid.h:48
ARMD_EXTERN_C int armd_procedure_builder_destroy(ARMD_ProcedureBuilder *procedure_builder)
Destroy ARMD_ProcedureBuilder without building ARMD_Procedure.
void(* ARMD_MemoryAllocatorFreeFunc)(void *context, void *buf)
Memory free function interface.
Definition: aramid.h:73
struct TAG_ARMD_Context ARMD_Context
The execution engine.
Definition: aramid.h:183
uint64_t ARMD_Handle
Handle type.
Definition: aramid.h:42
int(* ARMD_ParallelForContinuationFunc)(ARMD_Job *job, const void *constants, void *args, void *frame, ARMD_Size index)
Parallel-For Continuation Function.
Definition: aramid.h:392
ARMD_EXTERN_C int armd_unwind(ARMD_ProcedureBuilder *procedure_builder, ARMD_UnwindFunc unwind_func)
Add unwind callback to the procedure.
ARMD_EXTERN_C ARMD_Handle armd_invoke(ARMD_Context *context, ARMD_Procedure *procedure, void *args, ARMD_Size num_dependencies, const ARMD_Handle *dependencies)
Invoke procedure.
void * context
Memory allocator context.
Definition: aramid.h:88
int ARMD_Bool
Boolean type.
Definition: aramid.h:34
struct TAG_ARMD_MemoryRegion ARMD_MemoryRegion
Memory region.
Definition: aramid.h:135
ARMD_MemoryAllocatorFreeFunc free
Memory free function.
Definition: aramid.h:96
double ARMD_Real
Floating point value type.
Definition: aramid.h:38
ARMD_Size(* ARMD_ParallelForCountFunc)(void *args, void *frame)
Parallel-For Count Function.
Definition: aramid.h:385
ARMD_EXTERN_C int armd_context_destroy(ARMD_Context *context)
Destroy ARMD_Context.
Abstract memory allocator.
Definition: aramid.h:82
ARMD_EXTERN_C int armd_await_all(ARMD_Context *context)
Await all promise.
ARMD_Bool(* ARMD_SetupFunc)(ARMD_Job *job, const void *constants, void *args, void *frame, int dependency_has_error)
Setup Function.
Definition: aramid.h:403
ARMD_EXTERN_C char * armd_memory_region_strdup(ARMD_MemoryRegion *memory_region, const char *str)
strdup for memory_region
ARMD_Size(* ARMD_SequentialForCountFunc)(void *args, void *frame)
Sequential-For Count Function.
Definition: aramid.h:369
ARMD_ContinuationResult(* ARMD_ContinuationFunc)(ARMD_Job *job, const void *constants, void *args, void *frame, const void *continuation_constants, void *continuation_frame)
Continuation Function.
Definition: aramid.h:322
Definition: aramid.h:539
int(* ARMD_SingleContinuationFunc)(ARMD_Job *job, const void *constants, void *args, void *frame)
Single Continuation Function.
Definition: aramid.h:362
void(* ARMD_ContinuationConstantsDestroyer)(ARMD_MemoryAllocator *memory_region, void *continuation_constants)
Continuation Constant Destroyer.
Definition: aramid.h:336
void *(* ARMD_MemoryAllocatorAllocateFunc)(void *context, ARMD_Size size)
Memory allocation function interface.
Definition: aramid.h:64
ARMD_EXTERN_C void * armd_memory_allocator_allocate(const ARMD_MemoryAllocator *allocator, ARMD_Size size)
Allocates memory area with ARMD_MemoryAllocator.
ARMD_EXTERN_C ARMD_ProcedureBuilder * armd_procedure_builder_create(const ARMD_MemoryAllocator *memory_allocator, ARMD_Size constant_size, ARMD_Size frame_size)
Create ARMD_ProcedureBuilder.
ARMD_EXTERN_C int armd_procedure_destroy(ARMD_Procedure *procedure)
Destroy ARMD_Procedure.
ARMD_EXTERN_C ARMD_MemoryRegion * armd_memory_region_create(const ARMD_MemoryAllocator *memory_allocator)
Create ARMD_MemoryRegion.