Midas Dual Buffer Memory Functions (dm_xxx)


Functions

INT dm_buffer_create (INT size, INT user_max_event_size)


Function Documentation

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

Parameters:
size Size in bytes
user_max_event_size max event size
Returns:
CM_SUCCESS, BM_NO_MEMORY, BM_MEMSIZE_MISMATCH

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 }


Midas DOC Version 3.0.0 ---- PSI Stefan Ritt ----
Contributions: Pierre-Andre Amaudruz - Sergio Ballestrero - Suzannah Daviel - Doxygen - Peter Green - Qing Gu - Greg Hackman - Gertjan Hofman - Paul Knowles - Exaos Lee - Rudi Meier - Glenn Moloney - Dave Morris - John M O'Donnell - Konstantin Olchanski - Renee Poutissou - Tamsen Schurman - Andreas Suter - Jan M.Wouters - Piotr Adam Zolnierczuk