mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
postreview changes for page cache and pre review commit for loghandler
storage/maria/unittest/test_file.c: Rename: unittest/mysys/test_file.c -> storage/maria/unittest/test_file.c storage/maria/unittest/test_file.h: Rename: unittest/mysys/test_file.h -> storage/maria/unittest/test_file.h include/pagecache.h: A waiting queue mechanism moved to separate file wqueue.* Pointer name changed for compatibility mysys/Makefile.am: A waiting queue mechanism moved to separate file wqueue.* mysys/mf_keycache.c: fixed unsigned comparison mysys/mf_pagecache.c: A waiting queue mechanism moved to separate file wqueue.* Fixed bug in unregistering block during write storage/maria/Makefile.am: The loghandler files added storage/maria/ma_control_file.h: Now we have loghandler and can compile control file storage/maria/maria_def.h: Including files need for compilation of maria storage/maria/unittest/Makefile.am: unit tests of loghandler storage/maria/unittest/ma_control_file-t.c: Used maria def storage/maria/unittest/mf_pagecache_consist.c: fixed memory overrun storage/maria/unittest/mf_pagecache_single.c: fixed used uninitialized memory unittest/mysys/Makefile.am: unittests of pagecache moved to maria becase pagecache need loghandler include/wqueue.h: New BitKeeper file ``include/wqueue.h'' mysys/wqueue.c: New BitKeeper file ``mysys/wqueue.c'' storage/maria/ma_loghandler.c: New BitKeeper file ``storage/maria/ma_loghandler.c'' storage/maria/ma_loghandler.h: New BitKeeper file ``storage/maria/ma_loghandler.h'' storage/maria/ma_loghandler_lsn.h: New BitKeeper file ``storage/maria/ma_loghandler_lsn.h'' storage/maria/unittest/ma_test_loghandler-t.c: New BitKeeper file ``storage/maria/unittest/ma_test_loghandler-t.c'' storage/maria/unittest/ma_test_loghandler_multigroup-t.c: New BitKeeper file ``storage/maria/unittest/ma_test_loghandler_multigroup-t.c'' storage/maria/unittest/ma_test_loghandler_multithread-t.c: New BitKeeper file ``storage/maria/unittest/ma_test_loghandler_multithread-t.c'' storage/maria/unittest/ma_test_loghandler_pagecache-t.c: New BitKeeper file ``storage/maria/unittest/ma_test_loghandler_pagecache-t.c''
This commit is contained in:
167
mysys/wqueue.c
Normal file
167
mysys/wqueue.c
Normal file
@ -0,0 +1,167 @@
|
||||
|
||||
#include <wqueue.h>
|
||||
|
||||
#define STRUCT_PTR(TYPE, MEMBER, a) \
|
||||
(TYPE *) ((char *) (a) - offsetof(TYPE, MEMBER))
|
||||
/*
|
||||
Link a thread into double-linked queue of waiting threads.
|
||||
|
||||
SYNOPSIS
|
||||
wqueue_link_into_queue()
|
||||
wqueue pointer to the queue structure
|
||||
thread pointer to the thread to be added to the queue
|
||||
|
||||
RETURN VALUE
|
||||
none
|
||||
|
||||
NOTES.
|
||||
Queue is represented by a circular list of the thread structures
|
||||
The list is double-linked of the type (**prev,*next), accessed by
|
||||
a pointer to the last element.
|
||||
*/
|
||||
|
||||
void wqueue_link_into_queue(WQUEUE *wqueue, struct st_my_thread_var *thread)
|
||||
{
|
||||
struct st_my_thread_var *last;
|
||||
if (!(last= wqueue->last_thread))
|
||||
{
|
||||
/* Queue is empty */
|
||||
thread->next= thread;
|
||||
thread->prev= &thread->next;
|
||||
}
|
||||
else
|
||||
{
|
||||
thread->prev= last->next->prev;
|
||||
last->next->prev= &thread->next;
|
||||
thread->next= last->next;
|
||||
last->next= thread;
|
||||
}
|
||||
wqueue->last_thread= thread;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Add a thread to single-linked queue of waiting threads
|
||||
|
||||
SYNOPSIS
|
||||
wqueue_add_to_queue()
|
||||
wqueue pointer to the queue structure
|
||||
thread pointer to the thread to be added to the queue
|
||||
|
||||
RETURN VALUE
|
||||
none
|
||||
|
||||
NOTES.
|
||||
Queue is represented by a circular list of the thread structures
|
||||
The list is single-linked of the type (*next), accessed by a pointer
|
||||
to the last element.
|
||||
*/
|
||||
|
||||
void wqueue_add_to_queue(WQUEUE *wqueue, struct st_my_thread_var *thread)
|
||||
{
|
||||
struct st_my_thread_var *last;
|
||||
if (!(last= wqueue->last_thread))
|
||||
thread->next= thread;
|
||||
else
|
||||
{
|
||||
thread->next= last->next;
|
||||
last->next= thread;
|
||||
}
|
||||
wqueue->last_thread= thread;
|
||||
}
|
||||
|
||||
/*
|
||||
Unlink a thread from double-linked queue of waiting threads
|
||||
|
||||
SYNOPSIS
|
||||
wqueue_unlink_from_queue()
|
||||
wqueue pointer to the queue structure
|
||||
thread pointer to the thread to be removed from the queue
|
||||
|
||||
RETURN VALUE
|
||||
none
|
||||
|
||||
NOTES.
|
||||
See NOTES for link_into_queue
|
||||
*/
|
||||
|
||||
void wqueue_unlink_from_queue(WQUEUE *wqueue, struct st_my_thread_var *thread)
|
||||
{
|
||||
if (thread->next == thread)
|
||||
/* The queue contains only one member */
|
||||
wqueue->last_thread= NULL;
|
||||
else
|
||||
{
|
||||
thread->next->prev= thread->prev;
|
||||
*thread->prev= thread->next;
|
||||
if (wqueue->last_thread == thread)
|
||||
wqueue->last_thread= STRUCT_PTR(struct st_my_thread_var, next,
|
||||
thread->prev);
|
||||
}
|
||||
thread->next= NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Remove all threads from queue signaling them to proceed
|
||||
|
||||
SYNOPSIS
|
||||
wqueue_realease_queue()
|
||||
wqueue pointer to the queue structure
|
||||
thread pointer to the thread to be added to the queue
|
||||
|
||||
RETURN VALUE
|
||||
none
|
||||
|
||||
NOTES.
|
||||
See notes for add_to_queue
|
||||
When removed from the queue each thread is signaled via condition
|
||||
variable thread->suspend.
|
||||
*/
|
||||
|
||||
void wqueue_release_queue(WQUEUE *wqueue)
|
||||
{
|
||||
struct st_my_thread_var *last= wqueue->last_thread;
|
||||
struct st_my_thread_var *next= last->next;
|
||||
struct st_my_thread_var *thread;
|
||||
do
|
||||
{
|
||||
thread= next;
|
||||
pthread_cond_signal(&thread->suspend);
|
||||
next= thread->next;
|
||||
thread->next= NULL;
|
||||
}
|
||||
while (thread != last);
|
||||
wqueue->last_thread= NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Add thread and wait
|
||||
|
||||
SYNOPSYS
|
||||
wqueue_add_and_wait()
|
||||
wqueue queue to add to
|
||||
thread thread which is waiting
|
||||
lock mutex need for the operation
|
||||
*/
|
||||
|
||||
void wqueue_add_and_wait(WQUEUE *wqueue,
|
||||
struct st_my_thread_var *thread, pthread_mutex_t *lock)
|
||||
{
|
||||
DBUG_ENTER("wqueue_add_and_wait");
|
||||
DBUG_PRINT("enter", ("thread ox%lxcond 0x%lx, mutex 0x%lx",
|
||||
(ulong) thread, (ulong) &thread->suspend, (ulong) lock));
|
||||
wqueue_add_to_queue(wqueue, thread);
|
||||
do
|
||||
{
|
||||
DBUG_PRINT("info", ("wait... cond 0x%lx, mutex 0x%lx",
|
||||
(ulong) &thread->suspend, (ulong) lock));
|
||||
pthread_cond_wait(&thread->suspend, lock);
|
||||
DBUG_PRINT("info", ("wait done cond 0x%lx, mutex 0x%lx, next 0x%lx",
|
||||
(ulong) &thread->suspend, (ulong) lock,
|
||||
(ulong) thread->next));
|
||||
}
|
||||
while (thread->next);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
Reference in New Issue
Block a user