| 1 | /* |
| 2 | * This Source Code Form is subject to the terms of the Mozilla Public |
| 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this |
| 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
| 5 | * |
| 6 | * Copyright 1997 - July 2008 CWI, August 2008 - 2019 MonetDB B.V. |
| 7 | */ |
| 8 | |
| 9 | #ifndef _SQL_MEM_H_ |
| 10 | #define _SQL_MEM_H_ |
| 11 | |
| 12 | #include "gdk.h" |
| 13 | |
| 14 | #define SQL_OK 1 |
| 15 | #define SQL_ERR 0 |
| 16 | |
| 17 | #ifdef WIN32 |
| 18 | #if defined(LIBSQLSERVER) || defined(LIBSQLCOMMON) || defined(LIBBATSTORE) || defined(LIBSTORE) || defined(LIBSQL) |
| 19 | #define sql_export extern __declspec(dllexport) |
| 20 | #define sqlcommon_export extern __declspec(dllexport) |
| 21 | #define sqlbat_export extern __declspec(dllexport) |
| 22 | #define sqlstore_export extern __declspec(dllexport) |
| 23 | #else |
| 24 | #define sql_export extern __declspec(dllimport) |
| 25 | #define sqlcommon_export extern __declspec(dllimport) |
| 26 | #define sqlbat_export extern __declspec(dllimport) |
| 27 | #define sqlstore_export extern __declspec(dllimport) |
| 28 | #endif |
| 29 | #else |
| 30 | #define sql_export extern |
| 31 | #define sqlcommon_export extern |
| 32 | #define sqlbat_export extern |
| 33 | #define sqlstore_export extern |
| 34 | #endif |
| 35 | |
| 36 | #define MNEW( type ) (type*)GDKmalloc(sizeof(type) ) |
| 37 | #define ZNEW( type ) (type*)GDKzalloc(sizeof(type) ) |
| 38 | #define NEW_ARRAY( type, size ) (type*)GDKmalloc((size)*sizeof(type)) |
| 39 | #define RENEW_ARRAY( type,ptr,size) (type*)GDKrealloc((void*)ptr,(size)*sizeof(type)) |
| 40 | |
| 41 | #define NEWADT( size ) (adt*)GDKmalloc(size) |
| 42 | #define _DELETE( ptr ) do { GDKfree(ptr); ptr = NULL; } while (0) |
| 43 | #define _STRDUP( ptr ) GDKstrdup((char*)ptr) |
| 44 | |
| 45 | extern void c_delete( const void *p ); |
| 46 | |
| 47 | typedef struct sql_ref { |
| 48 | int refcnt; |
| 49 | } sql_ref; |
| 50 | |
| 51 | extern sql_ref *sql_ref_init(sql_ref *r); |
| 52 | extern int sql_ref_inc(sql_ref *r); |
| 53 | extern int sql_ref_dec(sql_ref *r); |
| 54 | |
| 55 | typedef struct sql_allocator { |
| 56 | size_t size; |
| 57 | size_t nr; |
| 58 | char **blks; |
| 59 | size_t used; /* memory used in last block */ |
| 60 | size_t usedmem; /* used memory */ |
| 61 | } sql_allocator; |
| 62 | |
| 63 | extern sql_allocator *sa_create(void); |
| 64 | extern sql_allocator *sa_reset( sql_allocator *sa ); |
| 65 | extern void *sa_alloc( sql_allocator *sa, size_t sz ); |
| 66 | extern void *sa_zalloc( sql_allocator *sa, size_t sz ); |
| 67 | extern void *sa_realloc( sql_allocator *sa, void *ptr, size_t sz, size_t osz ); |
| 68 | extern void sa_destroy( sql_allocator *sa ); |
| 69 | extern char *sa_strndup( sql_allocator *sa, const char *s, size_t l); |
| 70 | extern char *sa_strdup( sql_allocator *sa, const char *s); |
| 71 | extern char *sa_strconcat( sql_allocator *sa, const char *s1, const char *s2); |
| 72 | extern size_t sa_size( sql_allocator *sa ); |
| 73 | |
| 74 | #define SA_NEW( sa, type ) ((type*)sa_alloc( sa, sizeof(type)) ) |
| 75 | #define SA_ZNEW( sa, type ) ((type*)sa_zalloc( sa, sizeof(type)) ) |
| 76 | #define SA_NEW_ARRAY( sa, type, size ) (type*)sa_alloc( sa, ((size)*sizeof(type))) |
| 77 | #define SA_ZNEW_ARRAY( sa, type, size ) (type*)sa_zalloc( sa, ((size)*sizeof(type))) |
| 78 | #define SA_RENEW_ARRAY( sa, type, ptr, sz, osz ) (type*)sa_realloc( sa, ptr, ((sz)*sizeof(type)), ((osz)*sizeof(type))) |
| 79 | |
| 80 | #define _strlen(s) (int)strlen(s) |
| 81 | |
| 82 | #if !defined(NDEBUG) && !defined(STATIC_CODE_ANALYSIS) && defined(__GNUC__) |
| 83 | #define sa_alloc(sa, sz) \ |
| 84 | ({ \ |
| 85 | sql_allocator *_sa = (sa); \ |
| 86 | size_t _sz = (sz); \ |
| 87 | void *_res = sa_alloc(_sa, _sz); \ |
| 88 | ALLOCDEBUG \ |
| 89 | fprintf(stderr, \ |
| 90 | "#sa_alloc(%p,%zu) -> %p" \ |
| 91 | " %s[%s:%d]\n", \ |
| 92 | _sa, _sz, _res, \ |
| 93 | __func__, __FILE__, __LINE__); \ |
| 94 | _res; \ |
| 95 | }) |
| 96 | #define sa_zalloc(sa, sz) \ |
| 97 | ({ \ |
| 98 | sql_allocator *_sa = (sa); \ |
| 99 | size_t _sz = (sz); \ |
| 100 | void *_res = sa_zalloc(_sa, _sz); \ |
| 101 | ALLOCDEBUG \ |
| 102 | fprintf(stderr, \ |
| 103 | "#sa_zalloc(%p,%zu) -> %p" \ |
| 104 | " %s[%s:%d]\n", \ |
| 105 | _sa, _sz, _res, \ |
| 106 | __func__, __FILE__, __LINE__); \ |
| 107 | _res; \ |
| 108 | }) |
| 109 | #define sa_realloc(sa, ptr, sz, osz) \ |
| 110 | ({ \ |
| 111 | sql_allocator *_sa = (sa); \ |
| 112 | void *_ptr = (ptr); \ |
| 113 | size_t _sz = (sz); \ |
| 114 | size_t _osz = (osz); \ |
| 115 | void *_res = sa_realloc(_sa, _ptr, _sz, _osz); \ |
| 116 | ALLOCDEBUG \ |
| 117 | fprintf(stderr, \ |
| 118 | "#sa_realloc(%p,%p,%zu,%zu) -> %p" \ |
| 119 | " %s[%s:%d]\n", \ |
| 120 | _sa, _ptr, _sz, _osz, \ |
| 121 | _res, \ |
| 122 | __func__, __FILE__, __LINE__); \ |
| 123 | _res; \ |
| 124 | }) |
| 125 | #define sa_strdup(sa, s) \ |
| 126 | ({ \ |
| 127 | sql_allocator *_sa = (sa); \ |
| 128 | const char *_s = (s); \ |
| 129 | char *_res = sa_strdup(_sa, _s); \ |
| 130 | ALLOCDEBUG \ |
| 131 | fprintf(stderr, \ |
| 132 | "#sa_strdup(%p,len=%zu) -> %p" \ |
| 133 | " %s[%s:%d]\n", \ |
| 134 | _sa, strlen(_s), _res, \ |
| 135 | __func__, __FILE__, __LINE__); \ |
| 136 | _res; \ |
| 137 | }) |
| 138 | #define sa_strndup(sa, s, l) \ |
| 139 | ({ \ |
| 140 | sql_allocator *_sa = (sa); \ |
| 141 | const char *_s = (s); \ |
| 142 | size_t _l = (l); \ |
| 143 | char *_res = sa_strndup(_sa, _s, _l); \ |
| 144 | ALLOCDEBUG \ |
| 145 | fprintf(stderr, \ |
| 146 | "#sa_strndup(%p,len=%zu) -> %p" \ |
| 147 | " %s[%s:%d]\n", \ |
| 148 | _sa, _l, _res, \ |
| 149 | __func__, __FILE__, __LINE__); \ |
| 150 | _res; \ |
| 151 | }) |
| 152 | #endif |
| 153 | |
| 154 | #endif /*_SQL_MEM_H_*/ |
| 155 | |