GCS  0.2.3
gcs_defrag.h
1 /*
2  * Copyright (C) 2008 Codership Oy <info@codership.com>
3  *
4  * $Id: gcs_defrag.h 2383 2011-09-24 11:14:06Z alex $
5  */
6 
11 #ifndef _gcs_defrag_h_
12 #define _gcs_defrag_h_
13 
14 #include <string.h> // for memset()
15 #include <stdbool.h>
16 #include <galerautils.h>
17 
18 #include "gcs.h" // for gcs_seqno_t et al.
19 #include "gcs_act_proto.h"
20 #include "gcs_act.h"
21 #include "gcs_gcache.h"
22 
23 #include <gcache.h>
24 
25 typedef struct gcs_defrag
26 {
27  gcache_t* cache;
28  gcs_seqno_t sent_id; // sent id (unique for a node)
29  uint8_t* head; // head of action buffer
30  uint8_t* tail; // tail of action data
31  size_t size;
32  size_t received;
33  ulong frag_no; // number of fragment received
34  bool reset;
35 }
37 
38 static inline void
39 gcs_defrag_init (gcs_defrag_t* df, gcache_t* cache)
40 {
41  memset (df, 0, sizeof (*df));
42  df->cache = cache;
43  df->sent_id = GCS_SEQNO_ILL;
44 }
45 
53 extern ssize_t
54 gcs_defrag_handle_frag (gcs_defrag_t* df,
55  const gcs_act_frag_t* frg,
56  struct gcs_act* act,
57  bool local);
58 
60 static inline void
61 gcs_defrag_forget (gcs_defrag_t* df)
62 {
63  gcs_defrag_init (df, df->cache);
64 }
65 
67 static inline void
68 gcs_defrag_free (gcs_defrag_t* df)
69 {
70 #ifndef GCS_FOR_GARB
71  if (df->head) {
72  gcs_gcache_free (df->cache, df->head);
73  // df->head, df->tail will be zeroed in gcs_defrag_init() below
74  }
75 #else
76  assert(NULL == df->head);
77 #endif
78 
79  gcs_defrag_init (df, df->cache);
80 }
81 
83 static inline void
84 gcs_defrag_reset (gcs_defrag_t* df)
85 {
86  df->reset = true;
87 }
88 
89 #endif /* _gcs_defrag_h_ */
Definition: gcs_defrag.h:25
Definition: gcs_act_proto.h:24
Definition: gcs_act.h:12