shm.h

00001 #ifndef __jack_shm_h__
00002 #define __jack_shm_h__
00003 
00004 #include <limits.h>
00005 #include <sys/types.h>
00006 #include "types.h"
00007 #include "JackExports.h"
00008 
00009 
00010 #define TRUE 1
00011 #define FALSE 0
00012 
00013 #ifdef __cplusplus
00014 extern "C"
00015 {
00016 #endif
00017 
00018 #define MAX_SERVERS 8                   /* maximum concurrent servers */
00019 #define MAX_SHM_ID 256                  /* generally about 16 per server */
00020 #define JACK_SERVER_NAME_SIZE 256       /* maximum length of server name */
00021 #define JACK_SHM_MAGIC 0x4a41434b       /* shm magic number: "JACK" */
00022 #define JACK_SHM_NULL_INDEX -1          /* NULL SHM index */
00023 #define JACK_SHM_REGISTRY_INDEX -2      /* pseudo SHM index for registry */
00024 
00025 
00026     /* On Mac OS X, SHM_NAME_MAX is the maximum length of a shared memory
00027      * segment name (instead of NAME_MAX or PATH_MAX as defined by the
00028      * standard).
00029      */
00030 #ifdef USE_POSIX_SHM
00031 
00032 #ifndef SHM_NAME_MAX
00033 #define SHM_NAME_MAX NAME_MAX
00034 #endif
00035     typedef char        shm_name_t[SHM_NAME_MAX];
00036     typedef shm_name_t jack_shm_id_t;
00037 
00038 #elif WIN32   // steph TO CHECK
00039 #define NAME_MAX            255
00040 #ifndef SHM_NAME_MAX
00041 #define SHM_NAME_MAX NAME_MAX
00042 #endif
00043     typedef char        shm_name_t[SHM_NAME_MAX];
00044     typedef shm_name_t jack_shm_id_t;
00045 
00046 #else 
00047     /* System V SHM */
00048     typedef int jack_shm_id_t;
00049 #endif /* SHM type */
00050 
00051     /* shared memory type */
00052     typedef enum {
00053         shm_POSIX = 1,                  /* POSIX shared memory */
00054         shm_SYSV = 2,                   /* System V shared memory */
00055         shm_WIN32 = 3                   /* Windows 32 shared memory */
00056     } jack_shmtype_t;
00057 
00058     typedef int16_t jack_shm_registry_index_t;
00059 
00069     typedef struct _jack_shm_server {
00070 #ifdef WIN32
00071         int     pid;    /* process ID */
00072 #else
00073 
00074         pid_t pid;      /* process ID */
00075 #endif
00076 
00077         char    name[JACK_SERVER_NAME_SIZE];
00078     }
00079     jack_shm_server_t;
00080 
00081     typedef struct _jack_shm_header {
00082         uint32_t        magic;  /* magic number */
00083         uint16_t        protocol;       /* JACK protocol version */
00084         jack_shmtype_t  type;   /* shm type */
00085         jack_shmsize_t  size;   /* total registry segment size */
00086         jack_shmsize_t  hdr_len;        /* size of header */
00087         jack_shmsize_t  entry_len; /* size of registry entry */
00088         jack_shm_server_t server[MAX_SERVERS]; /* current server array */
00089     }
00090     jack_shm_header_t;
00091 
00092     typedef struct _jack_shm_registry {
00093         jack_shm_registry_index_t index;     /* offset into the registry */
00094 
00095 #ifdef WIN32
00096 
00097         int     allocator; /* PID that created shm segment */
00098 #else
00099 
00100         pid_t allocator; /* PID that created shm segment */
00101 #endif
00102 
00103         jack_shmsize_t size;      /* for POSIX unattach */
00104         jack_shm_id_t id;        /* API specific, see above */
00105     }
00106     jack_shm_registry_t;
00107 
00108 #define JACK_SHM_REGISTRY_SIZE (sizeof (jack_shm_header_t) \
00109                                 + sizeof (jack_shm_registry_t) * MAX_SHM_ID)
00110 
00118     typedef struct _jack_shm_info {
00119         jack_shm_registry_index_t index;       /* offset into the registry */
00120                 size_t size;
00121         void *attached_at; /* address where attached */
00122     }
00123     jack_shm_info_t;
00124 
00125     /* utility functions used only within JACK */
00126 
00127     extern void jack_shm_copy_from_registry (jack_shm_info_t*,
00128                 jack_shm_registry_index_t);
00129     extern void jack_shm_copy_to_registry (jack_shm_info_t*,
00130                                                jack_shm_registry_index_t*);
00131     extern void jack_release_shm_info (jack_shm_registry_index_t);
00132 
00133     extern char* jack_shm_addr (jack_shm_info_t* si);  // steph
00134 
00135     /* here beginneth the API */
00136 
00137     EXPORT extern int jack_register_server (const char *server_name, int new_registry);
00138     EXPORT extern void jack_unregister_server (const char *server_name);
00139 
00140     extern int jack_initialize_shm (const char *server_name);
00141     extern int jack_initialize_shm_server (void);  // steph
00142     extern int jack_initialize_shm_client (void);  // steph
00143     EXPORT extern int jack_cleanup_shm (void);
00144 
00145     extern int jack_shmalloc (const char *shm_name, jack_shmsize_t size,
00146                                   jack_shm_info_t* result);
00147     extern void jack_release_shm (jack_shm_info_t*);
00148     extern void jack_destroy_shm (jack_shm_info_t*);
00149     extern int jack_attach_shm (jack_shm_info_t*);
00150     extern int jack_attach_shm_read (jack_shm_info_t*); // steph
00151     extern int jack_resize_shm (jack_shm_info_t*, jack_shmsize_t size);
00152 
00153 #ifdef __cplusplus
00154 }
00155 #endif
00156 
00157 #endif /* __jack_shm_h__ */

Generated on Thu Feb 14 11:16:02 2008 for Jackdmp by  doxygen 1.5.1