-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathipc.h
115 lines (96 loc) · 3.72 KB
/
ipc.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/**
* @file ipc.h
* @Author Michael Kosyakov and Evgeniy Ivanov (ifmo.distributedclass@gmail.com)
* @date March, 2014
* @brief A simple IPC library for programming assignments
*
* Students must not modify this file!
*/
#ifndef __IFMO_DISTRIBUTED_CLASS_IPC__H
#define __IFMO_DISTRIBUTED_CLASS_IPC__H
#include <stddef.h>
#include <stdint.h>
//------------------------------------------------------------------------------
typedef int8_t local_id;
typedef int16_t timestamp_t;
enum {
MESSAGE_MAGIC = 0xAFAF,
MAX_MESSAGE_LEN = 4096,
PARENT_ID = 0,
MAX_PROCESS_ID = 15
};
typedef enum {
STARTED = 0, ///< message with string (doesn't include trailing '\0')
DONE, ///< message with string (doesn't include trailing '\0')
ACK, ///< empty message
STOP, ///< empty message
TRANSFER, ///< message with TransferOrder
BALANCE_HISTORY, ///< message with BalanceHistory
CS_REQUEST, ///< empty message
CS_REPLY, ///< empty message
CS_RELEASE ///< empty message
} MessageType;
typedef struct {
uint16_t s_magic; ///< magic signature, must be MESSAGE_MAGIC
uint16_t s_payload_len; ///< length of payload
int16_t s_type; ///< type of the message
timestamp_t s_local_time; ///< set by sender, depends on particular PA:
///< physical time in PA2 or Lamport's scalar
///< time in PA3
} __attribute__((packed)) MessageHeader;
enum {
MAX_PAYLOAD_LEN = MAX_MESSAGE_LEN - sizeof(MessageHeader)
};
typedef struct {
MessageHeader s_header;
char s_payload[MAX_PAYLOAD_LEN]; ///< Must be used as a buffer, unused "tail"
///< shouldn't be transfered
} __attribute__((packed)) Message;
//------------------------------------------------------------------------------
/** Send a message to the process specified by id.
*
* @param self Any data structure implemented by students to perform I/O
* @param dst ID of recepient
* @param msg Message to send
*
* @return 0 on success, any non-zero value on error
*/
int send(void * self, local_id dst, const Message * msg);
//------------------------------------------------------------------------------
/** Send multicast message.
*
* Send msg to all other processes including parrent.
* Should stop on the first error.
*
* @param self Any data structure implemented by students to perform I/O
* @param msg Message to multicast.
*
* @return 0 on success, any non-zero value on error
*/
int send_multicast(void * self, const Message * msg);
//------------------------------------------------------------------------------
/** Receive a message from the process specified by id.
*
* Might block depending on IPC settings.
*
* @param self Any data structure implemented by students to perform I/O
* @param from ID of the process to receive message from
* @param msg Message structure allocated by the caller
*
* @return 0 on success, any non-zero value on error
*/
int receive(void * self, local_id from, Message * msg);
//------------------------------------------------------------------------------
/** Receive a message from any process.
*
* Receive a message from any process, in case of blocking I/O should be used
* with extra care to avoid deadlocks.
*
* @param self Any data structure implemented by students to perform I/O
* @param msg Message structure allocated by the caller
*
* @return 0 on success, any non-zero value on error
*/
int receive_any(void * self, Message * msg);
//------------------------------------------------------------------------------
#endif // __IFMO_DISTRIBUTED_CLASS_IPC__H