Main Page   Class Hierarchy   Alphabetical List   Data Structures   File List   Data Fields   Globals  

SHMEM Class Reference

#include <shmem.hh>

Inheritance diagram for SHMEM:

Inheritance graph
[legend]
Collaboration diagram for SHMEM:

Collaboration graph
[legend]

Public Methods

 SHMEM (char *name, long size, int neutral, key_t key, int m=0)
 SHMEM (char *bufline, char *procline, int set_to_server=0, int set_to_master=0)
virtual ~SHMEM ()
CMS_STATUS main_access (void *_local)

Private Types

enum  SHMEM_MUTEX_TYPE {
  NO_MUTEX, MAO_MUTEX, MAO_MUTEX_W_OS_SEM, OS_SEM_MUTEX,
  NO_INTERRUPTS_MUTEX, NO_SWITCHING_MUTEX
}

Private Methods

int open ()
int close ()

Private Attributes

int fast_mode
key_t key
key_t bsem_key
int second_read
RCS_SHAREDMEMshm
RCS_SEMAPHOREsem
int master
double sem_delay
mem_access_object mao
int use_os_sem
int use_os_sem_only
SHMEM_MUTEX_TYPE mutex_type
void * shm_addr_offset
RCS_SEMAPHOREbsem
int autokey_table_size

Member Enumeration Documentation

enum SHMEM::SHMEM_MUTEX_TYPE [private]
 

Enumeration values:
NO_MUTEX 
MAO_MUTEX 
MAO_MUTEX_W_OS_SEM 
OS_SEM_MUTEX 
NO_INTERRUPTS_MUTEX 
NO_SWITCHING_MUTEX 

Definition at line 88 of file shmem.hh.

00089   {
00090     NO_MUTEX,
00091     MAO_MUTEX,
00092     MAO_MUTEX_W_OS_SEM,
00093     OS_SEM_MUTEX,
00094     NO_INTERRUPTS_MUTEX,
00095     NO_SWITCHING_MUTEX
00096   };


Constructor & Destructor Documentation

SHMEM::SHMEM char *    n,
long    s,
int    nt,
key_t    k,
int    m = 0
 

Definition at line 105 of file shmem.cc.

00105                                                     :
00106 CMS (s)
00107 {
00108   /* Set pointers to null so only properly opened pointers are closed. */
00109   shm = NULL;
00110 //  sem = NULL;
00111 
00112   /* save constructor args */
00113   master = m;
00114   key = k;
00115 
00116   /* open the shared mem buffer and create mutual exclusion semaphore */
00117   open ();
00118 }

SHMEM::SHMEM char *    bufline,
char *    procline,
int    set_to_server = 0,
int    set_to_master = 0
 

Definition at line 121 of file shmem.cc.

00122                                 :
00123 CMS (bufline, procline, set_to_server)
00124 {
00125   /* Set pointers to null so only properly opened pointers are closed. */
00126   shm = NULL;
00127   sem = NULL;
00128   sem_delay = 0.00001;
00129   char *semdelay_equation;
00130   use_os_sem = 1;
00131   use_os_sem_only = 1;
00132   mutex_type = OS_SEM_MUTEX;
00133   bsem_key = -1;
00134   second_read = 0;
00135 
00136   if (status < 0)
00137     {
00138       rcs_print_error ("SHMEM: status = %d\n", status);
00139       return;
00140     }
00141 
00142   /* Save parameters from configuration file. */
00143 #ifndef UNDER_CE
00144   if (sscanf (bufline, "%*s %*s %*s %*s %*s %*s %*s %*s %*s %d", &key) != 1)
00145     {
00146       rcs_print_error ("SHMEM: Invalid configuration file format.\n");
00147       return;
00148     }
00149 #else
00150   char *word[32];
00151   if (separate_words (word, 10, bufline) != 10)
00152     {
00153       rcs_print_error ("CMS: Error in buffer line from config file.\n");
00154       rcs_print_error ("%s\n", bufline);
00155       status = CMS_CONFIG_ERROR;
00156       return;
00157     }
00158   key = atol (word[9]);
00159 #endif
00160 
00161   master = is_local_master;
00162   if (1 == set_to_master)
00163     {
00164       master = 1;
00165     }
00166   else if (-1 == set_to_master)
00167     {
00168       master = 0;
00169     }
00170 
00171 #ifndef UNDER_CE
00172   if (NULL != (semdelay_equation = strstr (proclineupper, "SEMDELAY=")))
00173     {
00174       sem_delay = strtod (semdelay_equation + 9, (char **) NULL);
00175     }
00176   else if (NULL != (semdelay_equation = strstr (buflineupper, "SEMDELAY=")))
00177     {
00178       sem_delay = strtod (semdelay_equation + 9, (char **) NULL);
00179     }
00180 #endif
00181 
00182   if (NULL != (semdelay_equation = strstr (buflineupper, "BSEM=")))
00183     {
00184 #ifndef UNDER_CE
00185       bsem_key = strtol (semdelay_equation + 5, (char **) NULL, 0);
00186 #else
00187       bsem_key = atol (semdelay_equation + 5);
00188 #endif
00189     }
00190 
00191   if (NULL != strstr (buflineupper, "MUTEX=NONE"))
00192     {
00193       mutex_type = NO_MUTEX;
00194       use_os_sem = 0;
00195       use_os_sem_only = 0;
00196     }
00197 
00198   if (NULL != strstr (buflineupper, "MUTEX=OS_SEM"))
00199     {
00200       mutex_type = OS_SEM_MUTEX;
00201       use_os_sem = 1;
00202       use_os_sem_only = 1;
00203     }
00204 
00205   if (NULL != strstr (buflineupper, "MUTEX=NO_INTERRUPTS"))
00206     {
00207       mutex_type = NO_INTERRUPTS_MUTEX;
00208       use_os_sem = 0;
00209       use_os_sem_only = 0;
00210     }
00211 
00212   if (NULL != strstr (buflineupper, "MUTEX=NO_SWITCHING"))
00213     {
00214       mutex_type = NO_SWITCHING_MUTEX;
00215 #ifdef lynxosPC
00216       if (fa_ptr == NULL)
00217         {
00218           fa_ptr = fast_info_attach ((char *) 0xC0000000);
00219         }
00220 #endif
00221       use_os_sem = 0;
00222       use_os_sem_only = 0;
00223     }
00224 
00225   if (NULL != strstr (buflineupper, "MUTEX=MAO"))
00226     {
00227       mutex_type = MAO_MUTEX;
00228       use_os_sem = 0;
00229       use_os_sem_only = 0;
00230     }
00231 
00232   if (NULL != strstr (buflineupper, "MAO_W_OS_SEM"))
00233     {
00234       mutex_type = MAO_MUTEX_W_OS_SEM;
00235       use_os_sem = 1;
00236       use_os_sem_only = 0;
00237     }
00238 
00239   /* Open the shared memory buffer and create mutual exclusion semaphore. */
00240   open ();
00241 }

SHMEM::~SHMEM   [virtual]
 

Definition at line 243 of file shmem.cc.

00244 {
00245   /* detach from shared memory and semaphores */
00246   close ();
00247 }


Member Function Documentation

CMS_STATUS SHMEM::main_access void *    _local [virtual]
 

Reimplemented from CMS.

Definition at line 641 of file shmem.cc.

00642 {
00643 #if defined(LYNX) && !defined(lynxosPC)
00644   int interrupt_disable_number = 0;
00645   int switching_disable_number = 1;
00646 #endif
00647 
00648   /* Check pointers. */
00649   if (shm == NULL)
00650     {
00651       second_read = 0;
00652       return (status = CMS_MISC_ERROR);
00653     }
00654 
00655   if (bsem == NULL && not_zero (blocking_timeout))
00656     {
00657       rcs_print_error
00658         ("No blocking semaphore available. Can not call blocking_read(%f).\n",
00659          blocking_timeout);
00660       second_read = 0;
00661       return (status = CMS_NO_BLOCKING_SEM_ERROR);
00662     }
00663 
00664   mao.read_only = ((internal_access_type == CMS_CHECK_IF_READ_ACCESS) ||
00665                    (internal_access_type == CMS_PEEK_ACCESS) ||
00666                    (internal_access_type == CMS_READ_ACCESS));
00667 
00668 #ifdef VXWORKS
00669   int intLockKey = 0;
00670 #endif
00671 
00672   switch (mutex_type)
00673     {
00674     case NO_MUTEX:
00675       break;
00676 
00677     case MAO_MUTEX:
00678     case MAO_MUTEX_W_OS_SEM:
00679       switch (mem_get_access (&mao))
00680         {
00681         case -1:
00682           rcs_print_error ("SHMEM: Can't take semaphore\n");
00683           second_read = 0;
00684           return (status = CMS_MISC_ERROR);
00685         case -2:
00686           if (timeout > 0)
00687             {
00688               rcs_print_error ("SHMEM: Timed out waiting for semaphore.\n");
00689               rcs_print_error ("buffer = %s, timeout = %lf sec.\n",
00690                                BufferName, timeout);
00691             }
00692           second_read = 0;
00693           return (status = CMS_TIMED_OUT);
00694         default:
00695           break;
00696         }
00697       toggle_bit = mao.toggle_bit;
00698       break;
00699 
00700     case OS_SEM_MUTEX:
00701       if (sem == NULL)
00702         {
00703           second_read = 0;
00704           return (status = CMS_MISC_ERROR);
00705         }
00706       switch (sem->wait ())
00707         {
00708         case -1:
00709           rcs_print_error ("SHMEM: Can't take semaphore\n");
00710           second_read = 0;
00711           return (status = CMS_MISC_ERROR);
00712         case -2:
00713           if (timeout > 0)
00714             {
00715               rcs_print_error ("SHMEM: Timed out waiting for semaphore.\n");
00716               rcs_print_error ("buffer = %s, timeout = %lf sec.\n",
00717                                BufferName, timeout);
00718             }
00719           second_read = 0;
00720           return (status = CMS_TIMED_OUT);
00721         default:
00722           break;
00723         }
00724       break;
00725 
00726     case NO_INTERRUPTS_MUTEX:
00727 #ifdef LYNX
00728       disable (interrupt_disable_number);
00729       break;
00730 #else
00731 #ifdef VXWORKS
00732       intLockKey = intLock ();
00733       break;
00734 #else
00735       rcs_print_error ("Interrupts can not be disabled.\n");
00736       second_read = 0;
00737       return (status = CMS_MISC_ERROR);
00738       break;
00739 #endif
00740 #endif
00741 
00742     case NO_SWITCHING_MUTEX:
00743 #ifdef lynxosPC
00744       fa_ptr->preempt++;
00745       break;
00746 #else
00747 #if 0
00748 // The  LYNX documentation says this should work but the
00749 // symbol sdisable is not available.
00750       sdisable (switching_disable_number);
00751       break;
00752 #else
00753 #ifdef VXWORKS
00754       taskLock ();
00755       break;
00756 #else
00757       rcs_print_error ("Interrupts can not be disabled.\n");
00758       return (status = CMS_MISC_ERROR);
00759       break;
00760 #endif
00761 #endif
00762 #endif
00763     default:
00764       rcs_print_error ("SHMEM: Invalid mutex type.(%d)\n", mutex_type);
00765       second_read = 0;
00766       return (status = CMS_MISC_ERROR);
00767       break;
00768     }
00769 
00770   if (second_read > 0 && enable_diagnostics)
00771     {
00772       disable_diag_store = 1;
00773     }
00774 
00775   /* Perform access function. */
00776   internal_access (shm->addr, size, _local);
00777 
00778   disable_diag_store = 0;
00779 
00780   if (NULL != bsem &&
00781       (internal_access_type == CMS_WRITE_ACCESS
00782        || internal_access_type == CMS_WRITE_IF_READ_ACCESS))
00783     {
00784 #ifndef WIN32
00785       bsem->flush ();
00786 #else
00787       if (!PulseEvent (bsem))
00788         {
00789           rcs_print_sys_error (GETLASTERROR_ERROR_SOURCE, "PulseEvent error");
00790         }
00791 #endif
00792     }
00793   switch (mutex_type)
00794     {
00795     case NO_MUTEX:
00796       break;
00797 
00798     case MAO_MUTEX:
00799     case MAO_MUTEX_W_OS_SEM:
00800       mem_release_access (&mao);
00801       break;
00802 
00803     case OS_SEM_MUTEX:
00804       sem->post ();
00805       break;
00806     case NO_INTERRUPTS_MUTEX:
00807 #ifdef LYNX
00808       restore (interrupt_disable_number);
00809       break;
00810 #else
00811 #ifdef VXWORKS
00812       intUnlock (intLockKey);
00813 #else
00814       rcs_print_error ("Can not restore interrupts.\n");
00815       break;
00816 #endif
00817 #endif
00818 
00819     case NO_SWITCHING_MUTEX:
00820 #ifdef lynxosPC
00821       if ((!(--(fa_ptr->preempt)) || fa_ptr->preempt > 0x40) && fa_ptr->flag)
00822         {
00823           fast_enable_preemption ();
00824         }
00825       break;
00826 #else
00827 #if 0
00828       // The  LYNX documentation says this should work but
00829       // the symbol srestore is not available.
00830       srestore (switching_disable_number);
00831       break;
00832 #else
00833 #ifdef VXWORKS
00834       taskUnlock ();
00835       break;
00836 #else
00837       rcs_print_error ("Can not restore interrupts.\n");
00838       break;
00839 #endif
00840 #endif
00841 #endif
00842     }
00843 
00844   switch (internal_access_type)
00845     {
00846 
00847     case CMS_READ_ACCESS:
00848       if (NULL != bsem && status == CMS_READ_OLD &&
00849           (blocking_timeout > 1e-6 || blocking_timeout < -1E-6))
00850         {
00851           if (second_read > 10 && total_subdivisions <= 1)
00852             {
00853               status = CMS_MISC_ERROR;
00854               rcs_print_error
00855                 ("CMS: Blocking semaphore error. The semaphore wait has returned %d times but there is still no new data.\n",
00856                  second_read);
00857               second_read = 0;
00858               return (status);
00859             }
00860 #ifndef WIN32
00861           second_read++;
00862           bsem->timeout = blocking_timeout;
00863 #if !defined(VXWORKS) && !defined(WIN32)
00864           sem_force_fifo = 1;
00865 #endif
00866           int bsem_ret = bsem->wait ();
00867 #if !defined(VXWORKS) && !defined(WIN32)
00868           sem_force_fifo = 0;
00869 #endif
00870           if (bsem_ret == -2)
00871             {
00872               status = CMS_TIMED_OUT;
00873               second_read = 0;
00874               return (status);
00875             }
00876           if (bsem_ret == -1)
00877             {
00878               rcs_print_error ("CMS: Blocking semaphore error.\n");
00879               status = CMS_MISC_ERROR;
00880               second_read = 0;
00881               return (status);
00882             }
00883 #else
00884           DWORD timeoutMillis = (DWORD) (blocking_timeout * 1000.0);
00885           if (blocking_timeout < 0)
00886             {
00887               timeoutMillis = INFINITE;
00888             }
00889           switch (WaitForSingleObject (bsem, timeoutMillis))
00890             {
00891             case WAIT_TIMEOUT:
00892               status = CMS_TIMED_OUT;
00893               second_read = 0;
00894               return (status);
00895 
00896             case WAIT_OBJECT_0:
00897               second_read++;
00898               break;
00899 
00900             default:
00901               rcs_print_sys_error (GETLASTERROR_ERROR_SOURCE,
00902                                    "WaitForSingleObject error");
00903               status = CMS_MISC_ERROR;
00904               second_read = 0;
00905               return (status);
00906             }
00907 #endif
00908           main_access (_local);
00909         }
00910       break;
00911 
00912     case CMS_WRITE_ACCESS:
00913     case CMS_WRITE_IF_READ_ACCESS:
00914 #if 0
00915       if (NULL != bsem)
00916         {
00917 #ifndef WIN32
00918           bsem->flush ();
00919 #else
00920           if (!PulseEvent (bsem))
00921             {
00922               rcs_print_sys_error (GETLASTERROR_ERROR_SOURCE,
00923                                    "PulseEvent error");
00924             }
00925 #endif
00926         }
00927 #endif
00928       break;
00929 
00930     default:
00931       break;
00932 
00933     }
00934 
00935   second_read = 0;
00936   return (status);
00937 }

int SHMEM::open void    [private]
 

Reimplemented from CMS.

Definition at line 253 of file shmem.cc.

Referenced by SHMEM().

00254 {
00255   /* Set pointers to NULL incase error occurs. */
00256   sem = NULL;
00257   shm = NULL;
00258   bsem = NULL;
00259   shm_addr_offset = NULL;
00260   second_read = 0;
00261   autokey_table_size = 0;
00262 
00263   if (use_autokey_for_connection_number)
00264     {
00265       autokey_table_size = sizeof (AUTOKEY_TABLE_ENTRY) * total_connections;
00266     }
00267 
00268   /* set up the shared memory address and semaphore, in given state */
00269   if (master)
00270     {
00271       shm = new RCS_SHAREDMEM (key, size, RCS_SHAREDMEM_CREATE, (int) MODE);
00272       if (shm->addr == NULL)
00273         {
00274           switch (shm->create_errno)
00275             {
00276 #ifndef UNDER_CE
00277             case EACCES:
00278               status = CMS_PERMISSIONS_ERROR;
00279               break;
00280 
00281             case EEXIST:
00282               status = CMS_RESOURCE_CONFLICT_ERROR;
00283               break;
00284 
00285             case ENOMEM:
00286             case ENOSPC:
00287               status = CMS_CREATE_ERROR;
00288               break;
00289 
00290 #endif
00291 
00292             default:
00293               status = CMS_MISC_ERROR;
00294             }
00295           delete shm;
00296           shm = NULL;
00297           return -1;
00298         }
00299       if (use_os_sem)
00300         {
00301           sem =
00302             new RCS_SEMAPHORE (key, RCS_SEMAPHORE_CREATE, timeout, (int) MODE,
00303                                (use_os_sem_only != 0));
00304           if (NULL == sem)
00305             {
00306               rcs_print_error ("CMS: couldn't create RCS_SEMAPHORE.\n");
00307               rcs_print_error (" Possibly out of memory?\n");
00308               status = CMS_CREATE_ERROR;
00309               return -1;
00310             }
00311           if (!sem->valid ())
00312             {
00313               rcs_print_error ("CMS: RCS_SEMAPHORE is invalid.\n");
00314               status = CMS_MISC_ERROR;
00315               return -1;
00316             }
00317         }
00318       if (bsem_key > 0)
00319         {
00320 #ifndef WIN32
00321           bsem = new RCS_SEMAPHORE (bsem_key, RCS_SEMAPHORE_CREATE,
00322                                     timeout, (int) MODE, 0);
00323           if (NULL == bsem)
00324             {
00325               rcs_print_error ("CMS: couldn't create RCS_SEMAPHORE.\n");
00326               rcs_print_error (" Possibly out of memory?\n");
00327               status = CMS_CREATE_ERROR;
00328               return -1;
00329             }
00330           if (!bsem->valid ())
00331             {
00332               rcs_print_error ("CMS: RCS_SEMAPHORE is invalid.\n");
00333               status = CMS_MISC_ERROR;
00334               return -1;
00335             }
00336 #else
00337           char bsem_event_name[80];
00338 #ifndef NO_STDIO
00339           sprintf (bsem_event_name, "event%d", bsem_key);
00340 #else
00341           strcpy (bsem_event_name, "event");
00342           _itoa (bsem_key, bsem_event_name + 5, 10);
00343 #endif
00344 #ifndef UNDER_CE
00345           SECURITY_ATTRIBUTES sa;
00346           SECURITY_DESCRIPTOR sd;
00347           if (FALSE ==
00348               InitializeSecurityDescriptor (&sd,
00349                                             SECURITY_DESCRIPTOR_REVISION))
00350             {
00351               rcs_print_sys_error (GETLASTERROR_ERROR_SOURCE,
00352                                    "Can not initailize security descriptor.\n");
00353               status = CMS_MISC_ERROR;
00354               return -1;
00355             }
00356           sa.nLength = sizeof (SECURITY_ATTRIBUTES);
00357           sa.lpSecurityDescriptor = &sd;
00358           sa.bInheritHandle = TRUE;
00359           bsem = CreateEvent (&sa, TRUE, FALSE, bsem_event_name);
00360 #else
00361 #ifdef UNICODE
00362           wchar_t wbsem_event_name[80];
00363           RCS_CE_ASCII_TO_UNICODE (wbsem_event_name, bsem_event_name, 80);
00364           bsem = CreateEvent (NULL, TRUE, FALSE, wbsem_event_name);
00365 #else
00366           bsem = CreateEvent (NULL, TRUE, FALSE, bsem_event_name);
00367 #endif
00368 #endif
00369           if (NULL == bsem)
00370             {
00371               rcs_print_sys_error (GETLASTERROR_ERROR_SOURCE,
00372                                    "CreateEvent error:");
00373             }
00374 #endif
00375         }
00376       in_buffer_id = 0;
00377     }
00378   else
00379     {
00380       shm = new RCS_SHAREDMEM (key, size, RCS_SHAREDMEM_NOCREATE);
00381       if (NULL == shm)
00382         {
00383           rcs_print_error
00384             ("CMS: couldn't create RCS_SHAREDMEM(%d(0x%X), %d(0x%X), RCS_SHAREDMEM_NOCREATE).\n",
00385              key, key, size, size);
00386           status = CMS_CREATE_ERROR;
00387           return -1;
00388         }
00389       if (shm->addr == NULL)
00390         {
00391           switch (shm->create_errno)
00392             {
00393 #ifndef UNDER_CE
00394             case EACCES:
00395               status = CMS_PERMISSIONS_ERROR;
00396               break;
00397 
00398             case EEXIST:
00399               status = CMS_RESOURCE_CONFLICT_ERROR;
00400               break;
00401 
00402             case ENOENT:
00403               status = CMS_NO_MASTER_ERROR;
00404               break;
00405 
00406             case ENOMEM:
00407             case ENOSPC:
00408               status = CMS_CREATE_ERROR;
00409               break;
00410 
00411 #endif
00412 
00413             default:
00414               status = CMS_MISC_ERROR;
00415             }
00416           delete shm;
00417           shm = NULL;
00418           return -1;
00419         }
00420       if (use_os_sem)
00421         {
00422           sem = new RCS_SEMAPHORE (key, RCS_SEMAPHORE_NOCREATE, timeout);
00423           if (NULL == sem)
00424             {
00425               rcs_print_error ("CMS: couldn't create RCS_SEMAPHORE.\n");
00426               rcs_print_error (" Possibly out of memory?\n");
00427               status = CMS_CREATE_ERROR;
00428               return -1;
00429             }
00430           if (!sem->valid ())
00431             {
00432               rcs_print_error ("CMS: RCS_SEMAPHORE is invalid.\n");
00433               status = CMS_MISC_ERROR;
00434               return -1;
00435             }
00436         }
00437       if (bsem_key > 0)
00438         {
00439 #ifndef WIN32
00440           bsem =
00441             new RCS_SEMAPHORE (bsem_key, RCS_SEMAPHORE_NOCREATE, timeout);
00442           if (NULL == bsem)
00443             {
00444               rcs_print_error ("CMS: couldn't create RCS_SEMAPHORE.\n");
00445               rcs_print_error (" Possibly out of memory?\n");
00446               status = CMS_CREATE_ERROR;
00447               return -1;
00448             }
00449           if (!bsem->valid ())
00450             {
00451               rcs_print_error ("CMS: RCS_SEMAPHORE is invalid.\n");
00452               status = CMS_MISC_ERROR;
00453               return -1;
00454             }
00455 #else
00456           char bsem_event_name[80];
00457 #ifndef NO_STDIO
00458           sprintf (bsem_event_name, "event%d", bsem_key);
00459 #else
00460           strcpy (bsem_event_name, "event");
00461           _itoa (bsem_key, bsem_event_name + 5, 10);
00462 #endif
00463 #ifndef UNDER_CE
00464           bsem = OpenEvent (EVENT_ALL_ACCESS, TRUE, bsem_event_name);
00465 #else
00466 #ifdef UNICODE
00467           wchar_t wbsem_event_name[80];
00468           RCS_CE_ASCII_TO_UNICODE (wbsem_event_name, bsem_event_name, 80);
00469           bsem = CreateEvent (NULL, TRUE, FALSE, wbsem_event_name);
00470 #else
00471           bsem = CreateEvent (NULL, TRUE, FALSE, bsem_event_name);
00472 #endif
00473 #endif
00474           if (NULL == bsem)
00475             {
00476               rcs_print_sys_error (GETLASTERROR_ERROR_SOURCE,
00477                                    "OpenEvent error:");
00478             }
00479 #endif
00480         }
00481     }
00482 
00483   if (min_compatible_version < 3.44 && min_compatible_version > 0)
00484     {
00485       total_subdivisions = 1;
00486     }
00487 
00488   if (min_compatible_version > 2.57 || min_compatible_version <= 0)
00489     {
00490       if (!shm->created)
00491         {
00492           char *cptr = (char *) shm->addr;
00493           cptr[31] = 0;
00494           if (strncmp (cptr, BufferName, 31))
00495             {
00496               rcs_print_error
00497                 ("Shared memory buffers %s and %s may conflict. (key=%d(0x%X))\n",
00498                  BufferName, cptr, key, key);
00499               strncpy (cptr, BufferName, 32);
00500             }
00501         }
00502       if (master)
00503         {
00504           if (use_autokey_for_connection_number)
00505             {
00506               void *autokey_table_end =
00507                 (void *) (((char *) shm->addr) + 32 + autokey_table_size);
00508               memset (autokey_table_end, 0, size - 32 - autokey_table_size);
00509             }
00510           strncpy ((char *) shm->addr, BufferName, 32);
00511         }
00512       if (use_autokey_for_connection_number)
00513         {
00514           void *autokey_table = (void *) (((char *) shm->addr) + 32);
00515           connection_number =
00516             autokey_getkey (autokey_table, total_connections, ProcessName);
00517           shm_addr_offset =
00518             (void *) ((char *) (shm->addr) + 32 + autokey_table_size);
00519           max_message_size -= (32 + autokey_table_size);        /* size of cms buffer available for user */
00520         }
00521       else
00522         {
00523           shm_addr_offset = (void *) ((char *) (shm->addr) + 32);
00524           max_message_size -= 32;       /* size of cms buffer available for user */
00525         }
00526       /* messages = size - CMS Header space */
00527       if (enc_max_size <= 0 || enc_max_size > size)
00528         {
00529           if (neutral)
00530             {
00531               max_encoded_message_size -= 32;
00532             }
00533           else
00534             {
00535               max_encoded_message_size -=
00536                 (cms_encoded_data_explosion_factor * 32);
00537             }
00538         }
00539       /* Maximum size of message after being encoded. */
00540       guaranteed_message_space -= 32;   /* Largest size message before being encoded
00541                                            that can be guaranteed to fit after xdr. */
00542       size -= 32;
00543       size_without_diagnostics -= 32;
00544       subdiv_size =
00545         (size_without_diagnostics - total_connections) / total_subdivisions;
00546       subdiv_size -= (subdiv_size % 4);
00547     }
00548   else
00549     {
00550       if (master)
00551         {
00552           memset (shm->addr, 0, size);
00553         }
00554       shm_addr_offset = shm->addr;
00555     }
00556   skip_area = 32 + total_connections + autokey_table_size;
00557   mao.data = shm_addr_offset;
00558   mao.timeout = timeout;
00559   mao.total_connections = total_connections;
00560   mao.sem_delay = sem_delay;
00561   mao.connection_number = connection_number;
00562   mao.split_buffer = split_buffer;
00563   mao.read_only = 0;
00564   mao.sem = sem;
00565 
00566   fast_mode = !queuing_enabled && !split_buffer && !neutral &&
00567     (mutex_type == NO_SWITCHING_MUTEX);
00568   handle_to_global_data = dummy_handle = new PHYSMEM_HANDLE;
00569   handle_to_global_data->set_to_ptr (shm_addr_offset, size);
00570   if ((connection_number < 0 || connection_number >= total_connections)
00571       && (mutex_type == MAO_MUTEX || mutex_type == MAO_MUTEX_W_OS_SEM))
00572     {
00573       rcs_print_error ("Bad connection number %d\n", connection_number);
00574       status = CMS_MISC_ERROR;
00575       return -1;
00576     }
00577   return 0;
00578 }

int SHMEM::close   [private]
 

Definition at line 582 of file shmem.cc.

Referenced by ~SHMEM().

00583 {
00584   int nattch = 0;
00585   second_read = 0;
00586 
00587   if (use_autokey_for_connection_number)
00588     {
00589       void *autokey_table = (void *) (((char *) shm->addr) + 32);
00590       autokey_releasekey (autokey_table, total_connections, ProcessName,
00591                           connection_number);
00592     }
00593   if (NULL != shm)
00594     {
00595       /* see if we're the last one */
00596       nattch = shm->nattch ();
00597       shm->delete_totally = delete_totally;
00598       delete shm;
00599       shm = NULL;
00600     }
00601   if (NULL != sem)
00602     {
00603       /* if we're the last one, then make us the master so that the
00604          semaphore will go away */
00605       if (nattch <= 1 || delete_totally)
00606         {
00607           sem->setflag (RCS_SEMAPHORE_CREATE);
00608         }
00609       else
00610         {
00611           sem->setflag (RCS_SEMAPHORE_NOCREATE);
00612         }
00613       delete sem;
00614     }
00615 #ifndef WIN32
00616   if (NULL != bsem)
00617     {
00618       /* if we're the last one, then make us the master so that the
00619          semaphore will go away */
00620       if (nattch <= 1 || delete_totally)
00621         {
00622           bsem->setflag (RCS_SEMAPHORE_CREATE);
00623         }
00624       else
00625         {
00626           bsem->setflag (RCS_SEMAPHORE_NOCREATE);
00627         }
00628       delete bsem;
00629     }
00630 #endif
00631 
00632 #ifdef DEBUG
00633   printf ("SHMEM(%s): nattch = %d\n", BufferName, nattch);
00634 #endif
00635 
00636   return 0;
00637 }


Field Documentation

int SHMEM::fast_mode [private]
 

Reimplemented from CMS.

Definition at line 70 of file shmem.hh.

key_t SHMEM::key [private]
 

Definition at line 79 of file shmem.hh.

key_t SHMEM::bsem_key [private]
 

Definition at line 80 of file shmem.hh.

int SHMEM::second_read [private]
 

Definition at line 81 of file shmem.hh.

RCS_SHAREDMEM* SHMEM::shm [private]
 

Definition at line 82 of file shmem.hh.

RCS_SEMAPHORE* SHMEM::sem [private]
 

Definition at line 83 of file shmem.hh.

int SHMEM::master [private]
 

Definition at line 84 of file shmem.hh.

double SHMEM::sem_delay [private]
 

Definition at line 86 of file shmem.hh.

struct mem_access_object SHMEM::mao [private]
 

Definition at line 87 of file shmem.hh.

int SHMEM::use_os_sem [private]
 

Definition at line 98 of file shmem.hh.

int SHMEM::use_os_sem_only [private]
 

Definition at line 99 of file shmem.hh.

SHMEM_MUTEX_TYPE SHMEM::mutex_type [private]
 

Definition at line 101 of file shmem.hh.

void* SHMEM::shm_addr_offset [private]
 

Definition at line 102 of file shmem.hh.

RCS_SEMAPHORE* SHMEM::bsem [private]
 

Definition at line 107 of file shmem.hh.

int SHMEM::autokey_table_size [private]
 

Definition at line 109 of file shmem.hh.


The documentation for this class was generated from the following files:
Generated on Sun Dec 2 15:59:18 2001 for rcslib by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001