Functions | |
INT | dm_buffer_create (INT size, INT user_max_event_size) |
Setup a dual memory buffer. Has to be called initially before any other dm_xxx function
size | Size in bytes | |
user_max_event_size | max event size |
Definition at line 121 of file dm_eb.c.
00122 { 00123 00124 dm.area1.pt = (char *) M_MALLOC(size); 00125 if (dm.area1.pt == NULL) 00126 return (BM_NO_MEMORY); 00127 dm.area2.pt = (char *) M_MALLOC(size); 00128 if (dm.area2.pt == NULL) 00129 return (BM_NO_MEMORY); 00130 00131 /* check user event size against the system MAX_EVENT_SIZE */ 00132 if (user_max_event_size > MAX_EVENT_SIZE) { 00133 cm_msg(MERROR, "dm_buffer_create", "user max event size too large"); 00134 return BM_MEMSIZE_MISMATCH; 00135 } 00136 dm_user_max_event_size = user_max_event_size; 00137 00138 memset(dm.area1.pt, 0, size); 00139 memset(dm.area2.pt, 0, size); 00140 00141 /* initialize pointers */ 00142 dm.area1.pb = dm.area1.pt + size - 1024; 00143 dm.area1.pw = dm.area1.pe = dm.area1.pt; 00144 dm.area2.pb = dm.area2.pt + size - 1024; 00145 dm.area2.pw = dm.area2.pe = dm.area2.pt; 00146 00147 /*-PAA-*/ 00148 #ifdef DM_DEBUG 00149 printf(" in dm_buffer_create ---------------------------------\n"); 00150 printf(" %i %p %p %p %p\n", size, dm.area1.pt, dm.area1.pw, dm.area1.pe, dm.area1.pb); 00151 printf(" %i %p %p %p %p\n", size, dm.area2.pt, dm.area2.pw, dm.area2.pe, dm.area2.pb); 00152 #endif 00153 00154 /* activate first area */ 00155 dm.pa = &dm.area1; 00156 00157 /* Default not full */ 00158 dm.area1.full = dm.area2.full = FALSE; 00159 00160 /* Reset serial buffer number with proper starting sequence */ 00161 dm.area1.serial = dm.area2.serial = 0; 00162 /* ensure proper serial on next increment */ 00163 dm.serial = 1; 00164 00165 /* set active buffer time stamp */ 00166 dm.last_active = ss_millitime(); 00167 00168 /* get socket for event sending */ 00169 _send_sock = rpc_get_event_sock(); 00170 00171 #ifdef DM_DUAL_THREAD 00172 { 00173 INT status; 00174 VX_TASK_SPAWN starg; 00175 00176 /* create semaphore */ 00177 status = ss_semaphore_create("send", &dm.sem_send); 00178 if (status != SS_CREATED && status != SS_SUCCESS) { 00179 cm_msg(MERROR, "dm_buffer_create", "error in ss_semaphore_create send"); 00180 return status; 00181 } 00182 status = ss_semaphore_create("flush", &dm.sem_flush); 00183 if (status != SS_CREATED && status != SS_SUCCESS) { 00184 cm_msg(MERROR, "dm_buffer_create", "error in ss_semaphore_create flush"); 00185 return status; 00186 } 00187 /* spawn dm_task */ 00188 memset(&starg, 0, sizeof(VX_TASK_SPAWN)); 00189 00190 #ifdef OS_VXWORKS 00191 /* Fill up the necessary arguments */ 00192 strcpy(starg.name, "areaSend"); 00193 starg.priority = 120; 00194 starg.stackSize = 20000; 00195 #endif 00196 00197 if ((status = ss_thread_create(dm_task, (void *) &starg)) 00198 != SS_SUCCESS) { 00199 cm_msg(MERROR, "dm_buffer_create", "error in ss_thread_create"); 00200 return status; 00201 } 00202 #ifdef OS_WINNT 00203 /* necessary for true MUTEX (NT) */ 00204 ss_semaphore_wait_for(dm.sem_send, 0); 00205 #endif 00206 } 00207 #endif /* DM_DUAL_THREAD */ 00208 00209 return CM_SUCCESS; 00210 }