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
00019 #define MAX_SHM_ID 256
00020 #define JACK_SERVER_NAME_SIZE 256
00021 #define JACK_SHM_MAGIC 0x4a41434b
00022 #define JACK_SHM_NULL_INDEX -1
00023 #define JACK_SHM_REGISTRY_INDEX -2
00024
00025
00026
00027
00028
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
00048 typedef int jack_shm_id_t;
00049 #endif
00050
00051
00052 typedef enum {
00053 shm_POSIX = 1,
00054 shm_SYSV = 2,
00055 shm_WIN32 = 3
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;
00072 #else
00073
00074 pid_t pid;
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;
00083 uint16_t protocol;
00084 jack_shmtype_t type;
00085 jack_shmsize_t size;
00086 jack_shmsize_t hdr_len;
00087 jack_shmsize_t entry_len;
00088 jack_shm_server_t server[MAX_SERVERS];
00089 }
00090 jack_shm_header_t;
00091
00092 typedef struct _jack_shm_registry {
00093 jack_shm_registry_index_t index;
00094
00095 #ifdef WIN32
00096
00097 int allocator;
00098 #else
00099
00100 pid_t allocator;
00101 #endif
00102
00103 jack_shmsize_t size;
00104 jack_shm_id_t id;
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;
00120 size_t size;
00121 void *attached_at;
00122 }
00123 jack_shm_info_t;
00124
00125
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);
00134
00135
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);
00142 extern int jack_initialize_shm_client (void);
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*);
00151 extern int jack_resize_shm (jack_shm_info_t*, jack_shmsize_t size);
00152
00153 #ifdef __cplusplus
00154 }
00155 #endif
00156
00157 #endif