summaryrefslogtreecommitdiff
path: root/include/dlt/dlt_shm.h
blob: 0c6ee4229baf6c1b2bf3fcc91a20609383fed548 (plain)
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
/*
 * SPDX license identifier: MPL-2.0
 *
 * Copyright (C) 2011-2015, BMW AG
 *
 * This file is part of GENIVI Project DLT - Diagnostic Log and Trace.
 *
 * This Source Code Form is subject to the terms of the
 * Mozilla Public License (MPL), v. 2.0.
 * If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * For further information see http://www.genivi.org/.
 */

/*!
 * \author Alexander Wenzel <alexander.aw.wenzel@bmw.de>
 *
 * \copyright Copyright © 2011-2015 BMW AG. \n
 * License MPL-2.0: Mozilla Public License version 2.0 http://mozilla.org/MPL/2.0/.
 *
 * \file dlt_shm.h
 */


/*******************************************************************************
**                                                                            **
**  SRC-MODULE: dlt_shm.h                                                     **
**                                                                            **
**  TARGET    : linux                                                         **
**                                                                            **
**  PROJECT   : DLT                                                           **
**                                                                            **
**  AUTHOR    : Alexander Wenzel Alexander.AW.Wenzel@bmw.de                   **
**                                                                            **
**  PURPOSE   :                                                               **
**                                                                            **
**  REMARKS   :                                                               **
**                                                                            **
**  PLATFORM DEPENDANT [yes/no]: yes                                          **
**                                                                            **
**  TO BE CHANGED BY USER [yes/no]: no                                        **
**                                                                            **
*******************************************************************************/

/*******************************************************************************
**                      Author Identity                                       **
********************************************************************************
**                                                                            **
** Initials     Name                       Company                            **
** --------     -------------------------  ---------------------------------- **
**  aw          Alexander Wenzel           BMW                                **
*******************************************************************************/

#ifndef DLT_SHM_H
#define DLT_SHM_H

#include <semaphore.h>
#include "dlt_common.h"

/**
 * Default size of shared memory.
 * size is extended during creation to fit segment size.
 * client retrieves real size from file descriptor of shared memory.
 */
#define DLT_SHM_SIZE   100000

typedef struct
{
    int shmfd;         /* file descriptor of shared memory */
    sem_t *sem;        /* pointer to semaphore */
    DltBuffer buffer;
} DltShm;

typedef struct
{
    char head[4];
    unsigned char status;
    int size;
} DltShmBlockHead;

#define DLT_SHM_SEM_GET(id) sem_wait(id)
#define DLT_SHM_SEM_FREE(id) sem_post(id)

/**
 * Initialise the shared memory on the client side.
 * This function must be called before using further shm functions.
 * @param buf pointer to shm structure
 * @param name the name of the shm, must be the same for server and client
 * @return negative value if there was an error
 */
extern DltReturnValue dlt_shm_init_client(DltShm *buf, const char *name);

/**
 * Initialise the shared memory on the server side.
 * This function must be called before using further shm functions.
 * @param buf pointer to shm structure
 * @param name the name of the shm, must be the same for server and client
 * @param size the requested size of the shm
 * @return negative value if there was an error
 */
extern DltReturnValue dlt_shm_init_server(DltShm *buf, const char *name, int size);

/**
 * Push data from client onto the shm.
 * @param buf pointer to shm structure
 * @param data1 pointer to first data block to be written, null if not used
 * @param size1 size in bytes of first data block to be written, 0 if not used
 * @param data2 pointer to second data block to be written, null if not used
 * @param size2 size in bytes of second data block to be written, 0 if not used
 * @param data3 pointer to third data block to be written, null if not used
 * @param size3 size in bytes of third data block to be written, 0 if not used
 * @return negative value if there was an error
 */
extern int dlt_shm_push(DltShm *buf,
                        const unsigned char *data1,
                        unsigned int size1,
                        const unsigned char *data2,
                        unsigned int size2,
                        const unsigned char *data3,
                        unsigned int size3);

/**
 * Pull data from shm.
 * This function should be called from client.
 * Data is deleted from shm after this call.
 * @param buf pointer to shm structure
 * @param data pointer to buffer where data is to be written
 * @param size maximum size to be written into buffer
 * @return negative value if there was an error
 */
extern int dlt_shm_pull(DltShm *buf, unsigned char *data, int size);

/**
 * Copy message from shm.
 * This function should be called from server.
 * Data is not deleted from shm after this call.
 * @param buf pointer to shm structure
 * @param data pointer to buffer where data is to be written
 * @param size maximum size to be written into buffer
 * @return negative value if there was an error
 */
extern int dlt_shm_copy(DltShm *buf, unsigned char *data, int size);

/**
 * Delete message from shm.
 * This function should be called from server.
 * This function should be called after each succesful copy.
 * @param buf pointer to shm structure
 * @return negative value if there was an error
 */
extern int dlt_shm_remove(DltShm *buf);

/**
 * Print information about shm.
 * @param buf pointer to shm structure
 */
extern void dlt_shm_info(DltShm *buf);

/**
 * Print status about shm.
 * @param buf pointer to shm structure
 */
extern void dlt_shm_status(DltShm *buf);

/**
 * Deinitialise the shared memory on the client side.
 * @param buf pointer to shm structure
 * @return negative value if there was an error
 */
extern DltReturnValue dlt_shm_free_client(DltShm *buf);

/**
 * Returns the total size of the shm.
 * @param buf pointer to shm structure
 * @return size of the shared memory.
 */
extern int dlt_shm_get_total_size(DltShm *buf);

/**
 * Returns the used size in the shm.
 * @param buf pointer to shm structure
 * @return size of the shared memory.
 */
extern int dlt_shm_get_used_size(DltShm *buf);

/**
 * Returns the number of messages in the shm.
 * @param buf pointer to shm structure
 * @return size of the shared memory.
 */
extern int dlt_shm_get_message_count(DltShm *buf);

/**
 * Reset pointers and counters when shm corrupted.
 * @param buf pointer to shm structure
 * @return size of the shared memory.
 */
extern int dlt_shm_reset(DltShm *buf);

/**
 * Recover to find next valid message.
 * @param buf pointer to shm structure
 * @return size of the shared memory.
 */
extern int dlt_shm_recover(DltShm *buf);

/**
 * Deinitialise the shared memory on the server side.
 * @param buf pointer to shm structure
 * @param name name of the shared memory
 * @return negative value if there was an error
 */
extern DltReturnValue dlt_shm_free_server(DltShm *buf, const char *name);

#endif /* DLT_SHM_H */