91 lines
2.9 KiB
C
91 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
|
|
|
|
#ifdef CONFIG_IPC
|
|
|
|
#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 /* CONFIG_IPC */
|
|
#endif /* __WINE_SHM_BLOCK_H */
|