34 #if defined(SERVER_MODE) 38 #if defined(SERVER_MODE) 46 #if !defined(SERVER_MODE) 47 #define pthread_mutex_init(a, b) 48 #define pthread_mutex_destroy(a) 49 #define pthread_mutex_lock(a) 0 50 #define pthread_mutex_unlock(a) 54 #if defined(SERVER_MODE) 55 #define LOCATOR_NKEEP_LIMIT (50) 57 #define LOCATOR_NKEEP_LIMIT (2) 60 #define LOCATOR_CACHED_COPYAREA_SIZE_LIMIT \ 61 (IO_MAX_PAGE_SIZE * 2 + sizeof (LC_COPYAREA)) 70 #if defined(SERVER_MODE) 79 #if defined(SERVER_MODE) 88 #if defined(SERVER_MODE) 97 #if defined(SERVER_MODE) 112 #if defined(CUBRID_DEBUG) 113 static void locator_dump_string (FILE * out_fp,
char *dump_string,
int length);
114 static void locator_dump_copy_area_one_object (FILE * out_fp,
LC_COPYAREA_ONEOBJ * obj,
int obj_index,
118 LOCK reqobj_class_lock,
int quit_on_errors);
119 #if defined(CUBRID_DEBUG) 120 static void locator_dump_lockset_area_info (FILE * out_fp,
LC_LOCKSET * lockset);
121 static void locator_dump_lockset_classes (FILE * out_fp,
LC_LOCKSET * lockset);
122 static void locator_dump_lockset_objects (FILE * out_fp,
LC_LOCKSET * lockset);
131 #if defined(CUBRID_DEBUG) 132 static void locator_dump_lockhint_info (FILE * out_fp,
LC_LOCKHINT * lockhint);
133 static void locator_dump_lockhint_classes (FILE * out_fp,
LC_LOCKHINT * lockhint);
180 #if defined(SERVER_MODE) 248 #if defined(SERVER_MODE) 278 char *packed_area =
NULL;
280 #if defined (SERVER_MODE) 313 if (packed_area ==
NULL)
315 packed_area = (
char *) malloc (packed_size);
334 return (
char *) realloc (packed, packed_size);
351 #if defined (SERVER_MODE) 379 #if defined (ENABLE_UNUSED_FUNCTION) 390 locator_allocate_copyarea (
DKNPAGES npages)
410 int network_pagesize;
412 #if defined (SERVER_MODE) 423 min_length =
DB_ALIGN (min_length, network_pagesize);
437 min_length = copyarea->
length;
449 if (copyarea ==
NULL)
451 copyarea = (
LC_COPYAREA *) malloc (min_length +
sizeof (*copyarea));
452 if (copyarea ==
NULL)
455 (
size_t) (min_length +
sizeof (*copyarea)));
460 copyarea->
mem = (
char *) copyarea +
sizeof (*copyarea);
461 copyarea->
length = min_length;
472 int i, last_obj_offset = -1;
473 int last_obj_length = 0;
474 int old_content_length = 0;
476 if (old_area ==
NULL)
483 if (new_length < old_area->length)
489 if (new_area ==
NULL)
498 for (i = 0; i < old_mobjs->
num_objs; i++)
505 if (old_obj->
offset > last_obj_offset)
507 last_obj_offset = old_obj->
offset;
508 last_obj_length = old_obj->
length;
512 if (last_obj_offset != -1)
514 old_content_length = last_obj_offset + last_obj_length;
517 memcpy (new_area->
mem, old_area->
mem, old_content_length);
536 #if defined (SERVER_MODE) 586 assert (num_objs <= mobjs->num_objs);
673 *contents_ptr = copyarea->
mem;
677 *desc_ptr = (
char *) malloc (*desc_length);
679 if (*desc_ptr ==
NULL)
687 if (contents_length !=
NULL)
689 *contents_length = 0;
694 for (i = 0; i < mobjs->
num_objs; i++)
700 *contents_length = obj->
length;
707 int len = *contents_length;
710 *contents_length = aligned_len + offset;
712 #if !defined (NDEBUG) 713 int padded_len = aligned_len - len;
717 memset (*contents_ptr + *contents_length - padded_len, 0, padded_len);
727 assert (len <= *desc_length);
750 #if defined(SERVER_MODE) 770 length = contents_length + desc_length +
sizeof (
LC_COPYAREA);
773 if (copyarea ==
NULL)
775 *contents_ptr =
NULL;
779 *contents_ptr = copyarea->
mem;
781 #if !defined(SERVER_MODE) 782 *packed_desc = (
char *) malloc (packed_desc_length);
783 if (*packed_desc ==
NULL)
787 *contents_ptr =
NULL;
795 #if defined(CUBRID_DEBUG) 808 locator_dump_string (FILE * out_fp,
char *dump_string,
int length)
811 for (i = 0; i < length; i++)
813 (void) fputc (dump_string[i], out_fp);
833 const char *str_operation;
840 str_operation =
"FLUSH_INSERT";
843 str_operation =
"FLUSH_DELETE";
847 str_operation =
"FLUSH_UPDATE";
850 str_operation =
"FETCH";
853 str_operation =
"FETCH_DELETED";
856 str_operation =
"FETCH_DECACHE_LOCK";
859 str_operation =
"FETCH_VERIFY_CHN";
862 str_operation =
"UNKNOWN";
865 fprintf (out_fp,
"Operation = %s, ", str_operation);
866 fprintf (out_fp,
"Object OID (volid = %d, pageid = %d, slotid = %d)\n", obj->
oid.
volid, obj->
oid.
pageid,
868 fprintf (out_fp,
" length = %d, offset = %d,\n", obj->
length, obj->
offset);
870 fprintf (out_fp,
" Heap (volid = %d, fileid = %d, Hdr_pageid = %d)\n", obj->
hfid.
vfid.
volid,
878 fprintf (out_fp,
"Bad length = %d for object num = %d, OID = %d|%d|%d\n", obj->
length, obj_index, obj->
oid.
volid,
887 fprintf (out_fp,
"Bad offset = %d for object num = %d, OID = %d|%d|%d\n", obj->
offset, obj_index, obj->
oid.
volid,
892 rec = (
char *) copyarea->
mem + obj->
offset;
893 locator_dump_string (out_fp, rec, obj->
length);
894 fprintf (out_fp,
"\n");
913 locator_dump_copy_area (FILE * out_fp,
const LC_COPYAREA * copyarea,
int print_rec)
922 fprintf (out_fp,
"\n\n***Dumping fetch/flush area for Num_objs = %d*** \n", mobjs->
num_objs);
925 for (i = 0; i < mobjs->
num_objs; i++)
928 locator_dump_copy_area_one_object (out_fp, obj, i, copyarea, print_rec);
930 fprintf (out_fp,
"\n\n");
960 #if defined (SERVER_MODE) 964 length = (
sizeof (*lockset) + (max_reqobjs * (
sizeof (*(lockset->
classes)) +
sizeof (*(lockset->
objects)))));
980 ((lockset->
length -
sizeof (*lockset)) / (
sizeof (*(lockset->
classes)) +
sizeof (*(lockset->
objects))));
1028 LOCK reqobj_class_lock,
int quit_on_errors)
1030 if (lockset ==
NULL || length < SSIZEOF (*lockset))
1035 lockset->
mem = (
char *) lockset;
1036 lockset->
length = length;
1056 #if defined (ENABLE_UNUSED_FUNCTION) 1069 locator_allocate_lockset_by_length (
int length)
1074 max_reqobjs = ((length -
sizeof (*lockset)) / (
sizeof (*(lockset->
classes)) +
sizeof (*(lockset->
objects))));
1097 length = (
sizeof (*lockset) + (max_reqobjs * (
sizeof (*(lockset->
classes)) +
sizeof (*(lockset->
objects)))));
1099 if (lockset->
length < length)
1101 lockset = (
LC_LOCKSET *) realloc (lockset, length);
1102 if (lockset ==
NULL)
1113 ((lockset->
length - (
sizeof (*lockset))) / (
sizeof (*(lockset->
classes)) +
sizeof (*(lockset->
objects))));
1115 lockset->
mem = (
char *) lockset;
1116 lockset->
length = length;
1142 #if defined (SERVER_MODE) 1173 #if defined(CUBRID_DEBUG) 1185 locator_dump_lockset_area_info (FILE * out_fp,
LC_LOCKSET * lockset)
1187 fprintf (out_fp,
"Mem = %p, length = %d, num_reqobjs = %d,", (
void *) (lockset->
mem), lockset->
length,
1189 fprintf (out_fp,
"Reqobj_inst_lock = %s, Reqobj_class_lock = %s,\n",
1192 fprintf (out_fp,
" num_reqobjs_processed = %d, last_reqobj_cached = %d, \n", lockset->
num_reqobjs_processed,
1199 fprintf (out_fp,
"quit_on_errors = %s, classes = %p, objects = %p\n", (lockset->
quit_on_errors ?
"TRUE" :
"FALSE"),
1214 locator_dump_lockset_classes (FILE * out_fp,
LC_LOCKSET * lockset)
1220 fprintf (out_fp,
"class_oid = %d|%d|%d, chn = %d\n", lockset->
classes[i].
oid.
volid,
1236 locator_dump_lockset_objects (FILE * out_fp,
LC_LOCKSET * lockset)
1242 fprintf (out_fp,
"object_oid = %d|%d|%d, chn = %d, class_index = %d\n", lockset->
objects[i].
oid.
volid,
1259 locator_dump_lockset (FILE * out_fp,
LC_LOCKSET * lockset)
1268 fprintf (out_fp,
"Area is inconsistent: either area is too small %d", lockset->
length);
1269 fprintf (out_fp,
" (expect at least %d),\n", i);
1270 fprintf (out_fp,
" pointer to classes %p (expected %p), or\n", (
void *) (lockset->
classes),
1271 (
void *) (lockset->
mem + sizeof (*lockset)));
1272 fprintf (out_fp,
" pointer to objects %p (expected >= %p) are incorrect\n", (
void *) (lockset->
objects),
1277 fprintf (out_fp,
"\n***Dumping lockset area***\n");
1278 locator_dump_lockset_area_info (out_fp, lockset);
1280 locator_dump_lockset_classes (out_fp, lockset);
1281 locator_dump_lockset_objects (out_fp, lockset);
1314 if (lockset ==
NULL)
1319 lockset->
packed = unpacked;
1324 if (reg_unpacked ==
false)
1376 for (i = 0, class_lockset = lockset->
classes; i < lockset->num_classes_of_reqobjs; i++, class_lockset++)
1401 for (i = 0,
object = lockset->
objects; i < lockset->num_reqobjs; i++,
object++)
1456 lockset->
packed = packed;
1459 packed = lockset->
packed;
1468 lockset->
packed = packed;
1541 for (i = 0, class_lockset = lockset->
classes; i < lockset->num_classes_of_reqobjs; i++, class_lockset++)
1566 for (i = 0,
object = lockset->
objects; i < lockset->num_reqobjs; i++,
object++)
1592 unpacked = lockset->
packed;
1634 #if defined (SERVER_MODE) 1638 length =
sizeof (*lockhint) + (max_classes *
sizeof (*(lockhint->
classes)));
1651 length = lockhint->
length;
1652 max_classes = ((lockhint->
length -
sizeof (*lockhint)) /
sizeof (*(lockhint->
classes)));
1666 if (lockhint ==
NULL)
1670 if (lockhint ==
NULL)
1699 if (lockhint ==
NULL || length < SSIZEOF (*lockhint))
1704 lockhint->
mem = (
char *) lockhint;
1705 lockhint->
length = length;
1735 length =
sizeof (*lockhint) + (max_classes *
sizeof (*(lockhint->
classes)));
1737 if (lockhint->
length < length)
1739 lockhint = (
LC_LOCKHINT *) realloc (lockhint, length);
1740 if (lockhint ==
NULL)
1746 lockhint->
mem = (
char *) lockhint;
1747 lockhint->
length = length;
1767 #if defined (SERVER_MODE) 1797 #if defined(CUBRID_DEBUG) 1809 locator_dump_lockhint_info (FILE * out_fp,
LC_LOCKHINT * lockhint)
1811 fprintf (out_fp,
"Mem = %p, len = %d, max_classes = %d, num_classes = %d\n", (
void *) (lockhint->
mem),
1828 locator_dump_lockhint_classes (FILE * out_fp,
LC_LOCKHINT * lockhint)
1834 fprintf (out_fp,
"class_oid = %d|%d|%d, chn = %d, lock = %s, subclasses = %d\n", lockhint->
classes[i].
oid.
volid,
1852 locator_dump_lockhint (FILE * out_fp,
LC_LOCKHINT * lockhint)
1854 fprintf (out_fp,
"\n***Dumping lockhint area***\n");
1855 locator_dump_lockhint_info (out_fp, lockhint);
1857 locator_dump_lockhint_classes (out_fp, lockhint);
1886 if (lockhint ==
NULL)
1891 lockhint->
packed = unpacked;
1896 if (reg_unpacked ==
false)
1942 for (i = 0, class_lockhint = lockhint->
classes; i < lockhint->num_classes; i++, class_lockhint++)
1997 lockhint->
packed = packed;
2000 packed = lockhint->
packed;
2010 lockhint->
packed = packed;
2061 for (i = 0, class_lockhint = lockhint->
classes; i < lockhint->num_classes; i++, class_lockhint++)
2087 unpacked = lockhint->
packed;
2126 set->total_oids = 0;
2127 set->num_classes = 0;
2128 set->classes =
NULL;
2129 set->is_list =
true;
2163 #if defined (SERVER_MODE) 2164 if (thread_p ==
NULL)
2168 #endif // SERVER_MODE 2170 for (class_oidset = oidset->
classes, c_next =
NULL; class_oidset !=
NULL; class_oidset = c_next)
2172 c_next = class_oidset->
next;
2176 for (oid = class_oidset->
oids; oid !=
NULL; oid = oid->
next)
2189 for (oid = class_oidset->
oids, o_next =
NULL; oid !=
NULL; oid = o_next)
2263 if (
set ==
NULL || !set->is_list)
2271 for (class_oidset_p = set->classes; class_oidset_p !=
NULL; class_oidset_p = class_oidset_p->
next)
2280 #if defined (SERVER_MODE) 2281 if (thread_p ==
NULL)
2285 #endif // SERVER_MODE 2287 if (class_oidset_p ==
NULL)
2291 if (class_oidset_p ==
NULL)
2296 if (oidmap_p ==
NULL)
2303 oidmap_p->
oid = *obj_oid;
2309 class_oidset_p->
hfid = *heap;
2310 class_oidset_p->
is_list =
true;
2311 class_oidset_p->
oids = oidmap_p;
2313 class_oidset_p->
next =
set->classes;
2314 set->classes = class_oidset_p;
2321 for (oidmap_p = class_oidset_p->
oids; oidmap_p !=
NULL; oidmap_p = oidmap_p->
next)
2328 if (oidmap_p ==
NULL)
2332 if (oidmap_p ==
NULL)
2336 oidmap_p->
next = class_oidset_p->
oids;
2337 class_oidset_p->
oids = oidmap_p;
2338 oidmap_p->
oid = *obj_oid;
2369 for (class_oidset = oidset->
classes, count = 0; class_oidset !=
NULL; class_oidset = class_oidset->
next, count++)
2406 for (class_oidset = oidset->
classes; class_oidset !=
NULL; class_oidset = class_oidset->
next)
2412 for (oid = class_oidset->
oids; oid !=
NULL; oid = oid->
next)
2463 if (c != set->num_classes)
2468 for (class_oidset = set->classes; class_oidset !=
NULL; class_oidset = class_oidset->
next)
2479 for (oid = class_oidset->
oids; oid !=
NULL; oid = oid->
next)
2509 #if defined (SERVER_MODE) 2510 if (thread_p ==
NULL)
2514 #endif // SERVER_MODE 2525 if (!set->num_classes)
2527 set->classes =
NULL;
2532 if (set->classes ==
NULL)
2536 set->is_list =
false;
2539 for (c = 0, class_oidset = set->classes; c < set->num_classes; c++, class_oidset++)
2541 if (c == set->num_classes - 1)
2547 class_oidset->
next = class_oidset + 1;
2553 for (c = 0, class_oidset = set->classes; c < set->num_classes; c++, class_oidset++)
2564 class_oidset->
is_list =
false;
2567 for (o = 0, oid = class_oidset->
oids; o < class_oidset->num_oids; o++, oid++)
2569 if (o == class_oidset->
num_oids - 1)
2575 oid->
next = oid + 1;
2584 set->total_oids = total;
char * locator_pack_oid_set(char *buffer, LC_OIDSET *oidset)
#define LC_LOCKSET_PACKED_SIZE(req)
struct lc_copy_area LC_COPYAREA
char * or_unpack_oid(char *ptr, OID *oid)
LC_LOCKSET_CLASSOF * classes
cubthread::entry * thread_get_thread_entry_info(void)
static LOCATOR_GLOBAL locator_Keep
LC_LOCKHINT * locator_reallocate_lockhint(LC_LOCKHINT *lockhint, int max_classes)
int locator_get_packed_oid_set_size(LC_OIDSET *oidset)
void locator_free_copy_area(LC_COPYAREA *copyarea)
static char * locator_pack_lockhint_header(char *packed, LC_LOCKHINT *lockhint)
LC_LOCKHINT * locator_allocate_and_unpack_lockhint(char *unpacked, int unpacked_size, bool unpack_classes, bool reg_unpacked)
#define LC_START_ONEOBJ_PTR_IN_COPYAREA(manyobjs_ptr)
char * locator_unpack_copy_area_descriptor(int num_objs, LC_COPYAREA *copyarea, char *desc)
void locator_manyobj_flag_set(LC_COPYAREA_MANYOBJS *copyarea, enum MULTI_UPDATE_FLAG muf)
LC_COPYAREA * locator_reallocate_copy_area_by_length(LC_COPYAREA *old_area, int new_length)
int num_classes_processed
#define LC_FIND_ONEOBJ_PTR_IN_COPYAREA(manyobjs_ptr, obj_num)
void locator_free_areas(void)
void locator_clear_oid_set(THREAD_ENTRY *thread_p, LC_OIDSET *oidset)
void locator_free_lockhint(LC_LOCKHINT *lockhint)
#define MEM_REGION_SCRAMBLE(region, size)
#define LC_LOCKHINT_PACKED_SIZE(lockhint)
#define pthread_mutex_unlock(a)
LC_LOCKSET_REQOBJ * objects
char * or_pack_oid(char *ptr, const OID *oid)
LC_LOCKHINT * areas[LOCATOR_NKEEP_LIMIT]
#define pthread_mutex_lock(a)
static char * locator_reallocate_packed(char *packed, int packed_size)
void locator_free_lockset(LC_LOCKSET *lockset)
static LC_COPYAREA packed_req_area_ptrs[LOCATOR_NKEEP_LIMIT]
static char * locator_unpack_lockset_classes(char *unpacked, LC_LOCKSET *lockset)
#define LC_AREA_ONEOBJ_PACKED_SIZE
LC_OIDMAP * locator_add_oid_set(THREAD_ENTRY *thread_p, LC_OIDSET *set, HFID *heap, OID *class_oid, OID *obj_oid)
static int locator_initialize_lockhint(LC_LOCKHINT *lockhint, int length, int max_classes, bool quit_on_errors)
LC_CLASS_OIDSET * classes
LC_LOCKHINT * locator_allocate_lockhint(int max_classes, bool quit_on_errors)
static bool locator_is_hfid_equal(HFID *hfid1_p, HFID *hfid2_p)
void er_set(int severity, const char *file_name, const int line_no, int err_id, int num_args,...)
char * or_pack_hfid(const char *ptr, const HFID *hfid)
void locator_manyobj_flag_remove(LC_COPYAREA_MANYOBJS *copyarea, enum MULTI_UPDATE_FLAG muf)
static char * locator_pack_lockhint_classes(char *packed, LC_LOCKHINT *lockhint)
static char * locator_pack_lockset_classes(char *packed, LC_LOCKSET *lockset)
struct lc_copyarea_manyobjs LC_COPYAREA_MANYOBJS
struct locator_global::locator_global_copyareas copy_areas
#define ER_OUT_OF_VIRTUAL_MEMORY
char * or_unpack_hfid(char *ptr, HFID *hfid)
char * or_unpack_lock(char *ptr, LOCK *lock)
LC_COPYAREA * locator_allocate_copy_area_by_length(int min_length)
#define pthread_mutex_destroy(a)
static void locator_free_packed(char *packed_area, int packed_size)
LC_LOCKSET * locator_allocate_and_unpack_lockset(char *unpacked, int unpacked_size, bool unpack_classes, bool unpack_objects, bool reg_unpacked)
bool first_fetch_lockhint_call
static char * locator_pack_lockset_objects(char *packed, LC_LOCKSET *lockset)
static char * locator_unpack_lockhint_header(char *unpacked, LC_LOCKHINT *lockhint)
#define OID_EQ(oidp1, oidp2)
LC_LOCKSET * areas[LOCATOR_NKEEP_LIMIT]
LC_COPYAREA * areas[LOCATOR_NKEEP_LIMIT]
void locator_initialize_areas(void)
static char * locator_unpack_lockhint_classes(char *unpacked, LC_LOCKHINT *lockhint)
#define LOCK_TO_LOCKMODE_STRING(lock)
LC_COPYAREA * areas[LOCATOR_NKEEP_LIMIT]
#define pthread_mutex_init(a, b)
bool locator_unpack_oid_set_to_exist(char *buffer, LC_OIDSET *use)
PGLENGTH db_network_page_size(void)
#define LC_NEXT_ONEOBJ_PTR_IN_COPYAREA(oneobj_ptr)
struct lc_class_oidset * next
#define db_private_free_and_init(thrd, ptr)
LC_OIDSET * locator_make_oid_set(void)
char * or_unpack_int(char *ptr, int *number)
#define db_private_alloc(thrd, size)
int count(int &result, const cub_regex_object ®, const std::string &src, const int position, const INTL_CODESET codeset)
void locator_free_oid_set(THREAD_ENTRY *thread_p, LC_OIDSET *oidset)
LC_COPYAREA * locator_recv_allocate_copyarea(int num_objs, char **packed_desc, int packed_desc_length, char **contents_ptr, int contents_length)
#define LC_COPY_ONEOBJ(new_obj, old_obj)
char * or_pack_int(char *ptr, int number)
bool locator_manyobj_flag_is_set(LC_COPYAREA_MANYOBJS *copyarea, enum MULTI_UPDATE_FLAG muf)
struct locator_global::locator_global_lockset_areas lockset_areas
int locator_pack_lockhint(LC_LOCKHINT *lockhint, bool pack_classes)
#define LOCATOR_CACHED_COPYAREA_SIZE_LIMIT
struct locator_global::locator_global_packed_areas packed_areas
static char * locator_allocate_packed(int packed_size)
#define free_and_init(ptr)
#define DB_ALIGN(offset, align)
char * or_pack_lock(char *ptr, LOCK lock)
static int locator_initialize_lockset(LC_LOCKSET *lockset, int length, int max_reqobjs, LOCK reqobj_inst_lock, LOCK reqobj_class_lock, int quit_on_errors)
#define LC_MANYOBJS_PTR_IN_COPYAREA(copy_areaptr)
#define LOCATOR_NKEEP_LIMIT
char * locator_pack_copy_area_descriptor(int num_objs, LC_COPYAREA *copyarea, char *desc, int desc_len)
LC_LOCKSET * locator_reallocate_lockset(LC_LOCKSET *lockset, int max_reqobjs)
int locator_unpack_lockset(LC_LOCKSET *lockset, bool unpack_classes, bool unpack_objects)
int num_classes_of_reqobjs_processed
static bool locator_Is_initialized
struct locator_global::locator_global_lockhint_areas lockhint_areas
LC_OIDSET * locator_unpack_oid_set_to_new(THREAD_ENTRY *thread_p, char *buffer)
int num_classes_of_reqobjs
int num_reqobjs_processed
static char * locator_pack_lockset_header(char *packed, LC_LOCKSET *lockset)
LC_LOCKSET * locator_allocate_lockset(int max_reqobjs, LOCK reqobj_inst_lock, LOCK reqobj_class_lock, int quit_on_errors)
static char * locator_unpack_lockset_header(char *unpacked, LC_LOCKSET *lockset)
bool first_fetch_lockset_call
LC_COPYAREA_OPERATION operation
int locator_unpack_lockhint(LC_LOCKHINT *lockhint, bool unpack_classes)
int last_classof_reqobjs_cached
LC_LOCKHINT_CLASS * classes
int locator_pack_lockset(LC_LOCKSET *lockset, bool pack_classes, bool pack_objects)
int locator_send_copy_area(LC_COPYAREA *copyarea, char **contents_ptr, int *contents_length, char **desc_ptr, int *desc_length)
static char * locator_unpack_lockset_objects(char *unpacked, LC_LOCKSET *lockset)