summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/application/index.md11
-rw-r--r--docs/application/interface.md46
-rw-r--r--docs/application/pool.md10
-rw-r--r--docs/application/testing.md17
-rw-r--r--docs/application/thread.md (renamed from docs/application/process.md)47
-rw-r--r--docs/application/type.md7
-rw-r--r--docs/index.md6
-rw-r--r--docs/language/index.md (renamed from docs/syntax/index.md)0
-rw-r--r--docs/language/operators.md (renamed from docs/syntax/operators.md)6
-rw-r--r--docs/language/ownership.md13
-rw-r--r--docs/type_system/fn.md31
-rw-r--r--docs/type_system/overload.md6
-rw-r--r--docs/type_system/task.md4
-rw-r--r--mkdocs.yml12
14 files changed, 187 insertions, 29 deletions
diff --git a/docs/application/index.md b/docs/application/index.md
index b9a5e0b..3809ac9 100644
--- a/docs/application/index.md
+++ b/docs/application/index.md
@@ -2,10 +2,19 @@
---
+## Requirements
+
+* Linux X64
+* GNU Make
+* GCC with -std=gnu99 -fhardened
+
## Sections
+* ##### [Interface](./interface.md)
+* ##### [Type](./type.md)
* ##### [Pool](./pool.md)
-* ##### [Process](./process.md)
+* ##### [Thread](./thread.md)
+* ##### [Testing](./testing.md)
## Invocation
diff --git a/docs/application/interface.md b/docs/application/interface.md
new file mode 100644
index 0000000..1493aff
--- /dev/null
+++ b/docs/application/interface.md
@@ -0,0 +1,46 @@
+# Interface
+
+---
+
+General definitions used throughout the code
+
+## Object Definitions
+
+```c
+typedef union {
+ bool b;
+ uint8_t u8;
+ uint16_t u16;
+ uint32_t u32;
+ uint64_t u64;
+ int8_t i8;
+ int16_t i16;
+ int32_t i32;
+ int64_t i64;
+ float f32;
+ double f64;
+ void *ptr;
+} kpl_any;
+
+typedef size_t kpl_any_hash_fn(const kpl_any a);
+
+typedef bool kpl_any_eq_fn(const kpl_any a, const kpl_any b);
+
+typedef ssize_t kpl_any_cmp_fn(const kpl_any a, const kpl_any b);
+
+typedef int32_t kpl_any_print_fn(const kpl_any a, FILE *file, size_t idnt, uint32_t print_opts);
+
+typedef void kpl_any_free_fn(kpl_any a);
+
+typedef struct {
+ kpl_any_hash_fn *hash_fn;
+ kpl_any_eq_fn *eq_fn;
+ kpl_any_cmp_fn *cmp_fn;
+ kpl_any_print_fn *print_fn;
+ kpl_any_free_fn *free_fn;
+} kpl_any_interace;
+
+typedef struct {
+ any value, info;
+} kpl_result;
+```
diff --git a/docs/application/pool.md b/docs/application/pool.md
index dc7c1e3..b4c5913 100644
--- a/docs/application/pool.md
+++ b/docs/application/pool.md
@@ -1,3 +1,13 @@
# Memory Pool
---
+
+## Object Definitions
+
+```c
+#define POOL_HEADER(STRUCT) struct STRUCT *prev, *next; uint32_t obj_size
+
+typedef struct _kpl_pool_obj {
+ POOL_HEADER(_kpl_pool_obj);
+} kpl_pool_obj;
+```
diff --git a/docs/application/testing.md b/docs/application/testing.md
new file mode 100644
index 0000000..8657bf0
--- /dev/null
+++ b/docs/application/testing.md
@@ -0,0 +1,17 @@
+# Testing
+
+---
+
+## Macros
+
+```c
+TEST(NAME) {
+ // TEST BODY
+}
+
+ASSERT(CONDITION)
+
+FAIL()
+```
+
+## Object Definitions
diff --git a/docs/application/process.md b/docs/application/thread.md
index 2934201..04d9c98 100644
--- a/docs/application/process.md
+++ b/docs/application/thread.md
@@ -1,7 +1,39 @@
-# Processes
+# Threads
---
+## Object Definitions
+
+```c
+typedef struct _kpl_task kpl_task;
+
+typedef void kpl_task_fn(kpl_task *t);
+
+#ifndef KPL_TASK_STATE_SIZE
+#define KPL_TASK_STATE_SIZE 20
+#endif
+
+typedef struct _kpl_task {
+ POOL_HEADER(kpl_task);
+ _Atomic bool join_ready;
+ uint16_t worker_id;
+ kpl_any state[KPL_TASK_STATE_SIZE];
+ kpl_result ret;
+ kpl_task_fn *fn;
+} kpl_task;
+
+typedef struct {
+ kpl_task *head, *tail;
+ pthread_t thread;
+} kpl_thread;
+
+#define KPL_PROCESSES $(nproc)
+
+kpl_thread kpl_worker[KPL_PROCESSES] = {};
+
+_Atomic uint16_t kpl_worker_running = KPL_PROCESSES;
+```
+
## Per Process Task Queue
## Asynchronous Task Queue
@@ -14,6 +46,10 @@
# Running
+Main thread is kpl_worker[0], threads are started after that
+
+## Joining
+
# Example
```c
@@ -119,7 +155,6 @@ void task_queue_sync(task *t, int32_t worker_id) {
worker[worker_id].tail = worker[worker_id].tail->next = t;
else
worker[worker_id].head = worker[worker_id].tail = t;
- return;
}
void task_ready_queue(task *t) {
@@ -172,7 +207,7 @@ void *task_loop(void *arg) {
}
running--;
if (!running) {
- for (intptr_t worker_id = 1; worker_id < PROCESSES; worker_id++)
+ for (intptr_t worker_id = 0; worker_id < PROCESSES; worker_id++)
pthread_cond_signal(&task_async_queue_cond);
break;
}
@@ -199,11 +234,11 @@ fib : Fn[n] $ (
? {
n <= 0 { 0 }
n < 2 { 1 }
- { + (fib `call n - 1; fib `call n - 2) }
+ { + (fib `sync n - 1; fib `sync n - 2) }
}
v : Vector[`fork_type fib] $ ()
- @ 1 .. I { v `push fib `fork FIB }
- @ v {[fib_task] `print "fib(%) = %\n" `format (FIB; `join fib_task) }
+ @ 1 .. I { v `push fib `async FIB }
+ @ v {[fib_task] `print "fib(%) = %\n" `format (FIB; `wait fib_task) }
`print "Complete\n"
)
*/
diff --git a/docs/application/type.md b/docs/application/type.md
new file mode 100644
index 0000000..4cc2fc8
--- /dev/null
+++ b/docs/application/type.md
@@ -0,0 +1,7 @@
+# Type
+
+---
+
+## Object Definitions
+
+## Allocator
diff --git a/docs/index.md b/docs/index.md
index 57a8faf..afbb356 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -29,8 +29,8 @@ readFile("filename", callback(data))
// langauge equivalent
Fn[name; callback] $ (
( read_file ) : `use "io"
- callback `call read_file `call name
-) `fork ("filename"; callback)
+ callback `sync read_file `sync name
+) `async ("filename"; callback)
```
* Automatically use threads
@@ -41,6 +41,6 @@ Fn[name; callback] $ (
## Contents
-1. ##### [Syntax](./syntax/index.md)
+1. ##### [Language](./language/index.md)
2. ##### [Type System](./type_system/index.md)
3. ##### [Application](./application/index.md)
diff --git a/docs/syntax/index.md b/docs/language/index.md
index fe97143..fe97143 100644
--- a/docs/syntax/index.md
+++ b/docs/language/index.md
diff --git a/docs/syntax/operators.md b/docs/language/operators.md
index dc518ab..d8ae378 100644
--- a/docs/syntax/operators.md
+++ b/docs/language/operators.md
@@ -64,6 +64,8 @@ Stops execution and prints `Any` to `stdout`
## ``type`
-## ``return_type`
+## ``sync_type`
-## ``fork_type`
+## ``async_type`
+
+## ``copy`
diff --git a/docs/language/ownership.md b/docs/language/ownership.md
new file mode 100644
index 0000000..289846c
--- /dev/null
+++ b/docs/language/ownership.md
@@ -0,0 +1,13 @@
+# Ownership
+
+---
+
+# Copying
+
+# Moving
+
+## To And From Functions
+
+# Locking
+
+## References
diff --git a/docs/type_system/fn.md b/docs/type_system/fn.md
index 5a723f6..b004560 100644
--- a/docs/type_system/fn.md
+++ b/docs/type_system/fn.md
@@ -3,7 +3,12 @@
---
```text
-Fn_class `alias Enum[.unknown; .incomplete; .native; process; .generator; .iterator; .closure; .bound; .regex]
+Fn_class `alias Enum[
+ .unknown; .incomplete; .native
+ .task; process; .generator; .iterator; .closure;
+ .bound;
+ .regex
+]
Fn[Fn_class; RETURN_TYPE; Tuple[ARGS]; STATE; List]
```
@@ -22,6 +27,10 @@ A function with an incomplete type, type checking occurs at invocation
Native function wrapper
+## Task
+
+A queue-able function in a process or iterator
+
## Process
A list of tasks with state
@@ -62,12 +71,12 @@ Return `Void` to stop iteration
```text
fn : Fn[n] $ ( @ 1 < n {[x] `yield 2 * x; n +: 1 } )
-it : fn `call 10
+it : fn `sync 10
// invoking
@ it {[v] `log v } // 2 4 6 8 10 12 14 16 18 20
// same as above
@ {
- # `call it {
+ # `sync it {
.value {[v] `log v }
.done { `break }
}
@@ -76,15 +85,21 @@ it : fn `call 10
# Calling
-## \`fork
+## \`async
+
+Asynchronous call
```text
-task : `fork fn
-value : `join task
+task : `async fn
+value : `wait task
```
-## \`call
+## \`sync
+
+Synchronous call
+
+If the callee is a process, an inline wait with async is used
```text
-fn `call args // `join fn `task args
+fn `sync args // can be turned into `wait fn `async args
```
diff --git a/docs/type_system/overload.md b/docs/type_system/overload.md
index 116ce0e..dff2327 100644
--- a/docs/type_system/overload.md
+++ b/docs/type_system/overload.md
@@ -13,7 +13,7 @@ Overload[FN; ...]
```text
add : Overload[Fn[.native; I64; Tuple[I64.x; I64.y]; ...]; Fn[.native; F64; Tuple[F64.x; F64.y]; ...]; ...]
-`log add `call (1; 2) // Valid calls first
-`log add `call (1.1; 2.2) // Valid calls second
-`log add `call (1; 2.2) // Invalid no signature match
+`log add `sync (1; 2) // Valid calls first
+`log add `sync (1.1; 2.2) // Valid calls second
+`log add `sync (1; 2.2) // Invalid no signature match
```
diff --git a/docs/type_system/task.md b/docs/type_system/task.md
index 0f3e575..06790d7 100644
--- a/docs/type_system/task.md
+++ b/docs/type_system/task.md
@@ -5,7 +5,7 @@
A segment of code assigned to a process, task code can be recursive
```text
-Task[JOIN_TYPE; PROCESS; AST; IR; CODE]
+Task[JOIN_TYPE; PROCESS]
```
-## \`join
+## \`wait
diff --git a/mkdocs.yml b/mkdocs.yml
index 6efaf5e..46ea0d1 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -5,9 +5,10 @@ repo_name: Markdown Source
copyright: Copyright &copy; nodist
nav:
- Main: 'index.md'
- - Syntax:
- - Code: 'syntax/index.md'
- - Operators: 'syntax/operators.md'
+ - Language:
+ - Syntax: 'language/index.md'
+ - Operators: 'language/operators.md'
+ - Ownership: 'language/ownership.md'
- Type System:
- Templates: 'type_system/index.md'
- Alias: 'type_system/alias.md'
@@ -38,5 +39,8 @@ nav:
- Namespace: 'type_system/namespace.md'
- Application:
- Runtime: 'application/index.md'
+ - Interface: 'application/interface.md'
+ - Type: 'application/type.md'
- Pool: 'application/pool.md'
- - Processes: 'application/process.md'
+ - Thread: 'application/thread.md'
+ - Testing: 'application/testing.md'