 33fa9b26fe
			
		
	
	33fa9b26fe
	
	
	
		
			
			The log manager is the only one that uses the mlist_t versioned list. The counter that keeps track of the version number was not modified using atomic operations meaning that the compiler is free to optimize away parts of the lock-free versioning mechanism that uses it. To prevent this optimization, the variable is declared volatile. A rewrite is direly needed but it cannot be done in 2.2.
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #pragma once
 | |
| #ifndef _MAXSCALE_MLIST_H
 | |
| #define _MAXSCALE_MLIST_H
 | |
| /*
 | |
|  * Copyright (c) 2016 MariaDB Corporation Ab
 | |
|  *
 | |
|  * Use of this software is governed by the Business Source License included
 | |
|  * in the LICENSE.TXT file and at www.mariadb.com/bsl11.
 | |
|  *
 | |
|  * Change Date: 2020-01-01
 | |
|  *
 | |
|  * On the date above, in accordance with the Business Source License, use
 | |
|  * of this software will be governed by version 2 or later of the General
 | |
|  * Public License.
 | |
|  */
 | |
| 
 | |
| #include <maxscale/cdefs.h>
 | |
| #include "skygw_utils.h"
 | |
| 
 | |
| MXS_BEGIN_DECLS
 | |
| 
 | |
| typedef struct mlist_node_st mlist_node_t;
 | |
| 
 | |
| typedef struct mlist_st
 | |
| {
 | |
|     skygw_chk_t    mlist_chk_top;
 | |
|     char*          mlist_name;
 | |
|     void (*mlist_datadel)(void *);  /**< clean-up function for data */
 | |
|     simple_mutex_t mlist_mutex; /**< protect node updates and clean-up */
 | |
|     bool           mlist_uselock;
 | |
|     bool           mlist_islocked;
 | |
|     bool           mlist_deleted;
 | |
|     size_t         mlist_nodecount;
 | |
|     size_t         mlist_nodecount_max; /**< size limit. 0 == no limit */
 | |
|     volatile size_t mlist_versno;
 | |
|     bool           mlist_flat;
 | |
|     mlist_node_t*  mlist_first;
 | |
|     mlist_node_t*  mlist_last;
 | |
|     skygw_chk_t    mlist_chk_tail;
 | |
| } mlist_t;
 | |
| 
 | |
| typedef struct mlist_cursor_st
 | |
| {
 | |
|     skygw_chk_t   mlcursor_chk_top;
 | |
|     mlist_t*      mlcursor_list;
 | |
|     mlist_node_t* mlcursor_pos;
 | |
|     pthread_t*    mlcursor_owner_thr;
 | |
|     skygw_chk_t   mlcursor_chk_tail;
 | |
| } mlist_cursor_t;
 | |
| 
 | |
| struct mlist_node_st
 | |
| {
 | |
|     skygw_chk_t   mlnode_chk_top;
 | |
|     mlist_t*      mlnode_list;
 | |
|     mlist_node_t* mlnode_next;
 | |
|     void*         mlnode_data;
 | |
|     bool          mlnode_deleted;
 | |
|     skygw_chk_t   mlnode_chk_tail;
 | |
| };
 | |
| 
 | |
| 
 | |
| mlist_t*      mlist_init(mlist_t*         mlist,
 | |
|                          mlist_cursor_t** cursor,
 | |
|                          char*            name,
 | |
|                          void           (*datadel)(void*),
 | |
|                          int              maxnodes);
 | |
| void          mlist_done(mlist_t* list);
 | |
| bool          mlist_add_data_nomutex(mlist_t* list, void* data);
 | |
| bool          mlist_add_node_nomutex(mlist_t* list, mlist_node_t* newnode);
 | |
| mlist_node_t* mlist_detach_first(mlist_t* ml);
 | |
| mlist_node_t* mlist_detach_nodes(mlist_t* ml);
 | |
| void*         mlist_node_get_data(mlist_node_t* node);
 | |
| void          mlist_node_done(mlist_node_t* n);
 | |
| 
 | |
| mlist_cursor_t* mlist_cursor_init(mlist_t* ml);
 | |
| void*           mlist_cursor_get_data_nomutex(mlist_cursor_t* c);
 | |
| bool            mlist_cursor_move_to_first(mlist_cursor_t* c);
 | |
| 
 | |
| MXS_END_DECLS
 | |
| 
 | |
| #endif
 |