I have a program that loads a very large avl tree and then opens a shared memory area and waits for requests (with semaphores to order the queueing). The client program connects to the shared memory area on startup but I would like it to check the status of the shared memory before each request. I have had instances where the client program seems to get stuck (for want of a better word) waiting for a reply. I am using Posix shared memory.
The code for connecting to the shared memory area is:
And the code for issueing request is:Code:/* open and map shared memory that server must create */ FILE_DESC = shm_open(SHM_NAME, O_RDWR, 0666); if ( FILE_DESC < 0 ) { /* An error occurred, exit function */ TRACE(("SHM Message: Error occurred opening shared memory exiting\n")); return(0); } SHARED_MEM_PTR = mmap(NULL, sizeof(SHM_STRUCT), PROT_READ | PROT_WRITE, MAP_SHARED, FILE_DESC, 0); if ( SHARED_MEM_PTR < 0 ) { /* An error occurred, exit function */ TRACE(("SHM Message: Error mapping shared file exiting\n")); return(0); } /* Shared memory successfully attached to, set global variable to true */ SETTINGS.SHARED_MEM = TRUE; TRACE(("SHM Message: Shared memory successfully created\n")); /* Now exit successfully */ return(1);
ThanksCode:if ((SETTINGS.CDR_WRITE_ICF || SETTINGS.CDR_SHOW_ICF) && SETTINGS.SHARED_MEM) { /* Currently we have to assume that shared memory is available and proceeed * as normal. */ /* UL-CR6572 Need to ensure that 11 characters are passed to the search engine and that * it is left padded with zeros especially for authcodes */ sprintf( ptr->BillNumber, "%011s", ptr->billing_number ); /* UL-CR6572 */ sem_wait(&SHARED_MEM_PTR->ControlSem); strcpy(SHARED_MEM_PTR->SrchCliNum, ptr->BillNumber); sem_post(&SHARED_MEM_PTR->RequestSem); sem_wait(&SHARED_MEM_PTR->AnswerSem); strcat(ptr->AccountNumber, SHARED_MEM_PTR->RtrnAcctNum); sem_post(&SHARED_MEM_PTR->ControlSem); }



LinkBack URL
About LinkBacks


