31 #define GRN_BREAK_POINT raise(SIGTRAP)
34 #ifdef HAVE_EXECINFO_H
48 #define GRN_API_ENTER do {\
49 if ((ctx)->seqno & 1) {\
52 (ctx)->errlvl = GRN_OK;\
53 (ctx)->rc = GRN_SUCCESS;\
60 #define GRN_API_RETURN(r) do {\
72 #define GRN_OP_T0LVL 0
75 #define GRN_EMERG GRN_LOG_EMERG
76 #define GRN_ALERT GRN_LOG_ALERT
77 #define GRN_CRIT GRN_LOG_CRIT
78 #define GRN_ERROR GRN_LOG_ERROR
79 #define GRN_WARN GRN_LOG_WARNING
80 #define GRN_OK GRN_LOG_NOTICE
82 #define ERRCLR(ctx) do {\
84 ((grn_ctx *)ctx)->errlvl = GRN_OK;\
85 ((grn_ctx *)ctx)->rc = GRN_SUCCESS;\
88 grn_gctx.errlvl = GRN_OK;\
89 grn_gctx.rc = GRN_SUCCESS;\
93 #define BACKTRACE(ctx) ((ctx)->ntrace = (unsigned char)backtrace((ctx)->trace, 16))
95 #define BACKTRACE(ctx)
102 #ifdef HAVE_BACKTRACE
103 #define LOGTRACE(ctx,lvl) do {\
107 p = backtrace_symbols((ctx)->trace, (ctx)->ntrace);\
108 for (i = 0; i < (ctx)->ntrace; i++) {\
109 GRN_LOG((ctx), lvl, "%s", p[i]);\
114 #define LOGTRACE(ctx,msg)
117 #define ERRSET(ctx,lvl,r,...) do {\
118 grn_ctx *ctx_ = (grn_ctx *)ctx;\
119 ctx_->errlvl = (lvl);\
121 ctx_->errfile = __FILE__;\
122 ctx_->errline = __LINE__;\
123 ctx_->errfunc = __FUNCTION__;\
124 grn_ctx_impl_err(ctx);\
125 grn_ctx_log(ctx, __VA_ARGS__);\
126 if (grn_ctx_impl_should_log(ctx)) {\
127 grn_ctx_impl_set_current_error_message(ctx);\
128 GRN_LOG(ctx, lvl, __VA_ARGS__);\
130 if (lvl <= GRN_LOG_ERROR) { LOGTRACE(ctx, lvl); }\
134 #define ERRP(ctx,lvl) \
135 (((ctx) && ((grn_ctx *)(ctx))->errlvl <= (lvl)) || (grn_gctx.errlvl <= (lvl)))
137 #define QLERR(...) do {\
138 ERRSET(ctx, GRN_WARN, GRN_INVALID_ARGUMENT, __VA_ARGS__);\
142 #define QLASSERT(expr) do {\
143 if (!(expr)) { QLERR("syntax error"); }\
149 #define ERR(rc,...) ERRSET(ctx, GRN_ERROR, (rc), __VA_ARGS__)
150 #define WARN(rc,...) ERRSET(ctx, GRN_WARN, (rc), __VA_ARGS__)
151 #define MERR(...) ERRSET(ctx, GRN_ALERT, GRN_NO_MEMORY_AVAILABLE, __VA_ARGS__)
152 #define ALERT(...) ERRSET(ctx, GRN_ALERT, GRN_SUCCESS, __VA_ARGS__)
155 #define SERR(str) do {\
158 int e = WSAGetLastError();\
160 case WSANOTINITIALISED :\
161 rc = GRN_SOCKET_NOT_INITIALIZED;\
162 m = "please call grn_com_init first";\
165 rc = GRN_BAD_ADDRESS;\
169 rc = GRN_INVALID_ARGUMENT;\
170 m = "invalid argument";\
173 rc = GRN_TOO_MANY_OPEN_FILES;\
174 m = "too many sockets";\
176 case WSAEWOULDBLOCK :\
177 rc = GRN_OPERATION_WOULD_BLOCK;\
178 m = "operation would block";\
181 rc = GRN_NOT_SOCKET;\
182 m = "given fd is not socket fd";\
184 case WSAEOPNOTSUPP :\
185 rc = GRN_OPERATION_NOT_SUPPORTED;\
186 m = "operation is not supported";\
188 case WSAEADDRINUSE :\
189 rc = GRN_ADDRESS_IS_IN_USE;\
190 m = "address is already in use";\
192 case WSAEADDRNOTAVAIL :\
193 rc = GRN_ADDRESS_IS_NOT_AVAILABLE;\
194 m = "address is not available";\
197 rc = GRN_NETWORK_IS_DOWN;\
198 m = "network is down";\
205 rc = GRN_SOCKET_IS_ALREADY_CONNECTED;\
206 m = "socket is already connected";\
209 rc = GRN_SOCKET_IS_NOT_CONNECTED;\
210 m = "socket is not connected";\
213 rc = GRN_SOCKET_IS_ALREADY_SHUTDOWNED;\
214 m = "socket is already shutdowned";\
217 rc = GRN_OPERATION_TIMEOUT;\
218 m = "connection time out";\
220 case WSAECONNREFUSED :\
221 rc = GRN_CONNECTION_REFUSED;\
222 m = "connection refused";\
225 rc = GRN_INTERRUPTED_FUNCTION_CALL;\
226 m = "interrupted function call";\
229 rc = GRN_UNKNOWN_ERROR;\
230 m = "unknown error";\
233 ERR(rc, "syscall error '%s' (%s)", str, m);\
236 #define SERR(str) do {\
239 case ELOOP : rc = GRN_TOO_MANY_SYMBOLIC_LINKS; break;\
240 case ENAMETOOLONG : rc = GRN_FILENAME_TOO_LONG; break;\
241 case ENOENT : rc = GRN_NO_SUCH_FILE_OR_DIRECTORY; break;\
242 case ENOMEM : rc = GRN_NO_MEMORY_AVAILABLE; break;\
243 case ENOTDIR : rc = GRN_NOT_A_DIRECTORY; break;\
244 case EPERM : rc = GRN_OPERATION_NOT_PERMITTED; break;\
245 case ESRCH : rc = GRN_NO_SUCH_PROCESS; break;\
246 case EINTR : rc = GRN_INTERRUPTED_FUNCTION_CALL; break;\
247 case EIO : rc = GRN_INPUT_OUTPUT_ERROR; break;\
248 case ENXIO : rc = GRN_NO_SUCH_DEVICE_OR_ADDRESS; break;\
249 case E2BIG : rc = GRN_ARG_LIST_TOO_LONG; break;\
250 case ENOEXEC : rc = GRN_EXEC_FORMAT_ERROR; break;\
251 case EBADF : rc = GRN_BAD_FILE_DESCRIPTOR; break;\
252 case ECHILD : rc = GRN_NO_CHILD_PROCESSES; break;\
253 case EACCES : rc = GRN_PERMISSION_DENIED; break;\
254 case EFAULT : rc = GRN_BAD_ADDRESS; break;\
255 case EBUSY : rc = GRN_RESOURCE_BUSY; break;\
256 case EEXIST : rc = GRN_FILE_EXISTS; break;\
257 case ENODEV : rc = GRN_NO_SUCH_DEVICE; break;\
258 case EISDIR : rc = GRN_IS_A_DIRECTORY; break;\
259 case EINVAL : rc = GRN_INVALID_ARGUMENT; break;\
260 case EMFILE : rc = GRN_TOO_MANY_OPEN_FILES; break;\
261 case EFBIG : rc = GRN_FILE_TOO_LARGE; break;\
262 case ENOSPC : rc = GRN_NO_SPACE_LEFT_ON_DEVICE; break;\
263 case EROFS : rc = GRN_READ_ONLY_FILE_SYSTEM; break;\
264 case EMLINK : rc = GRN_TOO_MANY_LINKS; break;\
265 case EPIPE : rc = GRN_BROKEN_PIPE; break;\
266 case EDOM : rc = GRN_DOMAIN_ERROR; break;\
267 case ERANGE : rc = GRN_RANGE_ERROR; break;\
268 case ENOTSOCK : rc = GRN_NOT_SOCKET; break;\
269 case EADDRINUSE : rc = GRN_ADDRESS_IS_IN_USE; break;\
270 case ENETDOWN : rc = GRN_NETWORK_IS_DOWN; break;\
271 case ENOBUFS : rc = GRN_NO_BUFFER; break;\
272 case EISCONN : rc = GRN_SOCKET_IS_ALREADY_CONNECTED; break;\
273 case ENOTCONN : rc = GRN_SOCKET_IS_NOT_CONNECTED; break;\
279 case EPROTONOSUPPORT : rc = GRN_OPERATION_NOT_SUPPORTED; break;\
280 case ESHUTDOWN : rc = GRN_SOCKET_IS_ALREADY_SHUTDOWNED; break;\
281 case ETIMEDOUT : rc = GRN_OPERATION_TIMEOUT; break;\
282 case ECONNREFUSED: rc = GRN_CONNECTION_REFUSED; break;\
283 case EAGAIN: rc = GRN_OPERATION_WOULD_BLOCK; break;\
284 default : rc = GRN_UNKNOWN_ERROR; break;\
286 ERR(rc, "syscall error '%s' (%s)", str, strerror(errno));\
290 #define GERR(rc,...) ERRSET(&grn_gctx, GRN_ERROR, (rc), __VA_ARGS__)
291 #define GMERR(...) ERRSET(&grn_gctx, GRN_ALERT, GRN_NO_MEMORY_AVAILABLE, __VA_ARGS__)
293 #define GRN_MALLOC(s) grn_malloc(ctx,s,__FILE__,__LINE__,__FUNCTION__)
294 #define GRN_CALLOC(s) grn_calloc(ctx,s,__FILE__,__LINE__,__FUNCTION__)
295 #define GRN_REALLOC(p,s) grn_realloc(ctx,p,s,__FILE__,__LINE__,__FUNCTION__)
296 #define GRN_STRDUP(s) grn_strdup(ctx,s,__FILE__,__LINE__,__FUNCTION__)
297 #define GRN_GMALLOC(s) grn_malloc(&grn_gctx,s,__FILE__,__LINE__,__FUNCTION__)
298 #define GRN_GCALLOC(s) grn_calloc(&grn_gctx,s,__FILE__,__LINE__,__FUNCTION__)
299 #define GRN_GREALLOC(p,s) grn_realloc(&grn_gctx,p,s,__FILE__,__LINE__,__FUNCTION__)
300 #define GRN_GSTRDUP(s) grn_strdup(&grn_gctx,s,__FILE__,__LINE__,__FUNCTION__)
301 #define GRN_FREE(p) grn_free(ctx,p,__FILE__,__LINE__,__FUNCTION__)
302 #define GRN_MALLOCN(t,n) ((t *)(GRN_MALLOC(sizeof(t) * (n))))
303 #define GRN_GFREE(p) grn_free(&grn_gctx,p,__FILE__,__LINE__,__FUNCTION__)
304 #define GRN_GMALLOCN(t,n) ((t *)(GRN_GMALLOC(sizeof(t) * (n))))
307 #define GRN_ASSERT(s) grn_assert(ctx,(s),__FILE__,__LINE__,__FUNCTION__)
309 #define GRN_ASSERT(s)
312 #define GRN_CTX_ALLOC(ctx,s) grn_ctx_calloc(ctx,s,__FILE__,__LINE__,__FUNCTION__)
313 #define GRN_CTX_FREE(ctx,p) grn_ctx_free(ctx,p,__FILE__,__LINE__,__FUNCTION__)
314 #define GRN_CTX_ALLOC_L(ctx,s) grn_ctx_alloc_lifo(ctx,s,f,__FILE__,__LINE__,__FUNCTION__)
315 #define GRN_CTX_FREE_L(ctx,p) grn_ctx_free_lifo(ctx,p,__FILE__,__LINE__,__FUNCTION__)
318 const char* file,
int line,
const char *func);
320 const char* file,
int line,
const char *func);
322 const char* file,
int line,
const char *func);
324 const char* file,
int line,
const char *func);
326 const char* file,
int line,
const char *func);
328 const char* file,
int line,
const char *func);
330 const char* file,
int line,
const char *func);
332 const char* file,
int line,
const char *func);
334 #ifdef USE_DYNAMIC_MALLOC_CHANGE
335 typedef void *(*grn_malloc_func) (
grn_ctx *ctx,
size_t size,
336 const char *file,
int line,
const char *func);
337 typedef void *(*grn_calloc_func) (
grn_ctx *ctx,
size_t size,
338 const char *file,
int line,
const char *func);
339 typedef void *(*grn_realloc_func) (
grn_ctx *ctx,
void *ptr,
size_t size,
340 const char *file,
int line,
const char *func);
341 typedef char *(*grn_strdup_func) (
grn_ctx *ctx,
const char *string,
342 const char *file,
int line,
const char *func);
343 grn_malloc_func grn_ctx_get_malloc(
grn_ctx *ctx);
344 void grn_ctx_set_malloc(
grn_ctx *ctx, grn_malloc_func malloc_func);
345 grn_calloc_func grn_ctx_get_calloc(
grn_ctx *ctx);
346 void grn_ctx_set_calloc(
grn_ctx *ctx, grn_calloc_func calloc_func);
347 grn_realloc_func grn_ctx_get_realloc(
grn_ctx *ctx);
348 void grn_ctx_set_realloc(
grn_ctx *ctx, grn_realloc_func realloc_func);
349 grn_strdup_func grn_ctx_get_strdup(
grn_ctx *ctx);
350 void grn_ctx_set_strdup(
grn_ctx *ctx, grn_strdup_func strdup_func);
352 void *
grn_malloc(
grn_ctx *ctx,
size_t size,
const char* file,
int line,
const char *func);
354 void *
grn_realloc(
grn_ctx *ctx,
void *ptr,
size_t size,
const char* file,
int line,
const char *func);
357 # define grn_malloc grn_malloc_default
358 # define grn_calloc grn_calloc_default
359 # define grn_realloc grn_realloc_default
360 # define grn_strdup grn_strdup_default
361 # define grn_free grn_free_default
370 #ifdef USE_FAIL_MALLOC
371 int grn_fail_malloc_check(
size_t size,
const char *file,
int line,
const char *func);
372 void *grn_malloc_fail(
grn_ctx *ctx,
size_t size,
const char* file,
int line,
const char *func);
373 void *grn_calloc_fail(
grn_ctx *ctx,
size_t size,
const char* file,
int line,
const char *func);
374 void *grn_realloc_fail(
grn_ctx *ctx,
void *ptr,
size_t size,
const char* file,
int line,
const char *func);
375 char *grn_strdup_fail(
grn_ctx *ctx,
const char *s,
const char* file,
int line,
const char *func);
387 #define GRN_CTX_ALLOCATED (0x80)
388 #define GRN_CTX_TEMPORARY_DISABLE_II_RESOLVE_SEL_AND (0x40)
397 #ifndef GRN_TIMEVAL_STR_SIZE
398 #define GRN_TIMEVAL_STR_SIZE 0x100
400 #ifndef GRN_TIMEVAL_STR_FORMAT
401 #define GRN_TIMEVAL_STR_FORMAT "%04d-%02d-%02d %02d:%02d:%02d.%06d"
403 #define GRN_TIME_NSEC_PER_SEC 1000000000
404 #define GRN_TIME_NSEC_PER_SEC_F 1000000000.0
405 #define GRN_TIME_NSEC_PER_USEC (GRN_TIME_NSEC_PER_SEC / GRN_TIME_USEC_PER_SEC)
406 #define GRN_TIME_NSEC_TO_USEC(nsec) ((nsec) / GRN_TIME_NSEC_PER_USEC)
407 #define GRN_TIME_USEC_TO_NSEC(usec) ((usec) * GRN_TIME_NSEC_PER_USEC)
429 #define GRN_OBJ_ALLOCATED (0x01<<2)
430 #define GRN_OBJ_EXPRVALUE (0x01<<3)
431 #define GRN_OBJ_EXPRCONST (0x01<<4)
445 uint32_t source_size;
446 uint32_t max_n_subrecs;
448 uint8_t subrec_offset;
454 #define GRN_DB_OBJ_SET_TYPE(db_obj,obj_type) do {\
455 (db_obj)->obj.header.type = (obj_type);\
456 (db_obj)->obj.header.impl_flags = 0;\
457 (db_obj)->obj.header.flags = 0;\
458 (db_obj)->obj.id = GRN_ID_NIL;\
459 (db_obj)->obj.user_data.ptr = NULL;\
460 (db_obj)->obj.finalizer = NULL;\
461 (db_obj)->obj.hooks[0] = NULL;\
462 (db_obj)->obj.hooks[1] = NULL;\
463 (db_obj)->obj.hooks[2] = NULL;\
464 (db_obj)->obj.hooks[3] = NULL;\
465 (db_obj)->obj.hooks[4] = NULL;\
466 (db_obj)->obj.source = NULL;\
467 (db_obj)->obj.source_size = 0;\
474 uint32_t max_nentries;
481 const char *str, uint32_t str_size);
483 const char *str, uint32_t str_size);
485 const char *str, uint32_t str_size,
grn_obj *value);