From: Marek P. <ma...@us...> - 2002-01-26 10:19:46
|
Update of /cvsroot/javaprofiler/library/src2 In directory usw-pr-cvs1:/tmp/cvs-serv15950/src2 Modified Files: CommunShMem.cpp Log Message: shared memory communication for linux fixed Index: CommunShMem.cpp =================================================================== RCS file: /cvsroot/javaprofiler/library/src2/CommunShMem.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -r1.5 -r1.6 *** CommunShMem.cpp 2001/11/25 22:33:47 1.5 --- CommunShMem.cpp 2002/01/26 10:19:43 1.6 *************** *** 37,40 **** --- 37,43 ---- #include "../src/commun3/sharedMemory.h" + #include <iostream.h> + #include <stdio.h> + /** JNI implementation of shared memory communication. This class is ** used by native methods of Java CommunShMem class. It contains *************** *** 50,62 **** public: ! /// read-write semaphore Semaphore sem1; ! /// write-read semaphore Semaphore sem2; - /// init semaphore - Semaphore isem; - /// shared memory SharedMemory shmem; --- 53,62 ---- public: ! /// semaphore (exclusive access to shared memory) Semaphore sem1; ! /// semaphore (synchronization) Semaphore sem2; /// shared memory SharedMemory shmem; *************** *** 68,71 **** --- 68,78 ---- int communStopped; + #ifdef WIN32 + #error FIXME + #else + /// server process ID + pid_t pid; + #endif + public: *************** *** 74,92 **** ** @param shmemId shared memory identifier (3 characters long only) ** @param size size of shared memory */ - - NativeCommunShMem( 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), ! ! failed( JNI_FALSE), ! communStopped( 1) ! ! {}; /** Get pointer to data. This static method returns pointer ! ** to object of NativeCommunShMem type associated with ** this instance of Java CommunShMem object. ** --- 81,89 ---- ** @param shmemId shared memory identifier (3 characters long only) ** @param size size of shared memory */ ! NativeCommunShMem( const String& shmemId, int size); /** Get pointer to data. This static method returns pointer ! ** to instance of NativeCommunShMem class associated with ** this instance of Java CommunShMem object. ** *************** *** 98,101 **** --- 95,107 ---- public: + /** Check server. This routine checks whether server process + ** is alive or not. + ** + ** @return 1 (ok); + ** 0 (failed, doesn't exist) */ + + int checkServer(); + public: + /** Get size of buffer. This method is a native call ** of Buffer.getSize() method. *************** *** 146,149 **** --- 152,166 ---- }; + NativeCommunShMem::NativeCommunShMem( const String& shmemId, int size) : + + sem1( String( "1") + shmemId + "XXXXXXXXXX"), + sem2( String( "2") + shmemId + "XXXXXXXXXX"), + + shmem( String( "3") + shmemId + "XXXXXXXXXX", size), + + failed( JNI_FALSE), + communStopped( 1) { + } + NativeCommunShMem* NativeCommunShMem::get( JNIEnv* env, jobject obj) { *************** *** 162,165 **** --- 179,191 ---- } + int NativeCommunShMem::checkServer() { + + #ifdef WIN32 + #error FIXME + #else + return !kill( pid, 0); + #endif + } + jint NativeCommunShMem::Buffer_getSize( JNIEnv* env, jobject b) { *************** *** 236,241 **** ** @param shmemSize shared memory size ** - ** @see Java_CommunShMem_finalize() - ** ** @author Marek Przeczek */ --- 262,265 ---- *************** *** 272,277 **** ** @param obj this object ** - ** @see Java_CommunShMem_construct() - ** ** @author Marek Przeczek */ --- 296,299 ---- *************** *** 285,293 **** NativeCommunShMem* n = NativeCommunShMem::get( env, obj); ! if( !n->communStopped) ! Java_net_sourceforge_javaprofiler_jpiimpl_commun_CommunShMem_stopCommun( env, obj); ! if( n) delete n; } --- 307,357 ---- NativeCommunShMem* n = NativeCommunShMem::get( env, obj); + if( n) delete n; + } ! /** Native CommunShMem::initialize() method. It initializes ! ** communication interface thru shared memory and connects ! ** client to server side. ! ** ! ** @param env pointer to JNI environment ! ** @param obj this object ! ** ! ** @author Marek Przeczek */ ! /* ! * Class: net.sourceforge.javaprofiler.jpiimpl.commun.CommunShMem ! * Method: initialize ! * Signature: ()Z ! */ ! ! JNIEXPORT jboolean JNICALL Java_net_sourceforge_javaprofiler_jpiimpl_commun_CommunShMem_initialize ! (JNIEnv* env, jobject obj) { ! ! NativeCommunShMem* n = NativeCommunShMem::get( env, obj); ! if( !n) return JNI_FALSE; ! ! *(jint*)(n->shmem.getAddress()) = 0; ! n->communStopped = 0; ! ! n->sem2.reset(); ! ! #ifdef WIN32 ! #error FIXME ! #else ! pid_t* p = (pid_t*)((jint*)(n->shmem.getAddress())+1); ! ! *p = getpid(); ! #endif ! ! n->sem1.release(); ! n->sem2.wait(); ! ! #ifdef WIN32 ! #error FIXME ! #else ! n->pid = *p; ! #endif ! ! return JNI_TRUE; } *************** *** 301,306 **** ** @return this object ** - ** @see Java_CommunShMem_write() - ** ** @author Marek Przeczek */ --- 365,368 ---- *************** *** 317,340 **** if( !n) return obj; - n->sem2.wait(); - n->isem.wait(); - void* p = n->shmem.getAddress(); int shmemSize = n->shmem.getSize(); - - jint size = (signed)ntohl( *(jint*)p); ! if( size < 0) { ! ! n->failed = JNI_TRUE; ! n->sem2.release(); ! n->isem.release(); ! ! return obj; ! } ! n->isem.release(); ! if( size) { jint num = size/shmemSize; --- 379,391 ---- if( !n) return obj; void* p = n->shmem.getAddress(); int shmemSize = n->shmem.getSize(); ! n->sem2.wait(); ! jint size = *(jint*)p; ! if( size < 0 || !n->checkServer()) n->failed = JNI_TRUE; ! else if( size) { jint num = size/shmemSize; *************** *** 348,371 **** n->sem2.wait(); memcpy( q, p, shmemSize); } jint rest = size%shmemSize; ! if( rest) { n->sem1.release(); n->sem2.wait(); ! ! memcpy( q, p, rest); } - - n->sem1.release(); ! n->Buffer_useBuffer( env, b, buf, size); delete[] buf; } else n->Buffer_clear( env, b); ! return obj; } --- 399,431 ---- n->sem2.wait(); + if( !n->checkServer()) { + + n->failed = JNI_TRUE; + break; + } + memcpy( q, p, shmemSize); } + if( !n->checkServer()) n->failed = JNI_TRUE; + jint rest = size%shmemSize; ! if( rest && (n->failed == JNI_FALSE)) { n->sem1.release(); n->sem2.wait(); ! ! if( !n->checkServer()) n->failed = JNI_TRUE; ! else memcpy( q, p, rest); } ! if( n->failed == JNI_FALSE) n->Buffer_useBuffer( env, b, buf, size); delete[] buf; } else n->Buffer_clear( env, b); ! ! *(jint*)p = 0; ! return obj; } *************** *** 380,385 **** ** @return this object ** - ** @see Java_CommunShMem_read() - ** ** @author Marek Przeczek */ --- 440,443 ---- *************** *** 396,452 **** if( !n) return obj; - n->isem.wait(); - void* p = n->shmem.getAddress(); int shmemSize = n->shmem.getSize(); - - if( (signed)ntohl( *(jint*)p) < 0) { ! n->failed = JNI_TRUE; ! n->isem.release(); ! return obj; ! } ! ! n->communStopped = 0; ! n->isem.release(); ! jint size = n->Buffer_getSize( env, b); ! *(jint*)p = htonl( size); ! if( size) { ! ! n->sem1.release(); ! n->sem2.wait(); ! ! jint num = size/shmemSize; ! ! jbyteArray array; ! jbyte* elems = n->Buffer_getBuffer( env, b, array); ! ! jbyte* q = elems; ! ! for( int i = 0; i < num; i++, q += shmemSize) { ! ! memcpy( p, q, shmemSize); ! ! n->sem1.release(); ! n->sem2.wait(); } - - jint rest = size%shmemSize; - if( rest) { - - memcpy( p, q, rest); - - n->sem1.release(); - n->sem2.wait(); - } - - env->ReleaseByteArrayElements( array, elems, JNI_ABORT); } - else n->sem1.release(); return obj; } --- 454,507 ---- if( !n) return obj; void* p = n->shmem.getAddress(); int shmemSize = n->shmem.getSize(); ! if( *(jint*)p < 0 || !n->checkServer()) n->failed = JNI_TRUE; ! else { ! jint size = n->Buffer_getSize( env, b); ! *(jint*)p = size; ! if( size) { ! jint num = size/shmemSize; ! ! jbyteArray array; ! jbyte* elems = n->Buffer_getBuffer( env, b, array); ! ! jbyte* q = elems; ! ! for( int i = 0; i < num; i++, q += shmemSize) { ! ! n->sem1.release(); ! n->sem2.wait(); ! ! if( !n->checkServer()) { ! ! n->failed = JNI_TRUE; ! break; ! } ! ! memcpy( p, q, shmemSize); ! } ! ! if( !n->checkServer()) n->failed = JNI_TRUE; ! ! jint rest = size%shmemSize; ! if( rest && (n->failed == JNI_FALSE)) { ! ! n->sem1.release(); ! n->sem2.wait(); ! ! if( !n->checkServer()) n->failed = JNI_TRUE; ! else memcpy( p, q, rest); ! } ! env->ReleaseByteArrayElements( array, elems, JNI_ABORT); } } + n->sem1.release(); + return obj; } *************** *** 498,505 **** if( !n) return; ! n->isem.wait(); ! *(jint*)n->shmem.getAddress() = htonl( (unsigned)-1); n->communStopped = 1; ! n->isem.release(); } --- 553,561 ---- if( !n) return; ! *(jint*)(n->shmem.getAddress()) = -1; n->communStopped = 1; ! ! n->sem1.reset(); ! n->sem1.release(); } *************** *** 507,509 **** } #endif - --- 563,564 ---- |