Changed WPRINTF_ExtractVAPtr to take the address of the va_list to be
[wine] / include / shm_block.h
1 /***************************************************************************
2  * Copyright 1995, Technion, Israel Institute of Technology
3  * Electrical Eng, Software Lab.
4  * Author:    Michael Veksler.
5  ***************************************************************************
6  * File:      shm_block.ch
7  * Purpose:   treat a shared memory block.
8  ***************************************************************************
9  */
10 #ifndef __WINE_SHM_BLOCK_H
11 #define __WINE_SHM_BLOCK_H
12
13 #ifdef CONFIG_IPC
14
15 #include <sys/shm.h>
16 #include "wintypes.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)*  \
21                                  SHM_GRANULARITY)
22 #define PTR2REL(block,ptr) (REL_PTR) ( (char *) (ptr) - (char *) (block) )
23 #define REL2PTR(block,rel) (void *) ( (char *) (block) + (rel) )
24
25 typedef  int REL_PTR;
26
27 /* full info for each shm block. */
28 struct shm_block {
29         /* private */
30         int next_shm_id;           /* IPC shm ID (for initial linking) */
31     
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 */
36         
37         /* public - writable for shm_fragment */
38         REL_PTR free_list;         /* first item in the free list */
39 };
40
41 /* used for mapping local attachments */
42 struct local_shm_map {
43         struct local_shm_map *next;
44         int shm_id;
45         int proc_idx;
46         
47         /* 32 bit pointer to the beginning of the block */
48         struct shm_block *ptr;
49 };
50 extern struct local_shm_map *shm_map;
51 void shm_setup_block(struct shm_block *block, REL_PTR first, int size);
52
53 /* shm_create_block:
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.
58  */
59 struct shm_block *shm_create_block(REL_PTR first, int size, int *shm_id);
60
61 /* shm_locate_block:
62  *   locate existing block according to shm_id,
63  *   Attach the block if needed. Assume the shm_id is wine's
64  *   Set selectors also.
65  */
66 struct shm_block *shm_locate_block(int shm_id, struct local_shm_map *map);
67
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;
73  */
74 struct shm_block *shm_locate_attached_block(int shm_id, 
75                                             struct local_shm_map *map);
76
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
82  */
83 struct shm_block *shm_attach_block(int shm_id, int proc_idx,
84                                    struct local_shm_map *map);
85
86 /* delete chain of shm blocks (pointing to each other */
87 void shm_delete_chain(int *shmid);
88
89 #endif  /* CONFIG_IPC */
90 #endif  /* __WINE_SHM_BLOCK_H */