1 /***************************************************************************
2 * Copyright 1995, Technion, Israel Institute of Technology
3 * Electrical Eng, Software Lab.
4 * Author: Michael Veksler.
5 ***************************************************************************
7 * Purpose: treat a shared memory block.
8 ***************************************************************************
10 #ifndef __WINE_SHM_BLOCK_H
11 #define __WINE_SHM_BLOCK_H
17 #define SEGSIZE 0x10000 /* 64 */
18 #define SHM_GRANULARITY SEGSIZE
19 #define SHM_MINBLOCK SHM_GRANULARITY
20 #define SHM_MAXBLOCK (((int)SHMMAX/(int)SHM_GRANULARITY)* \
22 #define PTR2REL(block,ptr) (REL_PTR) ( (char *) (ptr) - (char *) (block) )
23 #define REL2PTR(block,rel) (void *) ( (char *) (block) + (rel) )
27 /* full info for each shm block. */
30 int next_shm_id
; /* IPC shm ID (for initial linking) */
32 /* public (read only) */
33 int size
; /* size of the shm block */
34 int free
; /* how much of the block is free */
35 int proc_idx
; /* The index of the owner */
37 /* public - writable for shm_fragment */
38 REL_PTR free_list
; /* first item in the free list */
41 /* used for mapping local attachments */
42 struct local_shm_map
{
43 struct local_shm_map
*next
;
47 /* 32 bit pointer to the beginning of the block */
48 struct shm_block
*ptr
;
50 extern struct local_shm_map
*shm_map
;
51 void shm_setup_block(struct shm_block
*block
, REL_PTR first
, int size
);
54 * allocate and setup a new block:
55 * first - first non header byte.
56 * size - block size (in bytes).
57 * shm_id- IPC shared memory ID.
59 struct shm_block
*shm_create_block(REL_PTR first
, int size
, int *shm_id
);
62 * locate existing block according to shm_id,
63 * Attach the block if needed. Assume the shm_id is wine's
66 struct shm_block
*shm_locate_block(int shm_id
, struct local_shm_map
*map
);
68 /* shm_locate_attached_block:
69 * locate existing block according to shm_id,
70 * Blocks are never attached.
71 * if proc_idx is not NULL, it will be set to owner's index.
72 * map - localy mapped info about block may be NULL;
74 struct shm_block
*shm_locate_attached_block(int shm_id
,
75 struct local_shm_map
*map
);
77 /* shm_attach_block: attach existing shm block, setup selectors
78 * shm_id - id of the block to attach.
79 * proc_idx - if not -1, puts this data into local mapping
80 * map - localy mapped info about this block. (may be NULL)
81 * NOTE: same block can be attached many times
83 struct shm_block
*shm_attach_block(int shm_id
, int proc_idx
,
84 struct local_shm_map
*map
);
86 /* delete chain of shm blocks (pointing to each other */
87 void shm_delete_chain(int *shmid
);
89 #endif /* CONFIG_IPC */
90 #endif /* __WINE_SHM_BLOCK_H */