mirror of
https://github.com/MariaDB/server.git
synced 2025-01-27 09:14:17 +01:00
wt: don't support a key as a union { ulonglong, void* }. Although convenient,
it forces the user to bzero a key before setting it as a pointer, otherwise it'll have random content on architectures where sizeof(void*) < sizeof(ulonglong). Declaring a key as ulonglong only (not a union) makes this user mistake impossible. include/waiting_threads.h: WT_RESOURCE_ID::value is an ulonglong, not a union mysys/waiting_threads.c: WT_RESOURCE_ID::value is an ulonglong, not a union storage/maria/ma_write.c: WT_RESOURCE_ID::value is an ulonglong, not a union storage/maria/trnman.c: WT_RESOURCE_ID::value is an ulonglong, not a union unittest/mysys/waiting_threads-t.c: WT_RESOURCE_ID::value is an ulonglong, not a union
This commit is contained in:
parent
533deb0ac4
commit
27dadbd895
5 changed files with 13 additions and 19 deletions
|
@ -32,10 +32,7 @@ typedef struct st_wt_resource_type {
|
||||||
|
|
||||||
struct st_wt_resource_id {
|
struct st_wt_resource_id {
|
||||||
WT_RESOURCE_TYPE *type;
|
WT_RESOURCE_TYPE *type;
|
||||||
union {
|
ulonglong value;
|
||||||
void *ptr;
|
|
||||||
ulonglong num;
|
|
||||||
} value;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define WT_WAIT_STATS 24
|
#define WT_WAIT_STATS 24
|
||||||
|
|
|
@ -30,8 +30,7 @@
|
||||||
A resource is represented by a WT_RESOURCE structure.
|
A resource is represented by a WT_RESOURCE structure.
|
||||||
|
|
||||||
a resource identifier - a pair of {resource type, value}. A value is
|
a resource identifier - a pair of {resource type, value}. A value is
|
||||||
either a ulonglong number or a pointer (it's a union).
|
an ulonglong number. Represented by a WT_RESOURCE_ID structure.
|
||||||
WT_RESOURCE_ID structure.
|
|
||||||
|
|
||||||
a resource type - a pointer to a statically defined instance of
|
a resource type - a pointer to a statically defined instance of
|
||||||
WT_RESOURCE_TYPE structure. This structure contains a pointer to
|
WT_RESOURCE_TYPE structure. This structure contains a pointer to
|
||||||
|
@ -169,20 +168,20 @@ static my_atomic_rwlock_t cycle_stats_lock, wait_stats_lock, success_stats_lock;
|
||||||
#define rc_rdlock(X) \
|
#define rc_rdlock(X) \
|
||||||
do { \
|
do { \
|
||||||
WT_RESOURCE *R=(X); \
|
WT_RESOURCE *R=(X); \
|
||||||
DBUG_PRINT("wt", ("LOCK resid=%lld for READ", R->id.value.num)); \
|
DBUG_PRINT("wt", ("LOCK resid=%lld for READ", R->id.value)); \
|
||||||
rw_rdlock(&R->lock); \
|
rw_rdlock(&R->lock); \
|
||||||
} while (0)
|
} while (0)
|
||||||
#define rc_wrlock(X) \
|
#define rc_wrlock(X) \
|
||||||
do { \
|
do { \
|
||||||
WT_RESOURCE *R=(X); \
|
WT_RESOURCE *R=(X); \
|
||||||
DBUG_PRINT("wt", ("LOCK resid=%lld for WRITE", R->id.value.num)); \
|
DBUG_PRINT("wt", ("LOCK resid=%lld for WRITE", R->id.value)); \
|
||||||
rw_wrlock(&R->lock); \
|
rw_wrlock(&R->lock); \
|
||||||
} while (0)
|
} while (0)
|
||||||
#define rc_unlock(X) \
|
#define rc_unlock(X) \
|
||||||
do { \
|
do { \
|
||||||
WT_RESOURCE *R=(X); \
|
WT_RESOURCE *R=(X); \
|
||||||
DBUG_PRINT("wt", ("UNLOCK resid=%lld", R->id.value.num)); \
|
DBUG_PRINT("wt", ("UNLOCK resid=%lld", R->id.value)); \
|
||||||
rw_unlock(&R->lock); \
|
rw_unlock(&R->lock); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -688,7 +687,7 @@ int wt_thd_will_wait_for(WT_THD *thd, WT_THD *blocker, WT_RESOURCE_ID *resid)
|
||||||
LF_REQUIRE_PINS(3);
|
LF_REQUIRE_PINS(3);
|
||||||
|
|
||||||
DBUG_PRINT("wt", ("enter: thd=%s, blocker=%s, resid=%llu",
|
DBUG_PRINT("wt", ("enter: thd=%s, blocker=%s, resid=%llu",
|
||||||
thd->name, blocker->name, resid->value.num));
|
thd->name, blocker->name, resid->value));
|
||||||
|
|
||||||
if (fix_thd_pins(thd))
|
if (fix_thd_pins(thd))
|
||||||
DBUG_RETURN(WT_DEADLOCK);
|
DBUG_RETURN(WT_DEADLOCK);
|
||||||
|
|
|
@ -217,7 +217,7 @@ int maria_write(MARIA_HA *info, uchar *record)
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
rc.type= &ma_rc_dup_unique;
|
rc.type= &ma_rc_dup_unique;
|
||||||
rc.value.ptr= blocker; /* TODO savepoint id when we'll have them */
|
rc.value= (intptr)blocker; /* TODO savepoint id when we'll have them */
|
||||||
res= wt_thd_will_wait_for(info->trn->wt, blocker->wt, & rc);
|
res= wt_thd_will_wait_for(info->trn->wt, blocker->wt, & rc);
|
||||||
if (res != WT_OK)
|
if (res != WT_OK)
|
||||||
{
|
{
|
||||||
|
|
|
@ -87,7 +87,7 @@ static void wt_thd_release_self(TRN *trn)
|
||||||
{
|
{
|
||||||
WT_RESOURCE_ID rc;
|
WT_RESOURCE_ID rc;
|
||||||
rc.type= &ma_rc_dup_unique;
|
rc.type= &ma_rc_dup_unique;
|
||||||
rc.value.ptr= trn;
|
rc.value= (intptr)trn;
|
||||||
wt_thd_release(trn->wt, & rc);
|
wt_thd_release(trn->wt, & rc);
|
||||||
trn->wt= 0;
|
trn->wt= 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,9 +62,8 @@ pthread_handler_t test_wt(void *arg)
|
||||||
{
|
{
|
||||||
WT_RESOURCE_ID resid;
|
WT_RESOURCE_ID resid;
|
||||||
int blockers[THREADS/10], j, k;
|
int blockers[THREADS/10], j, k;
|
||||||
bzero(&resid, sizeof(resid));
|
|
||||||
|
|
||||||
resid.value.num= id;
|
resid.value= id;
|
||||||
resid.type= &restype;
|
resid.type= &restype;
|
||||||
|
|
||||||
res= 0;
|
res= 0;
|
||||||
|
@ -187,8 +186,7 @@ void do_tests()
|
||||||
WT_RESOURCE_ID resid[3];
|
WT_RESOURCE_ID resid[3];
|
||||||
for (i=0; i < 3; i++)
|
for (i=0; i < 3; i++)
|
||||||
{
|
{
|
||||||
bzero(&resid[i], sizeof(resid[i]));
|
resid[i].value= i+1;
|
||||||
resid[i].value.num= i+1;
|
|
||||||
resid[i].type= &restype;
|
resid[i].type= &restype;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue