34 #define GRN_IO_FILE_SIZE 1073741824UL
36 #define GRN_IO_FILE_SIZE 134217728L
38 #define GRN_IO_COPY grn_io_rdonly
39 #define GRN_IO_UPDATE grn_io_wronly
41 #define GRN_IO_FILE_SIZE 1073741824UL
42 #define GRN_IO_COPY grn_io_rdwr
43 #define GRN_IO_UPDATE grn_io_rdwr
75 #if defined(WIN32) && defined(WIN32_FMO_EACH)
84 #if defined(WIN32) && defined(WIN32_FMO_EACH)
125 uint32_t header_size, uint32_t segment_size,
158 uint32_t key, uint32_t segment, uint32_t offset,
159 void **value, uint32_t *value_len);
161 uint32_t key, uint32_t segment, uint32_t offset,
162 void *value, uint32_t value_len);
165 uint32_t segment, uint32_t offset, uint32_t value_len);
167 #define GRN_TABLE_ADD (0x01<<6)
168 #define GRN_TABLE_ADDED (0x01<<7)
170 #define GRN_IO_MAX_RETRY (0x10000)
171 #define GRN_IO_MAX_REF (0x80000000)
173 #define GRN_IO_EXPIRE_GTICK (0x01)
174 #define GRN_IO_EXPIRE_SEGMENT (0x02)
175 #define GRN_IO_TEMPORARY (0x04)
184 #define GRN_IO_SEG_REF(io,segno,addr) do {\
185 grn_io_mapinfo *info = &(io)->maps[segno];\
186 uint32_t nref, retry, *pnref = &info->nref;\
187 if (io->flags & GRN_IO_EXPIRE_SEGMENT) {\
188 if (io->flags & GRN_IO_EXPIRE_GTICK) {\
189 for (retry = 0; !info->map || info->count != grn_gtick; retry++) {\
190 GRN_ATOMIC_ADD_EX(pnref, 1, nref);\
192 GRN_ATOMIC_ADD_EX(pnref, -1, nref);\
193 if (retry >= GRN_IO_MAX_RETRY) {\
194 GRN_LOG(ctx, GRN_LOG_CRIT, "deadlock detected! in GRN_IO_SEG_REF(%p, %u)", io, segno);\
197 GRN_FUTEX_WAIT(pnref);\
199 info->count = grn_gtick;\
201 grn_io_seg_map_(ctx, io, segno, info);\
203 GRN_LOG(ctx, GRN_LOG_CRIT,\
204 "mmap failed! in GRN_IO_SEG_REF(%p, %u): %s",\
205 io, segno, grn_current_error_message());\
208 GRN_ATOMIC_ADD_EX(pnref, -1, nref);\
209 GRN_FUTEX_WAKE(pnref);\
214 for (retry = 0;; retry++) {\
215 GRN_ATOMIC_ADD_EX(pnref, 1, nref);\
216 if (nref >= GRN_IO_MAX_REF) {\
217 GRN_ATOMIC_ADD_EX(pnref, -1, nref);\
218 if (retry >= GRN_IO_MAX_RETRY) {\
219 GRN_LOG(ctx, GRN_LOG_CRIT, "deadlock detected!! in GRN_IO_SEG_REF(%p, %u, %u)", io, segno, nref);\
223 GRN_FUTEX_WAIT(pnref);\
226 if (nref >= 0x40000000) {\
227 ALERT("strange nref value!! in GRN_IO_SEG_REF(%p, %u, %u)", io, segno, nref); \
231 GRN_ATOMIC_ADD_EX(pnref, -1, nref);\
232 if (retry >= GRN_IO_MAX_RETRY) {\
233 GRN_LOG(ctx, GRN_LOG_CRIT, "deadlock detected!!! in GRN_IO_SEG_REF(%p, %u, %u)", io, segno, nref);\
236 GRN_FUTEX_WAIT(pnref);\
239 grn_io_seg_map_(ctx, io, segno, info);\
241 GRN_ATOMIC_ADD_EX(pnref, -1, nref);\
242 GRN_LOG(ctx, GRN_LOG_CRIT,\
243 "mmap failed!!! in GRN_IO_SEG_REF(%p, %u, %u): %s",\
244 io, segno, nref, grn_current_error_message());\
247 GRN_FUTEX_WAKE(pnref);\
252 info->count = grn_gtick;\
255 for (retry = 0; !info->map; retry++) {\
256 GRN_ATOMIC_ADD_EX(pnref, 1, nref);\
258 GRN_ATOMIC_ADD_EX(pnref, -1, nref);\
259 if (retry >= GRN_IO_MAX_RETRY) {\
260 GRN_LOG(ctx, GRN_LOG_CRIT, "deadlock detected!!!! in GRN_IO_SEG_REF(%p, %u)", io, segno);\
263 GRN_FUTEX_WAIT(pnref);\
266 grn_io_seg_map_(ctx, io, segno, info);\
268 GRN_LOG(ctx, GRN_LOG_CRIT,\
269 "mmap failed!!!! in GRN_IO_SEG_REF(%p, %u): %s",\
270 io, segno, grn_current_error_message());\
273 GRN_ATOMIC_ADD_EX(pnref, -1, nref);\
274 GRN_FUTEX_WAKE(pnref);\
278 info->count = grn_gtick;\
283 #define GRN_IO_SEG_UNREF(io,segno) do {\
284 if (GRN_IO_EXPIRE_SEGMENT ==\
285 (io->flags & (GRN_IO_EXPIRE_GTICK|GRN_IO_EXPIRE_SEGMENT))) {\
286 uint32_t nref, *pnref = &(io)->maps[segno].nref;\
287 GRN_ATOMIC_ADD_EX(pnref, -1, nref);\
317 uint32_t lseg,
int *flags,
void **p);
324 #define GRN_IO_ARRAY_AT(io,array,offset,flags,res) do {\
325 grn_io_array_info *ainfo = &(io)->ainfo[array];\
326 uint32_t lseg = (offset) >> ainfo->w_of_elm_in_a_segment;\
327 void **p_ = &ainfo->addrs[lseg];\
329 grn_io_segment_alloc(ctx, (io), ainfo, lseg, (flags), p_);\
330 if (!*p_) { (res) = NULL; break; }\
332 *((byte **)(&(res))) = (((byte *)*p_) + \
333 (((offset) & ainfo->elm_mask_in_a_segment) * ainfo->element_size));\
336 #define GRN_IO_ARRAY_BIT_AT(io,array,offset,res) do {\
339 GRN_IO_ARRAY_AT((io), (array), ((offset) >> 3) + 1, &flags_, ptr_);\
340 res = ptr_ ? ((*ptr_ >> ((offset) & 7)) & 1) : 0;\
343 #define GRN_IO_ARRAY_BIT_ON(io,array,offset) do {\
345 int flags_ = GRN_TABLE_ADD;\
346 GRN_IO_ARRAY_AT((io), (array), ((offset) >> 3) + 1, &flags_, ptr_);\
347 if (ptr_) { *ptr_ |= (1 << ((offset) & 7)); }\
350 #define GRN_IO_ARRAY_BIT_OFF(io,array,offset) do {\
352 int flags_ = GRN_TABLE_ADD;\
353 GRN_IO_ARRAY_AT((io), (array), ((offset) >> 3) + 1, &flags_, ptr_);\
354 if (ptr_) { *ptr_ &= ~(1 << ((offset) & 7)); }\
357 #define GRN_IO_ARRAY_BIT_FLIP(io,array,offset) do {\
359 int flags_ = GRN_TABLE_ADD;\
360 GRN_IO_ARRAY_AT((io), (array), ((offset) >> 3) + 1, &flags_, ptr_);\
361 if (ptr_) { *ptr_ ^= (1 << ((offset) & 7)); }\
378 #define GRN_B_ENC(v,p) do {\
379 uint8_t *_p = (uint8_t *)p; \
383 } else if (_v < 0x408f) { \
385 *_p++ = 0xc0 + (_v >> 8); \
387 } else if (_v < 0x20408f) { \
389 *_p++ = 0xa0 + (_v >> 16); \
390 *_p++ = (_v >> 8) & 0xff; \
392 } else if (_v < 0x1020408f) { \
394 *_p++ = 0x90 + (_v >> 24); \
395 *_p++ = (_v >> 16) & 0xff; \
396 *_p++ = (_v >> 8) & 0xff; \
400 memcpy(_p, &_v, sizeof(uint32_t));\
401 _p += sizeof(uint32_t); \
406 #define GRN_B_ENC_SIZE(v) \
407 ((v) < 0x8f ? 1 : ((v) < 0x408f ? 2 : ((v) < 0x20408f ? 3 : ((v) < 0x1020408f ? 4 : 5))))
409 #define GRN_B_DEC(v,p) do { \
410 uint8_t *_p = (uint8_t *)p; \
411 uint32_t _v = *_p++; \
415 memcpy(&_v, _p, sizeof(uint32_t));\
416 _p += sizeof(uint32_t); \
420 _v = (_v - 0x90) * 0x100 + *_p++; \
421 _v = _v * 0x100 + *_p++; \
422 _v = _v * 0x100 + *_p++ + 0x20408f; \
426 _v = (_v - 0xa0) * 0x100 + *_p++; \
427 _v = _v * 0x100 + *_p++ + 0x408f; \
433 _v = (_v - 0xc0) * 0x100 + *_p++ + 0x8f; \
440 #define GRN_B_SKIP(p) do { \
441 uint8_t *_p = (uint8_t *)p; \
442 uint32_t _v = *_p++; \
446 _p += sizeof(uint32_t); \
466 #define GRN_B_COPY(p2,p1) do { \
467 uint32_t size = 0, _v = *p1++; \
471 size = (_v == 0x8f) ? 4 : 0; \
487 while (size--) { *p2++ = *p1++; } \