WL#3961: Plugin Service: mysys examples
Affects: Server-6.x
—
Status: Un-Assigned
We'll export mysys library in the form of Services (WL#3859), to allow plugins to use it. This task is not about exporting all of the mysys, but only a few selected services, to show how services are created.
1. Memory Allocation Services: malloc, safemalloc, and memroot:
#define MY_FAE 8 /* Fatal if any error */
#define MY_WME 16 /* Write message on error */
#define MY_ZEROFILL 32 /* malloc(): fill array with zero */
#define MY_ALLOW_ZERO_PTR 64 /* realloc(): zero ptr -> malloc */
#define MY_FREE_ON_ERROR 128 /* realloc(): Free old ptr on error */
#define MY_HOLD_ON_ERROR 256 /* realloc(): Return old ptr on error */
typedef int myf;
typedef struct st_mem_root MEM_ROOT;
/* you normal malloc (safemalloc in debug builds) */
struct Memory_Allocation_Service_Malloc {
void *(*malloc)(size_t size, myf MyFlags);
void (*free)(void* ptr, myf MyFlags);
void *(*realloc)(void* oldpoint, size_t size, myf MyFlags);
int (*malloc_sanity_check)(const char *filename, uint lineno);
} Memory_Allocation_Service_Malloc;
/* largepages a.k.a. HugeTLD */
struct Memory_Allocation_Service_Largepages {
void *(*malloc)(size_t size, myf MyFlags);
void (*free)(void* ptr, myf MyFlags);
} Memory_Allocation_Service_Largepages;
/* memroot allocator */
struct Memory_Allocation_Service_Memroot {
void (*init)(MEM_ROOT *mem_root, size_t block_size,
size_t pre_alloc_size, myf MyFlags);
void *(*alloc)(MEM_ROOT *mem_root, size_t length, myf MyFlags);
void (*free)(MEM_ROOT *root, myf MyFlags);
int (*sizeof_MEM_ROOT)();
} Memory_Allocation_Service_Memroot;
here and below: alternatively, instead of
int (*sizeof_MEM_ROOT)();
we could have
int sizeof_MEM_ROOT;
2. Buffered IO Service - IO_CACHE
typedef struct st_io_cache IO_CACHE;
typedef struct st_io_cache_share IO_CACHE_SHARE;
enum cache_type {TYPE_NOT_SET, READ_CACHE, WRITE_CACHE, SEQ_READ_APPEND,
READ_FIFO, READ_NET,WRITE_NET};
struct Buffered_IO_Service {
int (*init)(IO_CACHE *info, int file, size_t cachesize, enum cache_type
type, off_t seek_offset, int use_async_io, myf MyFlags);
int (*reinit)(IO_CACHE *info, enum cache_type type, off_t seek_offset, int
use_async_io, int clear_cache);
int (*deinit)(IO_CACHE *info);
int (*is_inited)(IO_CACHE *info);
void (*init_share)(IO_CACHE *read_cache, IO_CACHE_SHARE *cshare, IO_CACHE
*write_cache, uint num_threads);
void (*remove_thread)(IO_CACHE *cache);
int (*read)(IO_CACHE *info, char *buffer, size_t count);
int (*write)(IO_CACHE *info, const char *buffer, size_t count);
int (*append)(IO_CACHE *info, const char *buffer, size_t count);
int (*flush)(IO_CACHE *info, int need_append_buffer_lock);
void (*seek)(IO_CACHE *info,off_t pos);
off_t (*tell)(IO_CACHE *info);
int (*fill_cache)(IO_CACHE *info);
int (*bytes_in_cache)(IO_CACHE *info);
int (*sizeof_IO_CACHE)();
int (*sizeof_IO_CACHE_SHARE)();
} Buffered_IO_Service;
OPEN ISSUES/COMMENTS ON THIS WL
===============================
On Fri, Jun 13, 2008 at 01:12:32AM +0200, Vladislav Vaintroub wrote:
> I think it is better *not* to use off_t, if you want the plugin
> services to be useful on Windows. off_t is 32 bit integer , while a
> file can certainly be larger than 4GB. "long long" , maybe unsigned
> is more appropriate here IMO.
Copyright (c) 2000, 2025, Oracle Corporation and/or its affiliates. All rights reserved.