~ubuntu-branches/ubuntu/raring/simgrid/raring

« back to all changes in this revision

Viewing changes to src/xbt/swag.c

  • Committer: Package Import Robot
  • Author(s): Lucas Nussbaum
  • Date: 2012-05-24 16:08:59 UTC
  • mfrom: (10.1.2 sid)
  • Revision ID: package-import@ubuntu.com-20120524160859-vhdlh05p313l5662
Tags: 3.7-1
* New upstream release.
* Bump Standards-Version to 3.9.3. No changes needed.
* debian/rules: Enable the SMPI library in the package. Closes: #656102.
* Build with -O2 on ia64. Closes: #640538.
* Use dpkg-buildflags to generate CFLAGS and LDFLAGS. Enable hardening.

Show diffs side-by-side

added added

removed removed

Lines of Context:
65
65
 */
66
66
XBT_INLINE void xbt_swag_insert_at_head(void *obj, xbt_swag_t swag)
67
67
{
68
 
 
69
 
  if (xbt_swag_belongs(obj, swag))
70
 
    return;
71
 
 
72
 
  (swag->count)++;
73
 
  if (swag->head == NULL) {
 
68
  xbt_assert(!xbt_swag_belongs(obj, swag) || swag->tail,
 
69
      "This object belongs to an empty swag! Did you correctly initialize the object's hookup?");
 
70
 
 
71
  if (!swag->head) {
74
72
    xbt_assert(!(swag->tail), "Inconsistent swag.");
75
73
    swag->head = obj;
76
74
    swag->tail = obj;
77
 
    return;
78
 
  }
79
 
 
80
 
  xbt_swag_getNext(obj, swag->offset) = swag->head;
81
 
  xbt_swag_getPrev(swag->head, swag->offset) = obj;
82
 
  swag->head = obj;
 
75
    swag->count++;
 
76
  }
 
77
  else if (obj != swag->head && !xbt_swag_getPrev(obj, swag->offset)) {
 
78
    xbt_swag_getNext(obj, swag->offset) = swag->head;
 
79
    xbt_swag_getPrev(swag->head, swag->offset) = obj;
 
80
    swag->head = obj;
 
81
    swag->count++;
 
82
  }
83
83
}
84
84
 
85
85
/**
91
91
 */
92
92
XBT_INLINE void xbt_swag_insert_at_tail(void *obj, xbt_swag_t swag)
93
93
{
94
 
 
95
 
  if (xbt_swag_belongs(obj, swag))
96
 
    return;
97
 
 
98
 
  (swag->count)++;
99
 
  if (swag->head == NULL) {
 
94
  xbt_assert(!xbt_swag_belongs(obj, swag) || swag->tail,
 
95
      "This object belongs to an empty swag! Did you correctly initialize the object's hookup?");
 
96
 
 
97
  if (!swag->head) {
100
98
    xbt_assert(!(swag->tail), "Inconsistent swag.");
101
99
    swag->head = obj;
102
100
    swag->tail = obj;
103
 
    return;
104
 
  }
105
 
 
106
 
  xbt_swag_getPrev(obj, swag->offset) = swag->tail;
107
 
  xbt_swag_getNext(swag->tail, swag->offset) = obj;
108
 
  swag->tail = obj;
 
101
    swag->count++;
 
102
  }
 
103
  else if (obj != swag->tail && !xbt_swag_getNext(obj, swag->offset)) {
 
104
    xbt_swag_getPrev(obj, swag->offset) = swag->tail;
 
105
    xbt_swag_getNext(swag->tail, swag->offset) = obj;
 
106
    swag->tail = obj;
 
107
    swag->count++;
 
108
  }
109
109
}
110
110
 
111
111
/**
117
117
 */
118
118
XBT_INLINE void *xbt_swag_remove(void *obj, xbt_swag_t swag)
119
119
{
 
120
  if (!obj)
 
121
    return NULL;
 
122
 
120
123
  size_t offset = swag->offset;
121
 
 
122
 
  if ((!obj) || (!swag))
123
 
    return NULL;
124
 
  if (!xbt_swag_belongs(obj, swag))     /* Trying to remove an object that
125
 
                                           was not in this swag */
126
 
    return NULL;
127
 
 
128
 
  if (swag->head == swag->tail) {       /* special case */
129
 
    if (swag->head != obj)      /* Trying to remove an object that was not in this swag */
130
 
      return NULL;
131
 
    swag->head = NULL;
132
 
    swag->tail = NULL;
133
 
    xbt_swag_getNext(obj, offset) = xbt_swag_getPrev(obj, offset) = NULL;
134
 
  } else if (obj == swag->head) {       /* It's the head */
135
 
    swag->head = xbt_swag_getNext(obj, offset);
136
 
    xbt_swag_getPrev(swag->head, offset) = NULL;
137
 
    xbt_swag_getNext(obj, offset) = NULL;
138
 
  } else if (obj == swag->tail) {       /* It's the tail */
139
 
    swag->tail = xbt_swag_getPrev(obj, offset);
140
 
    xbt_swag_getNext(swag->tail, offset) = NULL;
 
124
  void* prev = xbt_swag_getPrev(obj, offset);
 
125
  void* next = xbt_swag_getNext(obj, offset);
 
126
 
 
127
  if (prev) {
 
128
    xbt_swag_getNext(prev, offset) = next;
141
129
    xbt_swag_getPrev(obj, offset) = NULL;
142
 
  } else {                      /* It's in the middle */
143
 
    xbt_swag_getNext(xbt_swag_getPrev(obj, offset), offset) =
144
 
        xbt_swag_getNext(obj, offset);
145
 
    xbt_swag_getPrev(xbt_swag_getNext(obj, offset), offset) =
146
 
        xbt_swag_getPrev(obj, offset);
147
 
    xbt_swag_getPrev(obj, offset) = xbt_swag_getNext(obj, offset) = NULL;
148
 
  }
149
 
  (swag->count)--;
 
130
    if (next) {
 
131
      xbt_swag_getPrev(next, offset) = prev;
 
132
      xbt_swag_getNext(obj, offset) = NULL;
 
133
    }
 
134
    else {
 
135
      swag->tail = prev;
 
136
    }
 
137
    swag->count--;
 
138
  }
 
139
  else if (next) {
 
140
    xbt_swag_getPrev(next, offset) = NULL;
 
141
    xbt_swag_getNext(obj, offset) = NULL;
 
142
    swag->head = next;
 
143
    swag->count--;
 
144
  }
 
145
  else if (obj == swag->head) {
 
146
    swag->head = swag->tail = NULL;
 
147
    swag->count--;
 
148
  }
 
149
 
150
150
  return obj;
151
151
}
152
152
 
156
156
 */
157
157
void *xbt_swag_extract(xbt_swag_t swag)
158
158
{
 
159
  if (!swag->head)
 
160
    return NULL;
 
161
 
159
162
  size_t offset = swag->offset;
160
 
  void *obj = NULL;
161
 
 
162
 
  if ((!swag) || (!(swag->head)))
163
 
    return NULL;
164
 
 
165
 
  obj = swag->head;
166
 
 
167
 
  if (swag->head == swag->tail) {       /* special case */
 
163
  void* obj = swag->head;
 
164
 
 
165
  if (obj == swag->tail) {       /* special case */
168
166
    swag->head = swag->tail = NULL;
169
 
    xbt_swag_getPrev(obj, offset) = xbt_swag_getNext(obj, offset) = NULL;
170
167
  } else {
171
168
    swag->head = xbt_swag_getNext(obj, offset);
172
169
    xbt_swag_getPrev(swag->head, offset) = NULL;