/*************************************************************************** * Copyright 1995, Technion, Israel Institute of Technology * Electrical Eng, Software Lab. * Author: Michael Veksler. *************************************************************************** * File: shm_block.ch * Purpose: treat a shared memory block. *************************************************************************** */ #ifndef __WINE_SHM_BLOCK_H #define __WINE_SHM_BLOCK_H #ifdef CONFIG_IPC #include #include "wintypes.h" #define SEGSIZE 0x10000 /* 64 */ #define SHM_GRANULARITY SEGSIZE #define SHM_MINBLOCK SHM_GRANULARITY #define SHM_MAXBLOCK (((int)SHMMAX/(int)SHM_GRANULARITY)* \ SHM_GRANULARITY) #define PTR2REL(block,ptr) (REL_PTR) ( (char *) (ptr) - (char *) (block) ) #define REL2PTR(block,rel) (void *) ( (char *) (block) + (rel) ) typedef int REL_PTR; /* full info for each shm block. */ struct shm_block { /* private */ int next_shm_id; /* IPC shm ID (for initial linking) */ /* public (read only) */ int size; /* size of the shm block */ int free; /* how much of the block is free */ int proc_idx; /* The index of the owner */ /* public - writable for shm_fragment */ REL_PTR free_list; /* first item in the free list */ }; /* used for mapping local attachments */ struct local_shm_map { struct local_shm_map *next; int shm_id; int proc_idx; /* 32 bit pointer to the beginning of the block */ struct shm_block *ptr; }; extern struct local_shm_map *shm_map; void shm_setup_block(struct shm_block *block, REL_PTR first, int size); /* shm_create_block: * allocate and setup a new block: * first - first non header byte. * size - block size (in bytes). * shm_id- IPC shared memory ID. */ struct shm_block *shm_create_block(REL_PTR first, int size, int *shm_id); /* shm_locate_block: * locate existing block according to shm_id, * Attach the block if needed. Assume the shm_id is wine's * Set selectors also. */ struct shm_block *shm_locate_block(int shm_id, struct local_shm_map *map); /* shm_locate_attached_block: * locate existing block according to shm_id, * Blocks are never attached. * if proc_idx is not NULL, it will be set to owner's index. * map - localy mapped info about block may be NULL; */ struct shm_block *shm_locate_attached_block(int shm_id, struct local_shm_map *map); /* shm_attach_block: attach existing shm block, setup selectors * shm_id - id of the block to attach. * proc_idx - if not -1, puts this data into local mapping * map - localy mapped info about this block. (may be NULL) * NOTE: same block can be attached many times */ struct shm_block *shm_attach_block(int shm_id, int proc_idx, struct local_shm_map *map); /* delete chain of shm blocks (pointing to each other */ void shm_delete_chain(int *shmid); #endif /* CONFIG_IPC */ #endif /* __WINE_SHM_BLOCK_H */