Commit 788b95bc authored by unknown's avatar unknown

Fixes for bugs (my_atomic and Maria log handler) observed on

Solaris 10 Sparc 64bit.


include/my_atomic.h:
  Prototypes in the non-inline (extern) case were wrong: they were
  missing "U_a" i.e. "volatile *". Caused a segfault in my_atomic-t
  on Solaris10 Sparc 64.
storage/maria/ma_loghandler.c:
  Move "buffer" array up in the struct, to get it aligned on long-boundary
  so that page cache can use bmove512() (it was not aligned and bmove512()
  was used, causing SIGBUS on Solaris10 Sparc 64).
storage/maria/unittest/ma_pagecache_consist.c:
  doing *(uint*)(charbuff)=something is not ok on sparc machines, we must
  use int4store/uint4korr. Fixes a SIGBUS on Solaris10 Sparc 64.
parent eeb2ec16
...@@ -184,19 +184,19 @@ STATIC_INLINE void my_atomic_store ## S( \ ...@@ -184,19 +184,19 @@ STATIC_INLINE void my_atomic_store ## S( \
#else /* no inline functions */ #else /* no inline functions */
#define make_atomic_add(S) \ #define make_atomic_add(S) \
extern int ## S my_atomic_add ## S(Uv_ ## S, U_ ## S); extern int ## S my_atomic_add ## S(Uv_ ## S U_a, U_ ## S U_v);
#define make_atomic_fas(S) \ #define make_atomic_fas(S) \
extern int ## S my_atomic_fas ## S(Uv_ ## S, U_ ## S); extern int ## S my_atomic_fas ## S(Uv_ ## S U_a, U_ ## S U_v);
#define make_atomic_cas(S) \ #define make_atomic_cas(S) \
extern int my_atomic_cas ## S(Uv_ ## S, Uv_ ## S, U_ ## S); extern int my_atomic_cas ## S(Uv_ ## S U_a, Uv_ ## S U_cmp, U_ ## S U_set);
#define make_atomic_load(S) \ #define make_atomic_load(S) \
extern int ## S my_atomic_load ## S(Uv_ ## S); extern int ## S my_atomic_load ## S(Uv_ ## S U_a);
#define make_atomic_store(S) \ #define make_atomic_store(S) \
extern void my_atomic_store ## S(Uv_ ## S, U_ ## S); extern void my_atomic_store ## S(Uv_ ## S U_a, U_ ## S U_v);
#endif #endif
......
...@@ -84,6 +84,11 @@ typedef struct st_translog_file ...@@ -84,6 +84,11 @@ typedef struct st_translog_file
/* log write buffer descriptor */ /* log write buffer descriptor */
struct st_translog_buffer struct st_translog_buffer
{ {
/*
Cache for current log. Comes first to be aligned for bmove512() in
pagecache_inject()
*/
uchar buffer[TRANSLOG_WRITE_BUFFER];
LSN last_lsn; LSN last_lsn;
/* This buffer offset in the file */ /* This buffer offset in the file */
TRANSLOG_ADDRESS offset; TRANSLOG_ADDRESS offset;
...@@ -148,8 +153,6 @@ struct st_translog_buffer ...@@ -148,8 +153,6 @@ struct st_translog_buffer
With file and offset it allow detect buffer changes With file and offset it allow detect buffer changes
*/ */
uint8 ver; uint8 ver;
/* Cache for current log. */
uchar buffer[TRANSLOG_WRITE_BUFFER];
}; };
......
...@@ -102,20 +102,26 @@ static uint get_len(uint limit) ...@@ -102,20 +102,26 @@ static uint get_len(uint limit)
} }
/* check page consistency */ /*
Check page's consistency: layout is
4 bytes: number 'num' of records in this page, then num occurences of
{ 4 bytes: record's length 'len'; then 4 bytes unchecked ('tag') then
'len' bytes each equal to the record's sequential number in this page,
modulo 256 }, then zeroes.
*/
uint check_page(uchar *buff, ulong offset, int page_locked, int page_no, uint check_page(uchar *buff, ulong offset, int page_locked, int page_no,
int tag) int tag)
{ {
uint end= sizeof(uint); uint end= sizeof(uint);
uint num= *((uint *)buff); uint num= uint4korr(buff);
uint i; uint i;
DBUG_ENTER("check_page"); DBUG_ENTER("check_page");
for (i= 0; i < num; i++) for (i= 0; i < num; i++)
{ {
uint len= *((uint *)(buff + end)); uint len= uint4korr(buff + end);
uint j; uint j;
end+= sizeof(uint) + sizeof(uint); end+= 4 + 4;
if (len + end > TEST_PAGE_SIZE) if (len + end > TEST_PAGE_SIZE)
{ {
diag("incorrect field header #%u by offset %lu\n", i, offset + end); diag("incorrect field header #%u by offset %lu\n", i, offset + end);
...@@ -169,17 +175,18 @@ err: ...@@ -169,17 +175,18 @@ err:
void put_rec(uchar *buff, uint end, uint len, uint tag) void put_rec(uchar *buff, uint end, uint len, uint tag)
{ {
uint i; uint i;
uint num= *((uint *)buff); uint num;
num= uint4korr(buff);
if (!len) if (!len)
len= 1; len= 1;
if (end + sizeof(uint)*2 + len > TEST_PAGE_SIZE) if (end + 4*2 + len > TEST_PAGE_SIZE)
return; return;
*((uint *)(buff + end))= len; int4store(buff + end, len);
end+= sizeof(uint); end+= 4;
*((uint *)(buff + end))= tag; int4store(buff + end, tag);
end+= sizeof(uint); end+= 4;
num++; num++;
*((uint *)buff)= num; int4store(buff, num);
for (i= end; i < (len + end); i++) for (i= end; i < (len + end); i++)
{ {
buff[i]= (uchar) num % 256; buff[i]= (uchar) num % 256;
...@@ -276,7 +283,7 @@ static void *test_thread_reader(void *arg) ...@@ -276,7 +283,7 @@ static void *test_thread_reader(void *arg)
DBUG_PRINT("info", ("Thread %s ended\n", my_thread_name())); DBUG_PRINT("info", ("Thread %s ended\n", my_thread_name()));
pthread_mutex_lock(&LOCK_thread_count); pthread_mutex_lock(&LOCK_thread_count);
ok(1, "reader%d: done\n", param); ok(1, "reader%d: done", param);
thread_count--; thread_count--;
VOID(pthread_cond_signal(&COND_thread_count)); /* Tell main we are ready */ VOID(pthread_cond_signal(&COND_thread_count)); /* Tell main we are ready */
pthread_mutex_unlock(&LOCK_thread_count); pthread_mutex_unlock(&LOCK_thread_count);
...@@ -297,7 +304,7 @@ static void *test_thread_writer(void *arg) ...@@ -297,7 +304,7 @@ static void *test_thread_writer(void *arg)
DBUG_PRINT("info", ("Thread %s ended\n", my_thread_name())); DBUG_PRINT("info", ("Thread %s ended\n", my_thread_name()));
pthread_mutex_lock(&LOCK_thread_count); pthread_mutex_lock(&LOCK_thread_count);
ok(1, "writer%d: done\n", param); ok(1, "writer%d: done", param);
thread_count--; thread_count--;
VOID(pthread_cond_signal(&COND_thread_count)); /* Tell main we are ready */ VOID(pthread_cond_signal(&COND_thread_count)); /* Tell main we are ready */
pthread_mutex_unlock(&LOCK_thread_count); pthread_mutex_unlock(&LOCK_thread_count);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment