#include <shmem.hh>
Inheritance diagram for SHMEM:
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_SHAREDMEM * | shm |
RCS_SEMAPHORE * | sem |
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_SEMAPHORE * | bsem |
int | autokey_table_size |
|
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 }; |
|
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 } |
|
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 } |
|
Definition at line 243 of file shmem.cc. 00244 { 00245 /* detach from shared memory and semaphores */ 00246 close (); 00247 } |
|
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 } |
|
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 } |
|
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 } |
|
Reimplemented from CMS. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|