Jack2 1.9.6

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