| /*************************************************************************** | |
| * 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 <sys/shm.h> | |
| #include "windef.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 */ |