bug fix in scheduling
[IRC.git] / Robust / src / Runtime / socket.c
index 66f788decfca32b0c439ed6b4cc06130b9211041..e9e73d45ec9efdfdd85611d15602356962af091a 100644 (file)
@@ -1,21 +1,22 @@
 #include "runtime.h"
 #include "structdefs.h"
+#ifndef MULTICORE
 #include <fcntl.h>
-#ifndef RAW
 #include <sys/socket.h>
 #include <arpa/inet.h>
 #include <strings.h>
 #include <netdb.h>
-#endif
+#include <netinet/tcp.h>
 #include <errno.h>
+#endif
 #include "SimpleHash.h"
 #include "GenericHashtable.h"
 
 struct RuntimeHash *fdtoobject;
 
 int CALL24(___Socket______nativeConnect____I__AR_B_I, int ___fd___, int ___port___, struct ___Socket___ * ___this___, int ___fd___, struct ArrayObject * ___address___,int ___port___) {
-#ifdef RAW
-  // not supported in RAW version
+#ifdef MULTICORE
+  // not supported in MULTICORE version
   return -1;
 #else
   struct sockaddr_in sin;
@@ -25,21 +26,24 @@ int CALL24(___Socket______nativeConnect____I__AR_B_I, int ___fd___, int ___port_
   sin.sin_family= AF_INET;
   sin.sin_port=htons(___port___);
   sin.sin_addr.s_addr=htonl(*(int *)(((char *)&VAR(___address___)->___length___)+sizeof(int)));
-#if defined(THREADS)||defined(DSTM)
+#if defined(THREADS)||defined(DSTM)||defined(STM)
 #ifdef PRECISE_GC
-  struct listitem *tmp=stopforgc((struct garbagelist *)___params___);
+  stopforgc((struct garbagelist *)___params___);
 #endif
 #endif
   do {
     rc = connect(___fd___, (struct sockaddr *) &sin, sizeof(sin));
   } while (rc<0 && errno==EINTR); /* repeat if interrupted */
-#if defined(THREADS)||defined(DSTM)
+#if defined(THREADS)||defined(DSTM)||defined(STM)
 #ifdef PRECISE_GC
-  restartaftergc(tmp);
+  restartaftergc();
 #endif
 #endif
 
-
+  {
+  int flag = 1;
+  setsockopt(___fd___, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(flag));
+  }
   if (rc<0) goto error;
 
 #ifdef TASK
@@ -60,17 +64,21 @@ error:
 
 #ifdef TASK
 int CALL12(___Socket______nativeBindFD____I, int ___fd___, struct ___Socket___ * ___this___, int ___fd___) {
+#ifdef MULTICORE
+#else
   if (RuntimeHashcontainskey(fdtoobject, ___fd___))
     RuntimeHashremovekey(fdtoobject, ___fd___);
   RuntimeHashadd(fdtoobject, ___fd___, (int) VAR(___this___));
   addreadfd(___fd___);
+#endif
+  return 0;
 }
 #endif
 
 
 int CALL12(___Socket______nativeBind_____AR_B_I, int ___port___,  struct ArrayObject * ___address___, int ___port___) {
-#ifdef RAW
-  // not supported in RAW version
+#ifdef MULTICORE
+  // not supported in MULTICORE version
   return -1;
 #else
   int fd;
@@ -127,8 +135,8 @@ error:
 }
 
 struct ArrayObject * CALL01(___InetAddress______getHostByName_____AR_B, struct ArrayObject * ___hostname___) {
-#ifdef RAW
-  // not supported in RAW version
+#ifdef MULTICORE
+  // not supported in MULTICORE version
   return NULL;
 #else
 //struct ArrayObject * CALL01(___InetAddress______getHostByName_____AR_B, struct ___ArrayObject___ * ___hostname___) {
@@ -145,7 +153,8 @@ struct ArrayObject * CALL01(___InetAddress______getHostByName_____AR_B, struct A
   h=gethostbyname(str);
   free(str);
 
-  for (n=0; h->h_addr_list[n]; n++) /* do nothing */ ;
+       if (h != NULL) {
+               for (n=0; h->h_addr_list[n]; n++) /* do nothing */ ;
 
 #ifdef PRECISE_GC
   arraybytearray=allocate_newarray(___params___,BYTEARRAYARRAYTYPE,n);
@@ -156,7 +165,7 @@ struct ArrayObject * CALL01(___InetAddress______getHostByName_____AR_B, struct A
     struct ArrayObject *bytearray;
 #ifdef PRECISE_GC
     {
-      int ptrarray[]={1, (int) ___params___, (int)arraybytearray};
+      INTPTR ptrarray[]={1, (INTPTR) ___params___, (INTPTR)arraybytearray};
       bytearray=allocate_newarray(&ptrarray,BYTEARRAYTYPE,h->h_length);
       arraybytearray=(struct ArrayObject *) ptrarray[2];
     }
@@ -171,13 +180,16 @@ struct ArrayObject * CALL01(___InetAddress______getHostByName_____AR_B, struct A
   }
 
   return arraybytearray;
+       } else {
+               return NULL;
+       }
 #endif
 }
 
 
 int CALL12(___ServerSocket______createSocket____I, int port, struct ___ServerSocket___ * ___this___, int port) {
-#ifdef RAW
-  // not supported in RAW version
+#ifdef MULTICORE
+  // not supported in MULTICORE version
   return -1;
 #else
   int fd;
@@ -281,23 +293,25 @@ int CALL12(___ServerSocket______createSocket____I, int port, struct ___ServerSoc
 }
 
 int CALL02(___ServerSocket______nativeaccept____L___Socket___,struct ___ServerSocket___ * ___this___, struct ___Socket___ * ___s___) {
-#ifdef RAW
-  // not supported in RAW version
+#ifdef MULTICORE
+  // not supported in MULTICORE version
   return -1;
 #else
   struct sockaddr_in sin;
   unsigned int sinlen=sizeof(sin);
   int fd=VAR(___this___)->___fd___;
   int newfd;
-#if defined(THREADS)||defined(DSTM)
+#if defined(THREADS)||defined(DSTM)||defined(STM)
 #ifdef PRECISE_GC
-  struct listitem *tmp=stopforgc((struct garbagelist *)___params___);
+  stopforgc((struct garbagelist *)___params___);
 #endif
 #endif
   newfd=accept(fd, (struct sockaddr *)&sin, &sinlen);
-#if defined(THREADS)||defined(DSTM)
+  int flag = 1;
+  setsockopt(newfd, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(flag));
+#if defined(THREADS)||defined(DSTM)||defined(STM)
 #ifdef PRECISE_GC
-  restartaftergc(tmp);
+  restartaftergc();
 #endif
 #endif
   if (newfd<0) {
@@ -322,8 +336,6 @@ int CALL02(___ServerSocket______nativeaccept____L___Socket___,struct ___ServerSo
 #ifdef MULTICORE
   flagorand(VAR(___this___),0,0xFFFFFFFE,NULL,0);
   enqueueObject(VAR(___this___), NULL, 0);
-  //flagorand(VAR(___this___),0,0xFFFFFFFE,objq4socketobj[corenum],numqueues4socketobj[corenum]);
-  //enqueueObject(VAR(___this___), objq4socketobj[corenum], numqueues4socketobj[corenum]);
 #else
   flagorand(VAR(___this___),0,0xFFFFFFFE);
   enqueueObject(VAR(___this___));
@@ -334,6 +346,8 @@ int CALL02(___ServerSocket______nativeaccept____L___Socket___,struct ___ServerSo
 }
 
 void CALL24(___Socket______nativeWrite_____AR_B_I_I, int offset, int length, struct ___Socket___ * ___this___, struct ArrayObject * ___b___, int offset, int length) {
+#ifdef MULTICORE
+#else
   int fd=VAR(___this___)->___fd___;
   char * charstr=((char *)&VAR(___b___)->___length___)+sizeof(int)+offset;
   while(1) {
@@ -348,35 +362,36 @@ void CALL24(___Socket______nativeWrite_____AR_B_I_I, int offset, int length, str
     }
 
     if (length!=0) {
-#ifndef RAW
       perror("ERROR IN NATIVEWRITE");
       printf("error=%d remaining bytes %d\n",errno, length);
-#endif
     }
     break;
   }
+#endif
 }
 
 int CALL02(___Socket______nativeRead_____AR_B, struct ___Socket___ * ___this___, struct ArrayObject * ___b___) {
+#ifdef MULTICORE
+  return -1;
+#else
   int fd=VAR(___this___)->___fd___;
   int length=VAR(___b___)->___length___;
 
   char * charstr=malloc(length);
 
-#if defined(THREADS)||defined(DSTM)
+#if defined(THREADS)||defined(DSTM)||defined(STM)
 #ifdef PRECISE_GC
-  struct listitem *tmp=stopforgc((struct garbagelist *)___params___);
+  stopforgc((struct garbagelist *)___params___);
 #endif
 #endif
   int byteread=-1;
 
-  //  printf("Doing read on %d\n",fd);
   do {
     byteread=read(fd, charstr, length);
   } while(byteread==-1&&errno==EINTR);
-#if defined(THREADS)||defined(DSTM)
+#if defined(THREADS)||defined(DSTM)||defined(STM)
 #ifdef PRECISE_GC
-  restartaftergc(tmp);
+  restartaftergc();
 #endif
 #endif
 
@@ -390,7 +405,7 @@ int CALL02(___Socket______nativeRead_____AR_B, struct ___Socket___ * ___this___,
 
 
   if (byteread<0) {
-#ifndef RAW
+#ifndef MULTICORE
     printf("ERROR IN NATIVEREAD\n");
     perror("");
 #endif
@@ -399,32 +414,27 @@ int CALL02(___Socket______nativeRead_____AR_B, struct ___Socket___ * ___this___,
 #ifdef MULTICORE
   flagorand(VAR(___this___),0,0xFFFFFFFE,NULL,0);
   enqueueObject(VAR(___this___), NULL, 0);
-  //flagorand(VAR(___this___),0,0xFFFFFFFE,objq4socketobj[corenum],numqueues4socketobj[corenum]);
-  //enqueueObject(VAR(___this___),objq4socketobj[corenum],numqueues4socketobj[corenum]);
 #else
   flagorand(VAR(___this___),0,0xFFFFFFFE);
   enqueueObject(VAR(___this___));
 #endif
 #endif
   return byteread;
+#endif
 }
 
 void CALL01(___Socket______nativeClose____, struct ___Socket___ * ___this___) {
+#ifdef MULTICORE
+#else
   int fd=VAR(___this___)->___fd___;
   int data;
 #ifdef TASK
   RuntimeHashget(fdtoobject, fd, &data);
   RuntimeHashremove(fdtoobject, fd, data);
   removereadfd(fd);
-#ifdef MULTICORE
-  flagorand(VAR(___this___),0,0xFFFFFFFE,NULL,0);
-  enqueueObject(VAR(___this___), NULL, 0);
-  //flagorand(VAR(___this___),0,0xFFFFFFFE,objq4socketobj[corenum],numqueues4socketobj[corenum]);
-  //enqueueObject(VAR(___this___),objq4socketobj[corenum],numqueues4socketobj[corenum]);
-#else
   flagorand(VAR(___this___),0,0xFFFFFFFE);
   enqueueObject(VAR(___this___));
-#endif
 #endif
   close(fd);
+#endif
 }