From: Marek P. <ma...@us...> - 2002-01-26 10:19:47
|
Update of /cvsroot/javaprofiler/library/src/commun3 In directory usw-pr-cvs1:/tmp/cvs-serv15950/src/commun3 Modified Files: communShMem.cpp communShMem.h semaphore.cpp semaphore.h Log Message: shared memory communication for linux fixed Index: communShMem.cpp =================================================================== RCS file: /cvsroot/javaprofiler/library/src/commun3/communShMem.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -r1.6 -r1.7 *** communShMem.cpp 2001/11/21 22:31:42 1.6 --- communShMem.cpp 2002/01/26 10:19:44 1.7 *************** *** 35,58 **** #include "../commun3/communShMem.h" ! Commun& CommunShMem::operator>>( Buffer& b) { ! void* p = _shmem.getAddress(); ! int shmemSize = _shmem.getSize(); ! _isem.wait(); ! jint size = (signed)ntohl( *(jint*)p); ! if( size < 0) { ! _failed = 1; ! _isem.release(); ! ! return *this; ! } ! _isem.release(); ! if( size) { jint num = size/shmemSize; --- 35,67 ---- #include "../commun3/communShMem.h" ! CommunShMem::CommunShMem( const String& shmemId, int size) : ! _sem1( String( "1") + shmemId + "XXXXXXXXXX"), ! _sem2( String( "2") + shmemId + "XXXXXXXXXX"), ! ! _shmem( String( "3") + shmemId + "XXXXXXXXXX", size) { ! } ! CommunShMem::~CommunShMem() { ! *(jint*)(_shmem.getAddress()) = -1; ! _sem1.reset(); ! _sem1.release(); ! _sem2.reset(); ! _sem2.release(); ! } ! Commun& CommunShMem::operator>>( Buffer& b) { + void* p = _shmem.getAddress(); + int shmemSize = _shmem.getSize(); + + jint size = *(jint*)p; + + if( size < 0 || !checkClient()) _failed = 1; + else if( size) { + jint num = size/shmemSize; *************** *** 65,84 **** _sem1.wait(); memcpy( q, p, shmemSize); } jint rest = size%shmemSize; ! if( rest) { _sem2.release(); _sem1.wait(); ! memcpy( q, p, rest); } - - _sem2.release(); - - b = Buffer( buf, size); delete[] buf; } --- 74,96 ---- _sem1.wait(); + _failed = !checkClient(); + if( _failed) break; + memcpy( q, p, shmemSize); } + _failed = !checkClient(); + jint rest = size%shmemSize; ! if( rest && !_failed) { _sem2.release(); _sem1.wait(); ! _failed = !checkClient(); ! if( !_failed) memcpy( q, p, rest); } + if( !_failed) b = Buffer( buf, size); delete[] buf; } *************** *** 93,138 **** int shmemSize = _shmem.getSize(); ! _isem.wait(); ! if( (signed)ntohl( *(jint*)p) < 0) { ! ! _failed = 1; ! _isem.release(); ! return *this; ! } ! ! _isem.release(); ! jint size = b.getSize(); ! *(jint*)p = htonl( size); ! if( size) { ! ! _sem2.release(); ! _sem1.wait(); ! ! jint num = size/shmemSize; ! const char* q = b.getBuffer(); ! for( int i = 0; i < num; i++, q += shmemSize) { ! memcpy( p, q, shmemSize); ! _sem2.release(); ! _sem1.wait(); ! } ! jint rest = size%shmemSize; ! if( rest) { ! ! memcpy( p, q, rest); ! _sem2.release(); ! _sem1.wait(); } } ! else _sem2.release(); return *this; --- 105,145 ---- int shmemSize = _shmem.getSize(); ! if( *(jint*)p < 0 || !checkClient()) _failed = 1; ! else { ! jint size = b.getSize(); ! *(jint*)p = size; ! if( size) { ! jint num = size/shmemSize; ! const char* q = b.getBuffer(); ! for( int i = 0; i < num; i++, q += shmemSize) { ! _sem2.release(); ! _sem1.wait(); ! _failed = !checkClient(); ! if( _failed) break; ! memcpy( p, q, shmemSize); ! } ! _failed = !checkClient(); ! jint rest = size%shmemSize; ! if( rest && !_failed) { ! _sem2.release(); ! _sem1.wait(); ! ! _failed = !checkClient(); ! if( !_failed) memcpy( p, q, rest); ! } } } ! ! _sem2.release(); return *this; *************** *** 141,196 **** int CommunShMem::isReady() { - _isem.wait(); - _failed = ( (signed)ntohl( *(jint*)(_shmem.getAddress())) < 0); - _isem.release(); - - if( _failed) return 0; - - int rc = _sem1.waitNoBlock(); - if( _failed = (rc < 0)) return 0; - - return rc; - } - - int CommunShMem::initialize() { - - _isem.wait(); - *(jint*)(_shmem.getAddress()) = htonl( 0); - _failed = 0; - _isem.release(); - _sem1.wait(); - _sem1.release(); return 1; } - - CommunShMem::CommunShMem( const String& shmemId, int size) : ! _sem1( String( "1") + shmemId + "XXXXXXXXXX"), ! _sem2( String( "2") + shmemId + "XXXXXXXXXX"), ! _isem( String( "3") + shmemId + "XXXXXXXXXX", 1), ! _shmem( String( "4") + shmemId + "XXXXXXXXXX", size) { ! _sem1.release(); _sem1.wait(); ! _sem2.release(); ! _sem2.wait(); ! *(jint*)(_shmem.getAddress()) = htonl( 0); ! _isem.release(); ! }; ! CommunShMem::~CommunShMem() { ! _isem.wait(); ! _sem2.release(); ! _sem1.release(); ! ! *(jint*)(_shmem.getAddress()) = htonl( (unsigned)(-1)); ! ! _isem.release(); } --- 148,183 ---- int CommunShMem::isReady() { _sem1.wait(); return 1; } ! int CommunShMem::initialize() { ! _sem1.reset(); _sem1.wait(); ! _failed = ( *(jint*)_shmem.getAddress() < 0); ! #ifdef WIN32 ! #error FIXME ! #else ! pid_t* p = (pid_t*)((jint*)(_shmem.getAddress())+1); ! ! _pid = *p; ! *p = getpid(); ! #endif ! _sem2.release(); ! return !_failed; ! } ! int CommunShMem::checkClient() { ! #ifdef WIN32 ! #error FIXME ! #else ! return !kill( _pid, 0); ! #endif } Index: communShMem.h =================================================================== RCS file: /cvsroot/javaprofiler/library/src/commun3/communShMem.h,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -r1.5 -r1.6 *** communShMem.h 2001/11/21 22:31:42 1.5 --- communShMem.h 2002/01/26 10:19:44 1.6 *************** *** 55,70 **** class CommunShMem: public Commun { ! /// read-write semaphore Semaphore _sem1; ! /// write-read semaphore Semaphore _sem2; - /// init semaphore - Semaphore _isem; - /// shared memory SharedMemory _shmem; public: --- 55,74 ---- class CommunShMem: public Commun { ! /// semaphore Semaphore _sem1; ! /// semaphore Semaphore _sem2; /// shared memory SharedMemory _shmem; + #ifdef WIN32 + #error FIXME + #else + /// client process ID + pid_t _pid; + #endif + public: *************** *** 120,123 **** --- 124,137 ---- virtual int isReady(); + + private: + + /** Check client. This routine checks if the client + ** is still connected and is alive. + ** + ** @return 1 (ok); + ** 0 (failed, not connected) */ + + int checkClient(); }; Index: semaphore.cpp =================================================================== RCS file: /cvsroot/javaprofiler/library/src/commun3/semaphore.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -r1.1 -r1.2 *** semaphore.cpp 2001/11/21 22:31:42 1.1 --- semaphore.cpp 2002/01/26 10:19:44 1.2 *************** *** 35,45 **** #include "../commun3/semaphore.h" ! Semaphore::Semaphore( const String& name, int locked) { #ifdef WIN32 ! _semid = CreateSemaphore( NULL, (( locked) ? 0 : 1), 1, name); #else _semid = semget( *(key_t*)(const char*)name, 1, 0666 | IPC_CREAT); ! _initLocked = locked; #endif } --- 35,46 ---- #include "../commun3/semaphore.h" ! Semaphore::Semaphore( const String& name) { #ifdef WIN32 ! #error FIXME ! // _semid = CreateSemaphore( NULL, (( locked) ? 0 : 1), 1, name); #else _semid = semget( *(key_t*)(const char*)name, 1, 0666 | IPC_CREAT); ! semctl( _semid, 0, SETVAL, 1); #endif } *************** *** 48,52 **** #ifdef WIN32 ! CloseHandle( _semid); #else #endif --- 49,54 ---- #ifdef WIN32 ! #error FIXME ! // CloseHandle( _semid); #else #endif *************** *** 56,72 **** #ifdef WIN32 ! WaitForSingleObject( _semid, INFINITE); ! Sleep( 0); #else ! if( _initLocked) { ! ! static sembuf sop = { 0, -1, SEM_UNDO}; ! semop( _semid, &sop, 1); ! } ! else { ! ! static sembuf sop[2] = { 0, 0, 0, 0, 1, SEM_UNDO}; ! semop( _semid, sop, 2); ! } #endif } --- 58,67 ---- #ifdef WIN32 ! #error FIXME ! // WaitForSingleObject( _semid, INFINITE); ! // Sleep( 0); #else ! static sembuf sop[2] = { 0, 0, 0, 0, 1, SEM_UNDO}; ! semop( _semid, sop, 2); #endif } *************** *** 75,114 **** #ifdef WIN32 ! ReleaseSemaphore( _semid, 1, NULL); ! //Sleep( 0); #else ! if( _initLocked) { ! ! static sembuf sop = { 0, 1, SEM_UNDO}; ! semop( _semid, &sop, 1); ! } ! else { ! ! static sembuf sop = { 0, -1, SEM_UNDO | IPC_NOWAIT}; ! semop( _semid, &sop, 1); ! } #endif } ! int Semaphore::waitNoBlock() { #ifdef WIN32 ! unsigned long rc = WaitForSingleObject( _semid, 0); ! Sleep( 0); ! ! if( rc == WAIT_FAILED) return -1; ! if( rc == WAIT_TIMEOUT) return 0; #else ! if( _initLocked) { ! ! static sembuf sop = { 0, -1, SEM_UNDO | IPC_NOWAIT}; ! if( semop( _semid, &sop, 1)) return 0; ! } ! else { ! ! static sembuf sop[2] = { 0, 0, IPC_NOWAIT, 0, 1, SEM_UNDO}; ! if( semop( _semid, sop, 2)) return 0; ! } #endif - return 1; } --- 70,88 ---- #ifdef WIN32 ! #error FIXME ! // ReleaseSemaphore( _semid, 1, NULL); ! ////Sleep( 0); #else ! static sembuf sop = { 0, -1, SEM_UNDO | IPC_NOWAIT}; ! semop( _semid, &sop, 1); #endif } ! void Semaphore::reset() { #ifdef WIN32 ! #error FIXME #else ! semctl( _semid, 0, SETVAL, 1); #endif } Index: semaphore.h =================================================================== RCS file: /cvsroot/javaprofiler/library/src/commun3/semaphore.h,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -r1.6 -r1.7 *** semaphore.h 2001/11/21 22:31:42 1.6 --- semaphore.h 2002/01/26 10:19:44 1.7 *************** *** 41,44 **** --- 41,45 ---- /** Binary semaphore. This class implements IPC semaphore. ** Implementation of this class is platform/system dependent. + ** Semaphore is automatically locked after it is created. ** ** @author Marek Przeczek */ *************** *** 52,58 **** /// unix semaphore identifier int _semid; - - /// initially locked - int _initLocked; #endif --- 53,56 ---- *************** *** 61,69 **** /** Constructor. Opens a semaphore with given name. ** If semaphore doesn't exist, new one is created. ** ! ** @param name unique name (4 characters long only) ! ** @param locked semaphore should be locked after it has been initialized */ ! Semaphore( const String& name, int locked = 0); /// Destructor. --- 59,67 ---- /** Constructor. Opens a semaphore with given name. ** If semaphore doesn't exist, new one is created. + ** It is automatically locked after it is created. ** ! ** @param name unique name (4 characters long only) */ ! Semaphore( const String& name); /// Destructor. *************** *** 85,96 **** void release(); ! /** Lock semaphore but don't block. This method locks semaphore ! ** if it is possible, if not, it returns immediatelly without locking. ! ** ! ** @return 0 (failed, already locked); ! ** 1 (okay, successfully locked); ! ** -1 (failure) */ ! int waitNoBlock(); }; --- 83,90 ---- void release(); ! /** Reset semaphore. It resets semaphore and sets its ! ** default value (locked by one). */ ! void reset(); }; |