mirror of
git://source.winehq.org/git/wine.git
synced 2024-11-05 18:01:34 +00:00
87 lines
2.9 KiB
C
87 lines
2.9 KiB
C
|
/***************************************************************************
|
||
|
* 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
|
||
|
#include <sys/shm.h>
|
||
|
#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 /* __WINE_SHM_BLOCK_H */
|