#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;
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
#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;
}
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___) {
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);
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];
}
}
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;
}
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) {
#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___));
}
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) {
}
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
if (byteread<0) {
-#ifndef RAW
+#ifndef MULTICORE
printf("ERROR IN NATIVEREAD\n");
perror("");
#endif
#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
}