Changeset 3833


Ignore:
Timestamp:
03/17/08 14:23:01 (12 years ago)
Author:
curtis
Message:
  • Fix problem with arrays larger than 64K.
  • More robust client-side data send and receive.
Location:
trunk/loci/jvmlink
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/jvmlink/ConnThread.java

    r3830 r3833  
    728728      boolean str = false; 
    729729      for (int i=0; i<len; i++) { 
     730        if (len > 20) { 
     731          // skip some values for large arrays 
     732          boolean changed = true; 
     733          if (i == 3) i = len / 2 - 1; 
     734          else if (i == len / 2 + 2) i = len - 3; 
     735          else changed = false; 
     736          if (changed) { 
     737            sb.append(str ? "\n\t" : " "); 
     738            sb.append("..."); 
     739          } 
     740        } 
    730741        Object o = Array.get(value, i); 
    731742        str = o instanceof String; 
  • trunk/loci/jvmlink/cpp/JVMLinkClient.cpp

    r3830 r3833  
    3636 
    3737#define DEFAULT_PORT 20345 
    38 #define MAX_PACKET_SIZE 65536 
    3938 
    4039//TODO: clear memory at appropriate points. 
     
    140139                obj->data = readString(); 
    141140                obj->size = 0; 
    142                 debug("getVar: got string: length=" << len << ", value=" << buff); 
     141                debug("getVar: got string: length=" << len << ", value=" << buf); 
    143142        } 
    144143        else { 
     
    172171                } 
    173172                else { 
    174                         int sentBytes = 0; 
    175                         int totalBytes = obj->size * obj->length; 
    176                         char* dataPointer = (char*) obj->data; 
    177                         while (sentBytes < totalBytes) { 
    178                                 char* buff = (char*) (dataPointer + sentBytes); 
    179                                 int packetSize = MAX_PACKET_SIZE; 
    180                                 if (sentBytes + MAX_PACKET_SIZE > totalBytes) { 
    181                                         packetSize = totalBytes - sentBytes; 
    182                                 } 
    183                                 send(conn, dataPointer, packetSize, 0); 
    184                                 sentBytes += packetSize; 
     173                        int sent = 0; 
     174                        int total = obj->size * obj->length; 
     175                        char* buf = (char*) obj->data; 
     176                        while (sent < total) { 
     177                                sent += send(conn, buf + sent, total - sent, 0); 
    185178                        } 
    186179                } 
     
    320313// -- Private methods -- 
    321314 
    322 int JVMLinkClient::sendMessage(CString message) { 
    323     sendInt(message.GetLength()); 
    324         return send(conn, (LPCTSTR)message, message.GetLength(), 0); 
    325 } 
    326  
    327 int JVMLinkClient::sendInt(int value) { 
    328         char* buff = (char*) (&value); 
    329         return send(conn, buff, 4, 0); 
     315void JVMLinkClient::sendMessage(CString message) { 
     316        int sent = 0; 
     317        char* buf = (char*) (LPCTSTR) message; 
     318        int total = message.GetLength(); 
     319        sendInt(total); 
     320        while (sent < total) sent += send(conn, buf + sent, total - sent, 0); 
     321} 
     322 
     323void JVMLinkClient::sendInt(int value) { 
     324        char* buf = (char*) (&value); 
     325        send(conn, buf, 4, 0); 
    330326} 
    331327 
    332328void* JVMLinkClient::readMessage(int size) { 
    333         char* buff = (char*) malloc(size); 
    334         recv(conn, buff, size, 0); //TODO: check if everything is received. 
    335         return (void*) buff; 
     329        int read = 0; 
     330        char* buf = (char*) malloc(size); 
     331        while (read < size) read += recv(conn, buf + read, size - read, 0); 
     332        return (void*) buf; 
    336333} 
    337334 
     
    341338 
    342339CString* JVMLinkClient::readString() { 
    343         int len = readInt(); 
    344         char* buff = new char[len + 1]; 
    345         int size = recv(conn, buff, len, 0); 
    346         buff[len] = '\0'; 
    347         return new CString(buff); 
    348 } 
     340        int read = 0; 
     341        int total = readInt(); 
     342        char* buf = new char[total + 1]; 
     343        while (read < total) read += recv(conn, buf + read, total - read, 0); 
     344        buf[total] = '\0'; 
     345        return new CString(buf); 
     346} 
  • trunk/loci/jvmlink/cpp/JVMLinkClient.h

    r3830 r3833  
    4444        SOCKET conn; 
    4545 
    46         int sendMessage(CString); 
     46        void sendMessage(CString); 
    4747        void* readMessage(int); 
    48         int sendInt(int); 
     48        void sendInt(int); 
    4949        int readInt(); 
    5050        CString* readString(); 
  • trunk/loci/jvmlink/cpp/TestC2.cpp

    r3830 r3833  
    6767} 
    6868 
    69 void printBytes(Byte* values, int len) { 
    70         for (int i=0; i<len; i++) std::cout << " " << values[i].data; 
     69void printBytes(Byte* values, int off, int len) { 
     70        for (int i=off; i<off+len; i++) std::cout << " " << values[i].data; 
    7171} 
    7272 
     
    216216        p->setVar("myBytes", myBytes, num); 
    217217        std::cout << "TestC2: setVar: myBytes = ["; 
    218         printBytes(myBytes, num); 
     218        printBytes(myBytes, 0, num); 
    219219        std::cout << " ]" << std::endl; 
    220220        JVMLinkObject* jvmBytes = p->getVar("myBytes"); 
    221221        std::cout << "TestC2: getVar: myBytes = ["; 
    222         printBytes(jvmBytes->getDataAsByteArray(), num); 
     222        printBytes(jvmBytes->getDataAsByteArray(), 0, num); 
    223223        std::cout << " ]" << std::endl; 
    224224 
     
    320320        p->exec("frame.setVisible(true)"); 
    321321 
     322        // large Byte array 
     323        const int big = 10000000; 
     324        Byte* largeBytes = new Byte[big]; 
     325        for (int i=0; i<big; i++) largeBytes[i] = randomByte(); 
     326 
     327        p->setVar("largeBytes", largeBytes, big); 
     328        std::cout << "TestC2: setVar: largeBytes = ["; 
     329        printBytes(largeBytes, 0, 3); 
     330        std::cout << " ..."; 
     331        printBytes(largeBytes, big / 2 - 1, 3); 
     332        std::cout << " ..."; 
     333        printBytes(largeBytes, big - 3, 3); 
     334        std::cout << " ]" << std::endl; 
     335        JVMLinkObject* jvmLargeBytes = p->getVar("largeBytes"); 
     336        std::cout << "TestC2: getVar: largeBytes = ["; 
     337        Byte* largeBytes2 = jvmLargeBytes->getDataAsByteArray(); 
     338        printBytes(largeBytes2, 0, 3); 
     339        std::cout << " ..."; 
     340        printBytes(largeBytes2, big / 2 - 1, 3); 
     341        std::cout << " ..."; 
     342        printBytes(largeBytes2, big - 3, 3); 
     343        std::cout << " ]" << std::endl; 
     344 
     345        delete largeBytes; 
     346 
    322347        fprintf(stdout, "\n\nPress enter to shut down the server and exit...\n"); 
    323348        _fgetchar(); 
Note: See TracChangeset for help on using the changeset viewer.