df7c0b6fde2fc358f847531d481bdf63f79b8d5e
[monolithium.git] / kernel / include / pipe.h
1 /*
2  * pipe.h
3  *
4  * Copyright (C) 2013 Aleksandar Andrejevic <theflash@sdf.lonestar.org>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU Affero General Public License as
8  * published by the Free Software Foundation, either version 3 of the
9  * License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU Affero General Public License for more details.
15  *
16  * You should have received a copy of the GNU Affero General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #ifndef _PIPE_H_
21 #define _PIPE_H_
22
23 #include <sync.h>
24 #include <sdk/pipe.h>
25
26 #define PIPE_BLOCK_SIZE 1024
27 #define MAX_PIPE_BLOCKS 1024
28
29 #define PIPE_MESSAGE (1 << 0)
30
31 enum
32 {
33     PIPELINE_IDLE,
34     PIPELINE_ACCEPTING,
35     PIPELINE_CONNECTING,
36     PIPELINE_FAILED,
37 };
38
39 typedef struct
40 {
41     object_t header;
42     dword_t flags;
43     lock_t lock;
44     list_entry_t fifo;
45 } pipe_t;
46
47 typedef struct
48 {
49     list_entry_t link;
50     dword_t start, end;
51     bool_t full;
52     byte_t data[PIPE_BLOCK_SIZE];
53 } pipe_fifo_entry_t;
54
55 typedef struct
56 {
57     list_entry_t link;
58     size_t size;
59     byte_t data[VARIABLE_SIZE];
60 } pipe_message_entry_t;
61
62 typedef struct
63 {
64     object_t header;
65     dword_t flags;
66     lock_t lock;
67     uintptr_t status;
68     dword_t server_pid;
69     dword_t client_pid;
70     pipe_t *request_pipe;
71     pipe_t *response_pipe;
72     dword_t last_error;
73 } pipeline_t;
74
75 static inline void init_pipe(pipe_t *pipe, dword_t flags)
76 {
77     pipe->flags = flags;
78     pipe->lock = 0;
79     list_init(&pipe->fifo);
80 }
81
82 dword_t read_pipe(pipe_t *pipe, void *buffer, size_t size, dword_t timeout);
83 dword_t write_pipe(pipe_t *pipe, const void *buffer, size_t size);
84 void pipe_cleanup(pipe_t *pipe);
85
86 #endif