[or-cvs] r8305: - all system calls ready - all major bugs and todos fixed - (bsockets/trunk)
chiussi at seul.org
chiussi at seul.org
Wed Aug 30 08:34:57 UTC 2006
Author: chiussi
Date: 2006-08-30 04:34:56 -0400 (Wed, 30 Aug 2006)
New Revision: 8305
Modified:
bsockets/trunk/accept.c
bsockets/trunk/bsocket.h
bsockets/trunk/callback.c
bsockets/trunk/event.c
bsockets/trunk/event.h
bsockets/trunk/io.c
bsockets/trunk/io.h
bsockets/trunk/list.c
bsockets/trunk/misc.c
bsockets/trunk/misc.h
bsockets/trunk/notes
bsockets/trunk/select.c
bsockets/trunk/select.h
bsockets/trunk/socket.c
bsockets/trunk/socket.h
bsockets/trunk/sync.c
bsockets/trunk/test.c
bsockets/trunk/test.h
bsockets/trunk/wait.c
bsockets/trunk/wait.h
Log:
- all system calls ready
- all major bugs and todos fixed
- merging begins tommorow ...
Modified: bsockets/trunk/accept.c
===================================================================
--- bsockets/trunk/accept.c 2006-08-29 22:06:37 UTC (rev 8304)
+++ bsockets/trunk/accept.c 2006-08-30 08:34:56 UTC (rev 8305)
@@ -108,8 +108,8 @@
}
- //todo -- should we raise exception if accept() fails?
s = accept(b->s,name,namelen);
+ //no reason to raise exception on accept() failure
CHECK(s != INVALID_SOCKET,0);
post_accepted(b,s,env);
@@ -140,7 +140,6 @@
fail:
if (b != NULL) {
- //todo verify that bsocket doesnt alter errno
bsocket_release(fd,AS_READ,env);
}
Modified: bsockets/trunk/bsocket.h
===================================================================
--- bsockets/trunk/bsocket.h 2006-08-29 22:06:37 UTC (rev 8304)
+++ bsockets/trunk/bsocket.h 2006-08-30 08:34:56 UTC (rev 8305)
@@ -9,11 +9,11 @@
/*user options*/
/**************/
+#define MAX_BSOCKETS 2048
+
/*these should be throttled carefully, as too many open half-open sockets
or listening sockets wreak havoc on non-server kernels*/
-#define MAX_BSOCKETS 2048
-
#define MAX_SIMUL_CONNECT 9
#define MAX_SIMUL_LISTEN 5
Modified: bsockets/trunk/callback.c
===================================================================
--- bsockets/trunk/callback.c 2006-08-29 22:06:37 UTC (rev 8304)
+++ bsockets/trunk/callback.c 2006-08-30 08:34:56 UTC (rev 8305)
@@ -14,6 +14,9 @@
IN WSAOVERLAPPED *wo,
IN DWORD flags) {
+ struct socket_env *env2;
+ int fd2;
+
struct _msg *msg;
int err2;
@@ -21,14 +24,16 @@
int z;
msg = (struct _msg*) wo->hEvent;
+ env2 = msg->env;
+ fd2 = msg->fd;
if (err == 0) {
if (msg->len == len) {
socket_raise(msg->fd,IS_WRITABLE,TRUE,msg->env);
- msg_free(msg);
+
} else {
//it is pretty nasty to do the write operation twice, but
@@ -58,6 +63,9 @@
socket_exception(msg->fd,unixify_wsaerr(err2),msg->env);
}
+ } else {
+ //i dont like this, but it makes the code prettier as a whole
+ return;
}
}
@@ -69,7 +77,11 @@
}
}
+ msg_free(msg);
+ free(wo);
+ env2->b[fd2]->writing = FALSE;
+
}
void CALLBACK callback_read(
@@ -78,21 +90,33 @@
IN WSAOVERLAPPED *wo,
IN DWORD flags) {
+ struct socket_env *env2;
+ int fd2;
+
struct bsocket *b;
struct _msg *msg;
int r;
+ int delivered;
+
+ delivered = FALSE;
+
msg = (struct _msg*) wo->hEvent;
+ env2 = msg->env;
+ fd2 = msg->fd;
if (err == 0) {
ASSERT(len >= 0);
-
ASSERT(len <= msg->len);
if (len > 0) {
+ //important!!
+ //after we have placed message into input queue, we are no longer
+ //allowed to do anything with it, copy the stuff we care about so
+ //we can use it later
b = bsocket_get(msg->fd,AS_READ,msg->env);
ASSERT(b != NULL);
@@ -100,41 +124,39 @@
msg->len = len;
+ //place message into destination input queue
r = (int) list_enqueue(msg,b->in_q );
+ if (r != 0) {
+ delivered = TRUE;
+ }
- bsocket_release(msg->fd,AS_READ,msg->env);
+ bsocket_release(fd2,AS_READ,env2);
if (r != 0) {
ASSERT(len > 0);
- post_read(b,msg->env);
+ post_read(b,env2);
+ socket_raise(fd2,IS_READABLE,TRUE,env2);
- socket_raise(msg->fd,IS_READABLE,TRUE,msg->env);
-
} else {
-
- //todo -- dealloc msg?
- socket_exception(b->fd,errno,msg->env);
-
+ socket_exception(fd2,errno,env2);
}
-
} else {
-
- socket_exception(msg->fd,0,msg->env);
-
+ socket_exception(msg->fd,0,msg->env);
}
} else {
-
- //if err is WSAINVAL it means that the OVERLAPPED argument has become invalid.
- //this happens when there is an outstanding read operation when the socket is
- //deallocated. the best thing to do is nothing.
- if (err != WSAEINVAL) {
socket_exception(msg->fd,unixify_wsaerr(err),msg->env);
- }
}
+ if (!delivered) {
+ msg_free(msg);
+ }
+
+ free(wo);
+ env2->b[fd2]->reading = FALSE;
+
}
//caller must guarantee list atomicity
@@ -163,11 +185,8 @@
l[fd]->connecting = FALSE;
if (err) {
-
bsocket_exception(l[fd],err,env);
-
} else {
-
make_connected(l[fd],-1,env);
}
Modified: bsockets/trunk/event.c
===================================================================
--- bsockets/trunk/event.c 2006-08-29 22:06:37 UTC (rev 8304)
+++ bsockets/trunk/event.c 2006-08-30 08:34:56 UTC (rev 8305)
@@ -155,7 +155,6 @@
e->sig = w;
e->err = err;
-
MUTEX_ACQUIRE(env->post_m);
if (list_enqueue(e,env->event_q) == NULL) {
@@ -163,7 +162,6 @@
}
ASSERT(WSASetEvent(env->post_e));
-
MUTEX_RELEASE(env->post_m);
if (w != NULL ) {
@@ -171,7 +169,6 @@
}
fail:
-
if (w != NULL) {
ASSERT(CloseHandle(w));
}
@@ -247,9 +244,8 @@
return out;
}
-int post_write(struct bsocket *b, int *ret, int *err, struct socket_env *env) {
- //todo assert is writable
- return event_post(b,EV_WRITE,&b->w_wo,ret,err,TRUE,env);
+int post_write(struct bsocket *b, WSAOVERLAPPED *wo, int *ret, int *err, struct socket_env *env) {
+ return event_post(b,EV_WRITE,wo,ret,err,TRUE,env);
}
int post_exception(struct bsocket *b, int err, struct socket_env *env) {
@@ -261,7 +257,7 @@
}
int post_read(struct bsocket *b, struct socket_env *env) {
- return event_post(b,EV_READ,&b->r_wo,NULL,NULL,FALSE,env);
+ return event_post(b,EV_READ,NULL,NULL,NULL,FALSE,env);
}
int post_listen(struct bsocket *b, int backlog, int *res, int *err, struct socket_env *env) {
@@ -272,6 +268,11 @@
return event_post(b,EV_ACCEPT,(void*)s,NULL,NULL,TRUE,env);
}
+int post_shutdown(struct socket_env *env) {
+ return event_post(NULL,EV_SHUTDOWN,NULL,NULL,NULL,FALSE,env);
+
+}
+
struct _event *event_next(struct socket_env *env) {
struct _event *e;
@@ -279,7 +280,6 @@
MUTEX_ACQUIRE(env->post_m);
if (list_dequeue(&e,env->event_q)) {
-
WSAResetEvent(env->post_e);
e = NULL;
errno = EEMPTY;
@@ -288,14 +288,13 @@
MUTEX_RELEASE(env->post_m);
return e;
-
}
#define E_NOTIFY (0+WAIT_OBJECT_0)
#define E_CONNECT (1+WAIT_OBJECT_0)
#define E_ACCEPT (2+WAIT_OBJECT_0)
-#define E_INSERT(S,FD,TYPE) for (_j=1; _j<WSA_MAXIMUM_WAIT_EVENTS; ) {\
+#define E_INSERT(S,FD,TYPE) for (_j=1; _j<WSA_MAXIMUM_WAIT_EVENTS; ) {\
if (ev[_j].fd == -1) {\
ASSERT( WSAEventSelect(S,we[_j],TYPE) ==0 );\
ev[_j].fd = FD;\
@@ -374,12 +373,9 @@
CHECK(connect_q != NULL, 0);
for (i=1; i<WSA_MAXIMUM_WAIT_EVENTS; i++) {
-
we[i] = WSACreateEvent();
CHECK_(we[i] != WSA_INVALID_EVENT);
-
ev[i].fd = -1;
-
}
for (i=0; i<MAX_BSOCKETS; i++) {
@@ -415,9 +411,6 @@
z = 0;
- //todo -- previously the index was was ev->fd before,
- //what in the nameof christ was i thinking?
- //furthermore, _why_ was it working!
if ((i = connect_lookup[e->fd]) != -1) {
E_DELETE(i);
z++;
@@ -431,13 +424,28 @@
ASSERT(z <= 1);
- //todo cancel any outstanding i/o (do we need to?)
- if (e->p_fd == -1)
- ASSERT(closesocket(e->s) == 0);
+ if (e->p_fd == -1) {
- //todo -- this is a major sync violation, but it feels safe, why?
- SetEvent(env->b[e->fd]->exception_e);
+ if (closesocket(e->s) == SOCKET_ERROR) {
+ socket_set_err(e->fd,unixify_wsaerr(WSAGetLastError()),env);
+ }
+ /*despite what this may look like, it is not busy
+ looping. the SleepEx says "put the thread in an
+ state that can run callbacks".
+ */
+ while (env->b[e->fd]->reading || env->b[e->fd]->writing) {
+ if (SleepEx(0,TRUE) == 0) {
+ ASSERT(env->b[e->fd]->reading == FALSE);
+ ASSERT(env->b[e->fd]->writing == FALSE);
+ }
+ }
+
+ }
+
+ //this is safe because if close() is raising this exception, it is waiting for us
+ //to respond, it will not remove anything from env->b yet
+ SetEvent(env->b[e->fd]->exception_e);
event_respond(e,0,0);
break;
@@ -448,7 +456,6 @@
break;
case EV_CONNECT:
-
//schedule connection request
if ( (c = e->data) != NULL) {
@@ -475,8 +482,7 @@
} else {
- //todo -- errno should = 0?
- event_respond(e,-1,errno);
+ event_respond(e,0,0);
}
@@ -491,8 +497,7 @@
if (z == 0) {
- //todo -- start reading
- socket_raise(e->fd,IS_WRITABLE,TRUE,env);
+ complete_connect(e->fd,0,env);
} else {
@@ -504,7 +509,6 @@
} else {
- //todo -- is there a memory leak here?
complete_connect(
e->fd,
unixify_wsaerr(WSAGetLastError()),
@@ -514,13 +518,15 @@
}
+ //todo -- free event here?
+
}
break;
case EV_READ:
- invoke_read(e->s,e->fd,(WSAOVERLAPPED*) e->data,env);
+ invoke_read(e->s,e->fd,env);
break;
@@ -576,15 +582,11 @@
event_respond(e,msg->len,0);
} else {
-
event_respond(e,-1,errno);
-
}
} else {
-
event_respond(e,-1,errno);
-
}
}
@@ -612,8 +614,8 @@
break;
+ //deassociate accepted socket with network events
case EV_ACCEPT:
- //deassociate accepted socket with network events
z = listen_lookup[e->fd];
@@ -624,7 +626,6 @@
WSAEventSelect((SOCKET) e->data,we[z],0)
!= SOCKET_ERROR
);
-
event_respond(e,0,0);
break;
@@ -632,9 +633,7 @@
default:
ASSERT(FALSE);
break;
-
}
-
break;
default:
@@ -644,62 +643,48 @@
ASSERT(i < WSA_MAXIMUM_WAIT_EVENTS);
z = WSAEnumNetworkEvents(ev[i].s,we[i],&ne);
+ ASSERT(z != SOCKET_ERROR);
- if (z != SOCKET_ERROR) {
+ ASSERT( ne.lNetworkEvents & ev[i].type);
+ //make sure no other events are getting set
+ ASSERT( (ne.lNetworkEvents & ~(ev[i].type)) == 0);
- ASSERT( ne.lNetworkEvents & ev[i].type);
- //make sure no other events are getting set
- ASSERT( (ne.lNetworkEvents & ~(ev[i].type)) == 0);
+ switch (ev[i].type) {
- switch (ev[i].type) {
+ case FD_CONNECT:
+ err = ne.iErrorCode[FD_CONNECT_BIT];
- case FD_CONNECT:
- err = ne.iErrorCode[FD_CONNECT_BIT];
+ if (err) {
+ complete_connect(ev[i].fd,unixify_wsaerr(err),env);
+ } else {
+ complete_connect(ev[i].fd,0,env);
+ }
- if (err) {
- complete_connect(ev[i].fd,unixify_wsaerr(err),env);
- } else {
- complete_connect(ev[i].fd,0,env);
- }
+ E_DELETE(i);
+ connect_count--;
+ ASSERT(event_post(NULL,EV_CONNECT,NULL,NULL,NULL,FALSE,env) == 0);
- E_DELETE(i);
- connect_count--;
+ break;
- ASSERT(event_post(NULL,EV_CONNECT,NULL,NULL,NULL,FALSE,env) == 0);
+ case FD_ACCEPT:
+ err = ne.iErrorCode[FD_ACCEPT_BIT];
- break;
+ if (err) {
+ socket_exception(ev[i].fd,unixify_wsaerr(err),env);
+ E_DELETE(i);
+ listen_count--;
- case FD_ACCEPT:
- err = ne.iErrorCode[FD_ACCEPT_BIT];
+ } else {
+ socket_client_in(ev[i].fd,env);
+ }
- if (err) {
- socket_exception(ev[i].fd,unixify_wsaerr(err),env);
- E_DELETE(i);
- listen_count--;
+ break;
- } else {
- socket_client_in(ev[i].fd,env);
- }
-
-
- break;
-
- default:
- ASSERT(FALSE);
- break;
- }
-
-
- } else {
-
- //complete_connect(ev[i].fd,unixify_wsaerr(err),env);
- //socket_exception(ev[i].fd,unix);
- //todo -- rethink this part
- ASSERT(FALSE);
-
+ default:
+ ASSERT(FALSE);
+ break;
}
-
break;
case WSA_WAIT_FAILED:
@@ -719,13 +704,10 @@
ASSERT(list_dequeue(NULL,env->event_q) != 0);
for (i=1; i<WSA_MAXIMUM_WAIT_EVENTS; i++) {
-
- //todo -- assert nothing is using these events
ASSERT(WSACloseEvent(we[i]));
}
fail:
-
if (connect_q != NULL)
list_free(connect_q);
Modified: bsockets/trunk/event.h
===================================================================
--- bsockets/trunk/event.h 2006-08-29 22:06:37 UTC (rev 8304)
+++ bsockets/trunk/event.h 2006-08-30 08:34:56 UTC (rev 8305)
@@ -50,9 +50,11 @@
int post_connect(struct bsocket *, struct sockaddr *, size_t len, struct socket_env *env);
int post_exception(struct bsocket *, int, struct socket_env*);
int post_read(struct bsocket *, struct socket_env *);
-int post_write(struct bsocket *, int*, int*, struct socket_env*);
+int post_write(struct bsocket *, WSAOVERLAPPED*, int*, int*, struct socket_env*);
int post_close(struct bsocket *, struct socket_env*);
int post_listen(struct bsocket *, int, int*, int*, struct socket_env*);
int post_accepted(struct bsocket *, SOCKET, struct socket_env*);
+int post_shutdown(struct socket_env*);
+
#endif
Modified: bsockets/trunk/io.c
===================================================================
--- bsockets/trunk/io.c 2006-08-29 22:06:37 UTC (rev 8304)
+++ bsockets/trunk/io.c 2006-08-30 08:34:56 UTC (rev 8305)
@@ -9,7 +9,7 @@
#include "list.h"
#include "io.h"
-struct _msg *msg_new(int fd, int len, void *data, struct socket_env *env) {
+struct _msg *msg_new(int fd, SOCKET s, int len, void *data, struct socket_env *env) {
struct _msg *out;
@@ -33,24 +33,18 @@
out->buf_wb.buf = out->o_data;
out->buf_wb.len = len;
-
-
out->env = env;
out->fd = fd;
+ out->s = s;
} else {
-
free(out);
out = NULL;
-
errno = ENOMEM;
-
}
} else {
-
errno = ENOMEM;
-
}
return out;
@@ -61,11 +55,12 @@
free(msg->o_data);
free(msg);
-
}
-void invoke_read(SOCKET s, int fd, WSAOVERLAPPED *wo, struct socket_env *env) {
+void invoke_read(SOCKET s, int fd, struct socket_env *env) {
+ WSAOVERLAPPED *wo;
+
struct _msg *msg;
int err;
@@ -79,11 +74,23 @@
z = 0;
- msg = msg_new(fd,4096,NULL,env);
+ //no matter how tempting it is, do include WSAOVERLAPPED structures
+ //in bsocket strucutre. this opens a nasty can of concurrency worms.
+ //allocating a different one for each invoked read is good enough for now
+ //think of a better way some day
+ wo = (WSAOVERLAPPED*) malloc(sizeof(WSAOVERLAPPED));
+
+ msg = msg_new(fd,s,4096,NULL,env);
CHECK(msg != NULL,0);
wo->hEvent = (WSAEVENT) msg;
+
+ //possible sync issue
+ //make sure we are not reading twice
+ ASSERT(env->b[fd]->reading == FALSE);
+ env->b[fd]->reading = TRUE;
+
r = WSARecv(
s,
&msg->buf_wb,
@@ -95,9 +102,7 @@
);
if (r == SOCKET_ERROR) {
-
err = WSAGetLastError();
-
CHECK(err == WSA_IO_PENDING,err);
}
@@ -118,7 +123,6 @@
int recv_win32(int fd, void *buf, size_t len, int flags, struct socket_env *env) {
struct bsocket *b;
-
struct _msg *msg;
int out;
@@ -180,7 +184,6 @@
if (msg->len == 0 ) {
msg_free(msg);
-
ASSERT(list_dequeue(NULL,b->in_q) == 0);
} else {
@@ -192,16 +195,12 @@
data_read += copy_len;
} else {
-
space_left = 0;
-
}
} else {
socket_raise(fd,IS_READABLE,FALSE,env);
-
}
-
}
out = data_read;
@@ -218,6 +217,8 @@
int send_win32 (int fd, void *buf, size_t len, int flags, struct socket_env *env) {
+ WSAOVERLAPPED *wo;
+
struct bsocket *b;
struct _msg *msg;
@@ -231,22 +232,31 @@
CHECK(b->connected,ENOTCONN);
if (b->blocking == FALSE) {
- //todo we need a new way to check if this socket is writable
+ CHECK(!b->writing,EAGAIN);
}
r = wait_until(b,IS_WRITABLE,env);
+ ASSERT(b->writing == FALSE);
+
+ if (b->partner == -1) {
+ b->writing = TRUE;
+ }
+
socket_raise(fd,IS_WRITABLE,0,env);
CHECK(r == 0,0);
- msg = msg_new(fd,len,buf,env);
+ msg = msg_new(fd,b->s,len,buf,env);
CHECK(msg != NULL,0);
- b->w_wo.hEvent = (WSAEVENT) msg;
+ wo = (WSAOVERLAPPED*) malloc(sizeof(WSAOVERLAPPED));
+ CHECK_(wo != NULL);
- r = post_write(b,&z,&err,env);
+ wo->hEvent = (WSAEVENT) msg;
+ r = post_write(b,wo,&z,&err,env);
+
if (r != 0) {
errno = err;
out = -1;
Modified: bsockets/trunk/io.h
===================================================================
--- bsockets/trunk/io.h 2006-08-29 22:06:37 UTC (rev 8304)
+++ bsockets/trunk/io.h 2006-08-30 08:34:56 UTC (rev 8305)
@@ -17,9 +17,9 @@
};
-void invoke_read(SOCKET, int, WSAOVERLAPPED *, struct socket_env *);
+void invoke_read(SOCKET, int, struct socket_env *);
-struct _msg *msg_new(int, int, void*, struct socket_env*);
+struct _msg *msg_new(int, SOCKET, int, void*, struct socket_env*);
void msg_free(struct _msg *);
int send_win32(int, void*, size_t, int, struct socket_env*);
Modified: bsockets/trunk/list.c
===================================================================
--- bsockets/trunk/list.c 2006-08-29 22:06:37 UTC (rev 8304)
+++ bsockets/trunk/list.c 2006-08-30 08:34:56 UTC (rev 8305)
@@ -4,19 +4,13 @@
int list_is_empty(struct _list *list) {
-
return list->head == NULL;
-
}
void list_data(void *data, struct _list_node *n) {
- //todo -- this is ugly, why?
if (data != NULL) {
-
*((void**) data) = n->data;
-
}
-
}
struct _list_node *list_enqueue(void *data, struct _list *list) {
@@ -107,23 +101,16 @@
int out;
if ( (out = list_queuepeek(data,list)) == 0) {
-
list_node_detach(list->head);
-
}
return out;
}
-
void list_node_free(struct _list_node *node) {
-
free(node);
-
}
-
-
struct _list *list_new() {
struct _list *out;
@@ -132,10 +119,8 @@
malloc(sizeof(struct _list));
if (out != NULL) {
-
out->head = NULL;
out->tail = NULL;
-
} else {
errno = ENOMEM;
}
@@ -150,5 +135,4 @@
while (list_dequeue(&n,list) == 0);
free(list);
-
}
Modified: bsockets/trunk/misc.c
===================================================================
--- bsockets/trunk/misc.c 2006-08-29 22:06:37 UTC (rev 8304)
+++ bsockets/trunk/misc.c 2006-08-30 08:34:56 UTC (rev 8305)
@@ -5,9 +5,7 @@
char _G_VERY_BAD_NEWS_[] = "\nSerious error, can't cope. Here is as much information as we can give...\n\tfile:%s line:%d errno:%d win32 err:%d\n";
HANDLE make_thread (void *func, void *data) {
-
return CreateThread(NULL,0,func, data, 0, NULL);
-
}
/*"borrowed" from msdn*/
@@ -21,7 +19,6 @@
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
-
return 1;
}
@@ -39,8 +36,6 @@
//im not going to think about overflow. if you want to wait more than 5
//years or something like that, TS
int timeval_to_millis(struct timeval *tv) {
-
return (tv->tv_sec)*1000;
-
}
Modified: bsockets/trunk/misc.h
===================================================================
--- bsockets/trunk/misc.h 2006-08-29 22:06:37 UTC (rev 8304)
+++ bsockets/trunk/misc.h 2006-08-30 08:34:56 UTC (rev 8305)
@@ -23,19 +23,24 @@
goto fail;\
}\
-#define ASSERT(X) if (!(X)) { fflush(stdout); VERY_BAD_NEWS ; _exit(1); }
+#define ASSERT(X) if (!(X)) { fflush(stdout); VERY_BAD_NEWS ; _exit(666); }
#define MUTEX_ACQUIRE(X) ASSERT(WaitForSingleObject(X,INFINITE) == WAIT_OBJECT_0)
#define MUTEX_RELEASE(X) ASSERT(ReleaseMutex(X))
-#define LA //printf("list acquire: %s:%d\n",__func__,__LINE__); fflush(stdout);
-#define LR //printf("list release: %s:%d\n",__func__,__LINE__); fflush(stdout);
-
int winsock_start();
HANDLE make_thread(void*,void*);
-//todo -- if timeval not defined, give it something to work with
+//todo -- define this in configure script
+#define HAVE_TIMEVAL
+#ifndef HAVE_TIMEVAL
+struct timeval {
+ time_t tv_sec;
+ unsigned int tv_usec;
+};
+#endif
+
int timeval_to_millis(struct timeval *);
#endif
Modified: bsockets/trunk/notes
===================================================================
--- bsockets/trunk/notes 2006-08-29 22:06:37 UTC (rev 8304)
+++ bsockets/trunk/notes 2006-08-30 08:34:56 UTC (rev 8305)
@@ -1,37 +1,16 @@
Whats Left? (sorted by importance in non-increasing order)
===========
-1. baccept()
- - blisten(): tells event manager to set desired socket to IS_READABLE when
- FD_ACCEPT happens
- - baccept(): calls accept() with underlying socket as argument
-
-2. brecv()
- - when callback_write occurs, and the entire message has not been sent
- reiterate
- - figure out a way to test the above (ie, force WSARecv() to not send
- entire message)
-
-3. Socket options/bfcntl()
- - figure out how we are going to handle SO_LINGER
- (wait until socket is writable again?)
+1. Socket options/bfcntl()
- should we forward options to the underlying socket if bsocket doesn't
support/need them ?
-3. Synchronization issues
- - decide if we need a seperate mutex for wait objects. having global
- ownership is fine, but it slows everything down.
- - ensure atomicity on wl_wait_many. problem because in time between
- wait list monitor placement and wait list activation, anohter activation
- may occur, which is currently undefined behavior. To observe this, run
- test 25 with a large number of connections
-
-4. Memory leaks
+2. Memory leaks
- There is a small memory leak observed when simply calling
bsocket()/bclose(). Why?
- For each malloc, make sure there is a free.
-5. Complete remaining test ideas (todos in test.c).
+3. Complete remaining test ideas (todos in test.c).
Misc
@@ -43,8 +22,4 @@
even a portability issue? I don't want to lose my dollar to nick over this :)
- Make sure that private functions are declared as static so they don't cause
any collisions
-
-
-
-
-
+- For now, we are not concerning ourselves with SO_LONGER
Modified: bsockets/trunk/select.c
===================================================================
--- bsockets/trunk/select.c 2006-08-29 22:06:37 UTC (rev 8304)
+++ bsockets/trunk/select.c 2006-08-30 08:34:56 UTC (rev 8305)
@@ -49,69 +49,46 @@
struct bsocket **l;
- LA;
-
l = bsocket_list_get(env);
+ ASSERT(l != NULL);
+ ASSERT(l[fd] != NULL);
- //todo -- assert is not null
- if (l != NULL) {
+ bsocket_raise(l[fd],type,active,env);
- if (l[fd] != NULL) {
- bsocket_raise(l[fd],type,active,env);
- }
+ bsocket_list_release(env);
- LR;
- bsocket_list_release(env);
-
- }
-
}
void socket_set_err(int fd, int err, struct socket_env *env) {
struct bsocket **l;
- LA
l = bsocket_list_get(env);
- if (l != NULL) {
+ ASSERT(l != NULL);
+ ASSERT(l[fd] != NULL);
- if (l[fd] != NULL) {
+ l[fd]->err = err;
- l[fd]->err = err;
+ bsocket_list_release(env);
- }
-
- LR
- bsocket_list_release(env);
-
- }
-
}
void socket_last_err(int fd, int *err, struct socket_env *env) {
struct bsocket **l;
- LA
l = bsocket_list_get(env);
- if (l != NULL) {
+ ASSERT(l != NULL);
+ ASSERT(l[fd] != NULL);
- if (l[fd] != NULL) {
+ *err = l[fd]->err;
+ l[fd]->err = 0;
- *err = l[fd]->err;
- l[fd]->err = 0;
-
- }
- LR
- bsocket_list_release(env);
-
- }
-
+ bsocket_list_release(env);
}
-//requires list ownership to call
void bsocket_exception(struct bsocket *b, int err, struct socket_env *env) {
if (!b->excepted) {
@@ -122,7 +99,6 @@
b->excepted = TRUE;
b->connected = FALSE;
- b->eof = TRUE;
//NULL represents EOF
list_enqueue(NULL,b->in_q);
@@ -138,49 +114,38 @@
if (b->partner != -1) {
bsocket_exception(env->b[b->partner],err,env);
}
-
}
-
}
void socket_exception(int fd, int err, struct socket_env *env) {
struct bsocket **l;
- LA
l = bsocket_list_get(env);
- if (l != NULL) {
+ ASSERT(l != NULL);
+ ASSERT(l[fd] != NULL);
- if (l[fd] != NULL) {
- bsocket_exception(l[fd],err,env);
- }
+ bsocket_exception(l[fd],err,env);
+ bsocket_list_release(env);
- LR
-
- bsocket_list_release(env);
-
- }
-
}
int wait_until_group(struct bsocket **b, int *flag, int num, int timeout, struct socket_env *env) {
struct _wait_list **wl;
- int i,j;
+ int i;
int out;
int r;
out = 0;
wl = (struct _wait_list **) malloc(sizeof(struct _wait_list*)*(num+1));
-
CHECK(wl != NULL,ENOMEM);
for (i=0; i<num; i++) {
-
switch(flag[i]) {
case IS_READABLE:
@@ -200,35 +165,21 @@
break;
}
-
ASSERT(wl[i] != NULL);
-
}
- for (i=0; i<num; i++) {
-
- for (j=0; j<i; j++) {
-
- ASSERT(wl[j] != wl[i]);
- }
-
- }
-
- //todo == major sync issue here, fix next
r = wait_many_timeout(wl,num,timeout);
if (r == -1) {
ASSERT( (errno == ETIMEDOUT && timeout != -1)
||
(errno == ECLOSED)
-
);
out = -1;
} else {
out = r;
}
-
fail:
if (wl != NULL) {
@@ -251,9 +202,6 @@
}
-
-
-
#define M_INSERT(X) objects[count] = X;\
count++;\
@@ -264,7 +212,6 @@
}\
mutex_count--;\
-
int select_win32(int z, bfd_set *readfds, bfd_set *writefds, bfd_set *exceptfds,
struct timeval *timeout, struct socket_env *env) {
@@ -273,7 +220,6 @@
bfd_set *fds[sets];
int *t;
-
struct bsocket **b;
struct bsocket **l;
struct bsocket *c;
@@ -288,6 +234,7 @@
int types[sets];
+ //make these values in env
fds[0] = readfds;
fds[1] = writefds;
fds[2] = exceptfds;
@@ -296,7 +243,6 @@
types[1] = IS_WRITABLE;
types[2] = IS_EXCEPTED;
-
b = NULL;
fd_count = 0;
l = NULL;
@@ -310,15 +256,12 @@
CHECK(fd_count > 0,EINVAL);
-
b = (struct bsocket**) malloc((sizeof(struct bsocket*))*(fd_count+1));
-
t = (int*) malloc((sizeof (int))*(fd_count+1));
CHECK(b != NULL,ENOMEM);
CHECK(t != NULL,ENOMEM);
- LA
l = bsocket_list_get(env);
CHECK(l != NULL,0);
@@ -326,37 +269,31 @@
count = 0;
for (i=0; i<sets; i++) {
-
if (fds[i] != NULL) {
-
for (j=0; j<fds[i]->count; j++) {
b[count] = l[fds[i]->list[j]];
t[count] = types[i];
-
count++;
}
}
}
- LR
bsocket_list_release(env);
l = NULL;
- /*convert timeval to milliseconds*/
if (timeout != NULL) {
to = timeval_to_millis(timeout);
} else {
to = -1;
}
- //todo -- major, what happens if someone closes socket right here
- //(before we start waiting on it?)
-
+ //note -- undefined behavior occurs if the user close()s while selecting
+ //on a socket. to cope with this would require a major overhaul, since I don't
+ //plan to stick with select(), we'll leave it as is for now
r = wait_until_group(b,t,fd_count,to,env);
if (r != -1) {
-
//we need to know that socket is still valid
c = bsocket_get(b[r]->fd,AS_GLOBAL,env);
CHECK(c != NULL,0);
@@ -390,23 +327,18 @@
default:
ASSERT(FALSE);
break;
+
}
-
bsocket_release(c->fd,AS_GLOBAL,env);
-
out = 1;
} else {
if (errno == ETIMEDOUT) {
-
out = 0;
-
} else {
-
out = -1;
-
}
}
Modified: bsockets/trunk/select.h
===================================================================
--- bsockets/trunk/select.h 2006-08-29 22:06:37 UTC (rev 8304)
+++ bsockets/trunk/select.h 2006-08-30 08:34:56 UTC (rev 8305)
@@ -3,7 +3,6 @@
#include "socket.h"
-int bsocket_last_err (struct bsocket *, int *, struct socket_env*);
void bsocket_set_err (struct bsocket *, int, struct socket_env*);
void socket_last_err(int, int*,struct socket_env*);
Modified: bsockets/trunk/socket.c
===================================================================
--- bsockets/trunk/socket.c 2006-08-29 22:06:37 UTC (rev 8304)
+++ bsockets/trunk/socket.c 2006-08-30 08:34:56 UTC (rev 8305)
@@ -15,6 +15,7 @@
#include "misc.h"
#include "callback.h"
+
struct socket_env *__GLOBAL_BSOCKET_ENV_;
//support only turning off and on socket blocking, will add more features as needed
@@ -73,7 +74,6 @@
int out;
l = NULL;
- LA
l = bsocket_list_get(env);
CHECK(l[fd] != NULL,EBADF);
@@ -110,13 +110,11 @@
}
fail:
- LR
bsocket_list_release(env);
return out;
}
-
int connect_win32(int fd, struct sockaddr *name, size_t len, struct socket_env *env) {
struct bsocket *b;
@@ -126,10 +124,8 @@
out = 0;
-
b = bsocket_get(fd,AS_WRITE,env);
-
CHECK(b != NULL,0);
CHECK(b->connected == FALSE,EISCONN);
CHECK(b->connecting == FALSE,EALREADY);
@@ -147,21 +143,15 @@
socket_last_err(fd,&err,env);
if (err) {
-
errno = err;
out = -1;
-
} else {
-
out = 0;
-
}
} else {
-
errno = EINPROGRESS;
out = -1;
-
}
fail:
@@ -170,12 +160,10 @@
bsocket_release(fd,AS_WRITE,env);
}
-
return out;
}
-
void bsocket_free(struct bsocket *b) {
if (b->read_wl != NULL) {
@@ -209,8 +197,6 @@
CloseHandle(b->exception_e);
}
- //todo -- remove any messages waiting
-
list_free(b->in_q);
free(b);
@@ -221,6 +207,7 @@
struct bsocket *b;
int out;
+ int err;
int r;
//manually ensure that socket exists
@@ -246,16 +233,21 @@
MUTEX_ACQUIRE(env->b[fd]->read_m);
MUTEX_ACQUIRE(env->b[fd]->write_m);
- //todo -- if this fails fd is lost forever (TS, or cope?)
+ //if this fails fd is lost forever -- TS
list_enqueue((void*) b->fd, env->free_q);
+ err = env->b[fd]->err;
env->b[fd] = NULL;
MUTEX_RELEASE(env->list_m);
bsocket_free(b);
- //todo out = last error
+ if (err != 110014) {
+ errno = err;
+ out = -1;
+ }
+
fail:
return out;
@@ -294,6 +286,9 @@
b->bound = FALSE;
b->listening = FALSE;
+ b->reading = FALSE;
+ b->writing = FALSE;
+
b->read_m = CreateMutex(NULL,FALSE,NULL);
CHECK_(b->read_m != NULL);
@@ -323,8 +318,6 @@
CHECK(b->except_wl != NULL, 0);
//do not open except list
- b->write_buf = NULL;
-
b->in_q = list_new();
CHECK(b->in_q != NULL,0);
@@ -342,11 +335,10 @@
ASSERT(FALSE);
}
-//todo -- make sure type is SOCK_STREAM
-//todo -- review
+//note: argument type is ignored, I'm not sure exactly what is supposed to happen
+//in a UDP socketpair, but lets assume it behaves similarly to a SOCK_STREAM
int socketpair_win32(int domain, int type, int protocol, int fd[2], struct socket_env *env){
-
struct bsocket *b[2];
struct bsocket **l;
@@ -478,10 +470,10 @@
ASSERT( sizeof(int) == sizeof(DWORD));
if (env == NULL) {
-
env = (struct socket_env *)
malloc(sizeof(struct socket_env));
__GLOBAL_BSOCKET_ENV_ = env;
+
}
CHECK(env != NULL,ENOMEM);
@@ -495,9 +487,7 @@
for (i=0; i<MAX_BSOCKETS; i++) {
env->b[i] = NULL;
-
CHECK(list_enqueue((void*) i,env->free_q) != NULL,0);
-
}
env->post_e = WSACreateEvent();
@@ -541,33 +531,26 @@
out = 0;
was_null = FALSE;
- //todo -- i can smell a sync issue here
if (env == NULL) {
env = __GLOBAL_BSOCKET_ENV_;
was_null = TRUE;
-
}
for (i=0; i<MAX_BSOCKETS; i++) {
-
close_win32(i,env);
}
- LA
MUTEX_ACQUIRE(env->list_m);
ASSERT(SetEvent(env->shutdown_e));
- //todo replace with post_shutdown
- ASSERT(event_post(NULL,EV_SHUTDOWN,NULL,NULL,NULL,FALSE,env) == 0);
+ post_shutdown(env);
r = WaitForSingleObject (env->event_t,1000);
ASSERT(r == WAIT_OBJECT_0);
//make sure we have cleaned up properly
- //todo - get rid of this when we are confident it isn't a problem
for (i=0; i<MAX_BSOCKETS; i++) {
-
ASSERT(env->b[i] == NULL);
}
@@ -586,6 +569,7 @@
if (was_null) {
__GLOBAL_BSOCKET_ENV_ = NULL;
+
}
goto fail;
Modified: bsockets/trunk/socket.h
===================================================================
--- bsockets/trunk/socket.h 2006-08-29 22:06:37 UTC (rev 8304)
+++ bsockets/trunk/socket.h 2006-08-30 08:34:56 UTC (rev 8305)
@@ -10,8 +10,6 @@
#include "sync.h"
#include "wait.h"
-//todo move this checking stuff into another header
-
#define AS_READ (1)
#define AS_WRITE (2)
#define AS_ERR (4)
@@ -47,26 +45,24 @@
int closed;
int err;
- int eof;
int excepted;
int fd;
/*writing business*/
- WSAOVERLAPPED w_wo;
- void *write_buf;
- void *write_pointer;
- int write_len;
-
int bound;
int listening;
- /*reading business*/
- WSAOVERLAPPED r_wo;
+ int writing;
+
+ /*writing business*/
struct _list *in_q;
+ int reading;
+
+
//-1 if not in a socketpair, >0 otherwise*/
int partner;
Modified: bsockets/trunk/sync.c
===================================================================
--- bsockets/trunk/sync.c 2006-08-29 22:06:37 UTC (rev 8304)
+++ bsockets/trunk/sync.c 2006-08-30 08:34:56 UTC (rev 8305)
@@ -50,22 +50,6 @@
release(-1,AE_LIST);
}
-int wait_lock(struct socket_env *env) {
-
- //todo is there any acceptable reason for this to fail?
- ASSERT(atomic(-1,AE_WAIT) == 0);
-
- return 0;
-
-}
-
-void wait_lock_release(struct socket_env *env) {
-
- release(-1,AE_WAIT);
-
-}
-
-//todo -- FOOL! don't own list while waiting on socket mutexes (change!!)
struct bsocket *bsocket_get(int fd, int access, struct socket_env *env) {
struct bsocket **l;
@@ -82,18 +66,14 @@
}
out = NULL;
- LA
l = bsocket_list_get(env);
if (l != NULL) {
- //todo -- if l[fd] == NULL?
if (!atomic(fd,access)) {
out = l[fd];
}
-
- LR
bsocket_list_release(env);
}
@@ -211,9 +191,7 @@
while (mutex_count > 1) {
- SetLastError(0);
- //todo -- get rid of this
r = WaitForMultipleObjects(mutex_count,desired_objects,FALSE,INFINITE);
switch(r) {
@@ -241,20 +219,16 @@
default:
M_DELETE(r - WAIT_OBJECT_0);
-
break;
}
}
if (out != -1) {
-
ASSERT(mutex_count == 1);
ASSERT(desired_objects[0] == close_event);
}
-
return out;
-
}
void release_win32(int fd, int type, struct socket_env *env) {
@@ -265,26 +239,16 @@
//on the first iteration of shutdown, it is closing the socket and failing
//because it thinks it doesnt exist because it isn't in the list
-
r = lookup_mutexes(fd,type,env,desired_events);
//dont use this with type as zero
ASSERT( r > 1);
- //printf("start ",r);
//rember events[0] is close event, we dont want to touch that yet
while (r > 1) {
- /*todo assert around this*/
- // printf("%d ",desired_events[r-1]);
- // fflush(stdout);
ASSERT(ReleaseMutex(desired_events[r-1]));
r--;
}
-
- //printf("\n");
- //fflush(stdout);
-
-
}
Modified: bsockets/trunk/test.c
===================================================================
--- bsockets/trunk/test.c 2006-08-29 22:06:37 UTC (rev 8304)
+++ bsockets/trunk/test.c 2006-08-30 08:34:56 UTC (rev 8305)
@@ -17,10 +17,8 @@
#include "io.h"
#include "accept.h"
-#define TEST_MSG "hello!"
+static int res, result2;
-int res;
-
//test ideas
/*
1. multiple non-blocking connect()s on same socket (should fail with EAGAIN?)
@@ -29,6 +27,8 @@
added it?
4. assert event_q is empty when exiting event manager
5. test select timeout
+6. close with pending write operation, make sure msg gets deallocated
+7. test for memory leaks
*/
@@ -135,45 +135,43 @@
int z;
int len;
- TEST(bsocket_init(NULL) == 0);
+ TEST(bsocket_init(NULL), 0);
fd = bsocket(AF_INET,SOCK_STREAM,0);
- TEST(fd == 0);
+ TEST(fd, 0);
//you better not be running a local service on port 81
bfcntl(fd,F_SETFL,O_NONBLOCK);
r = bconnect(fd,(struct sockaddr*)&localhost,sizeof(localhost));
- TEST(r == -1);
+ TEST(r, -1);
- TEST(errno == EINPROGRESS);
+ TEST(errno, EINPROGRESS);
BFD_ZERO(&fds);
- TEST(fds.count == 0);
+ TEST(fds.count,0);
BFD_SET(fd,&fds);
- TEST(fds.count == 1);
+ TEST(fds.count,1);
r = bselect(0,NULL,&fds,NULL,NULL);
- TEST(r == 1);
+ TEST(r,1);
- TEST(BFD_ISSET(fd,&fds));
+ TEST(BFD_ISSET(fd,&fds),TRUE);
len = sizeof(z);
//printf("%d\n",1);
//fflush(stdout);
- TEST(bgetsockopt(fd,SOL_SOCKET,SO_ERROR,&z,&len) == 0);
+ TEST(bgetsockopt(fd,SOL_SOCKET,SO_ERROR,&z,&len), 0);
- TEST(z == ECONNREFUSED);
+ TEST(z,ECONNREFUSED);
+ TEST(bsocket_shutdown(NULL),0);
-
- TEST(bsocket_shutdown(NULL) == 0);
-
return 0;
}
@@ -183,20 +181,20 @@
int fd;
int r;
- TEST(bsocket_init(NULL) == 0);
+ TEST(bsocket_init(NULL),0);
fd = bsocket(AF_INET,SOCK_STREAM,0);
- TEST(fd == 0);
+ TEST(fd,0);
errno = 0;
r = bconnect(fd, (struct sockaddr*) &localhost,sizeof(localhost));
- TEST(r == -1);
+ TEST(r, -1);
- TEST(errno == ECONNREFUSED);
+ TEST(errno, ECONNREFUSED);
- TEST(bsocket_shutdown(NULL) == 0);
+ TEST(bsocket_shutdown(NULL), 0);
return 0;
}
@@ -209,8 +207,8 @@
r = bconnect(_g_fd_,(struct sockaddr*)name,sizeof(struct sockaddr_in));
- SILENT_TEST(r == -1);
- SILENT_TEST(errno == ECLOSED);
+ SILENT_TEST(r,-1);
+ SILENT_TEST(errno,ECLOSED);
return 0;
@@ -224,11 +222,11 @@
int fd;
int r;
- TEST(bsocket_init(NULL) == 0);
+ TEST(bsocket_init(NULL), 0);
fd = bsocket(AF_INET,SOCK_STREAM,0);
- TEST(fd == 0);
+ TEST(fd, 0);
in.sin_family = AF_INET;
in.sin_addr.s_addr = inet_addr(BAD_ADDR);
@@ -240,14 +238,14 @@
Sleep(5);
- TEST(bclose(fd) == 0);
+ TEST(bclose(fd), 0);
- TEST(WaitForSingleObject(h,100) == 0);
- TEST(GetExitCodeThread(h,(DWORD*) &r));
+ TEST(WaitForSingleObject(h,100), 0);
+ TEST(GetExitCodeThread(h,(DWORD*) &r),TRUE);
- TEST(r == 0);
+ TEST(r,0);
- TEST(bsocket_shutdown(NULL) == 0);
+ TEST(bsocket_shutdown(NULL), 0);
return 0;
@@ -261,11 +259,11 @@
int fd;
int r;
- TEST(bsocket_init(NULL) == 0);
+ TEST(bsocket_init(NULL),0);
fd = bsocket(AF_INET,SOCK_STREAM,0);
- TEST(fd == 0);
+ TEST(fd,0);
in.sin_family = AF_INET;
in.sin_addr.s_addr = inet_addr(BAD_ADDR);
@@ -277,40 +275,39 @@
r = bconnect(fd,(struct sockaddr*) &in, sizeof(in));
- TEST(r == -1);
- TEST(errno == EINPROGRESS);
+ TEST(r, -1);
+ TEST(errno, EINPROGRESS);
r = bconnect(fd,(struct sockaddr*) &in, sizeof(in));
- TEST(r == -1);
- TEST(errno == EALREADY);
+ TEST(r, -1);
+ TEST(errno, EALREADY);
bfcntl(fd,F_SETFL,O_BLOCK);
r = bconnect(fd,(struct sockaddr*) &in, sizeof(in));
- TEST(r == -1);
- TEST(errno == EALREADY);
+ TEST(r, -1);
+ TEST(errno, EALREADY);
fd = bsocket(AF_INET,SOCK_STREAM,0);
- TEST(fd >= 0);
+ TEST(fd >= 0,TRUE);
google.sin_port = htons(80);
r = bconnect(fd,(struct sockaddr*) &google, sizeof(google));
- TEST(r == 0);
+ TEST(r,0);
r = bconnect(fd,(struct sockaddr*) &google, sizeof(google));
- TEST(r == -1);
- TEST(errno == EISCONN);
+ TEST(r,-1);
+ TEST(errno,EISCONN);
+ TEST(bsocket_shutdown(NULL),0);
- TEST(bsocket_shutdown(NULL) == 0);
-
return 0;
}
@@ -321,12 +318,12 @@
struct sockaddr_in in;
- TEST(bsocket_init(NULL) == 0);
+ TEST(bsocket_init(NULL),0);
fd = bsocket(AF_INET,SOCK_STREAM,0);
- TEST(fd >= 0);
- TEST(fd < MAX_BSOCKETS);
+ TEST(fd >= 0,TRUE);
+ TEST(fd < MAX_BSOCKETS,TRUE);
in.sin_family = AF_INET;
in.sin_addr.s_addr = inet_addr(BAD_ADDR);
@@ -335,11 +332,11 @@
errno = 0;
r = bconnect(fd,(struct sockaddr*) &in,sizeof(in));
- TEST( r == -1);
- TEST( errno == ETIMEDOUT);
+ TEST( r, -1);
+ TEST( errno, ETIMEDOUT);
- TEST(bsocket_shutdown(NULL) == 0);
+ TEST(bsocket_shutdown(NULL), 0);
return 0;
@@ -352,14 +349,14 @@
int f;
int i;
- TEST(bsocket_init(NULL) == 0);
+ TEST(bsocket_init(NULL), 0);
for (i=0; i<MAX_BSOCKETS; i++) {
fd[i] = bsocket(AF_INET,SOCK_STREAM,0);
- TEST(fd[i] >= 0);
- TEST(fd[i] < MAX_BSOCKETS);
+ TEST(fd[i] >= 0,TRUE);
+ TEST(fd[i] < MAX_BSOCKETS,TRUE);
}
@@ -367,31 +364,29 @@
f = bsocket(AF_INET,SOCK_STREAM,0);
- TEST(f == -1);
- TEST(errno == EMFILE);
+ TEST(f,-1);
+ TEST(errno, EMFILE);
errno = 0;
- TEST(bclose(fd[0]) == 0);
- TEST(errno == 0);
+ TEST(bclose(fd[0]),0);
+ TEST(errno,0);
f = bsocket(AF_INET,SOCK_STREAM,0);
- TEST(f != -1);
- TEST(errno == 0);
+ TEST(f != -1, TRUE);
+ TEST(errno, 0);
for (i=1; i<MAX_BSOCKETS; i++) {
-
- TEST(bclose(fd[i]) == 0);
- TEST(errno == 0);
-
+ TEST(bclose(fd[i]), 0);
+ TEST(errno, 0);
}
f = bsocket(AF_INET,SOCK_STREAM,0);
- TEST(f != -1);
+ TEST(f != -1,TRUE);
- TEST(bsocket_shutdown(NULL) == 0);
+ TEST(bsocket_shutdown(NULL), 0);
return 0;
@@ -405,19 +400,17 @@
while (tests--) {
- TEST(bsocket_init(NULL) == 0 );
+ TEST(bsocket_init(NULL), 0 );
fd = bsocket(AF_INET,SOCK_STREAM,0);
- TEST(fd >= 0);
- TEST(fd < MAX_BSOCKETS);
+ TEST(fd >= 0,TRUE);
+ TEST(fd < MAX_BSOCKETS,TRUE);
- TEST(bclose(fd) == 0);
+ TEST(bclose(fd),0);
- TEST(bsocket_shutdown(NULL) == 0 );
-
-
+ TEST(bsocket_shutdown(NULL),0);
}
return 0;
@@ -430,9 +423,9 @@
list = list_new();
- TEST(list != NULL);
- TEST(list->head == NULL);
- TEST(list->tail == NULL);
+ TEST(list != NULL,TRUE);
+ TEST(list->head,NULL);
+ TEST(list->tail, NULL);
list_free(list);
@@ -449,21 +442,21 @@
list = list_new();
- TEST(list != NULL);
+ TEST(list != NULL,TRUE);
- TEST(list_enqueue((void*)d,list) != NULL);
+ TEST(list_enqueue((void*)d,list) != NULL,TRUE);
- TEST(list->head != NULL);
- TEST(list->tail != NULL);
- TEST(list->head == list->tail);
+ TEST(list->head != NULL,TRUE);
+ TEST(list->tail != NULL,TRUE);
+ TEST(list->head, list->tail);
r = list_dequeue(&res2,list);
- TEST(r == 0);
- TEST(res2 == d);
+ TEST(r, 0);
+ TEST(res2, d);
- TEST(list->head == NULL);
- TEST(list->tail == NULL);
+ TEST(list->head,NULL);
+ TEST(list->tail, NULL);
list_free(list);
@@ -491,21 +484,21 @@
r = rand();
v[i] = r;
- TEST(list_enqueue((void*) r,list) != NULL);
+ TEST(list_enqueue((void*) r,list) != NULL,TRUE);
}
for (i=0; i<num; i++) {
n = list_dequeue(&r,list);
- TEST(n == 0);
- TEST(r == v[i]);
+ TEST(n, 0);
+ TEST(r,v[i]);
}
n = list_dequeue(&r,list);
- TEST(n != 0);
+ TEST(n != 0,TRUE);
- TEST(list->head == NULL);
- TEST(list->tail == NULL);
+ TEST(list->head, NULL);
+ TEST(list->tail, NULL);
free(v);
list_free(list);
@@ -524,11 +517,6 @@
claimed++;
}
-
-// if (WaitForSingleObject(env->free_m,0) == WAIT_OBJECT_0) {
-// claimed++;
-// }
-
if (WaitForSingleObject(env->post_m,0) == WAIT_OBJECT_0) {
claimed++;
}
@@ -545,7 +533,6 @@
}
-//todo - should do test for each mutex, but this is good enough for now
int test_envmutex() {
HANDLE h;
@@ -555,7 +542,7 @@
int r;
int tests = 1000;
- TEST((bsocket_init(NULL) == 0));
+ TEST(bsocket_init(NULL), 0);
env = __GLOBAL_BSOCKET_ENV_;
@@ -566,14 +553,14 @@
/*check if any of the mutexes can be claimed (very bad if)*/
h = new_thread(test_envmutex_helper,env);
- TEST(h != NULL);
+ TEST(h != NULL,TRUE);
r = WaitForSingleObject(h,1000);
- TEST(r == WAIT_OBJECT_0);
- TEST(GetExitCodeThread(h,(DWORD*)&r));
+ TEST(r, WAIT_OBJECT_0);
+ TEST(GetExitCodeThread(h,(DWORD*)&r),TRUE);
- TEST(r == 0);
+ TEST(r,0);
CloseHandle(h);
release(-1,AE_GLOBAL);
@@ -581,21 +568,21 @@
/*now make sure they were released properly*/
h = new_thread(test_envmutex_helper,env);
- TEST(h != NULL);
+ TEST(h != NULL,TRUE);
r = WaitForSingleObject(h,1000);
- TEST(r == WAIT_OBJECT_0);
+ TEST(r, WAIT_OBJECT_0);
- TEST(GetExitCodeThread(h,(DWORD*)&r));
+ TEST(GetExitCodeThread(h,(DWORD*)&r),TRUE);
- TEST(r == 3);
+ TEST(r,3);
CloseHandle(h);
}
- TEST(bsocket_shutdown(NULL) == 0);
+ TEST(bsocket_shutdown(NULL), 0);
return 0;
@@ -608,8 +595,8 @@
l = bsocket_list_get(env);
- SILENT_TEST(l == NULL);
- SILENT_TEST(errno == ECLOSED);
+ SILENT_TEST(l,NULL);
+ SILENT_TEST(errno, ECLOSED);
return 0;
}
@@ -624,21 +611,22 @@
int r;
- TEST(bsocket_init(NULL) == 0);
+ TEST(bsocket_init(NULL), 0);
env = __GLOBAL_BSOCKET_ENV_;
l = bsocket_list_get(env);
- TEST(l != NULL);
+ //come up with TESTf
+ TEST(l != NULL,TRUE);
h = new_thread(test_envmutexclose_helper,env);
Sleep(10);
- TEST(bsocket_shutdown(NULL) == 0);
+ TEST(bsocket_shutdown(NULL), 0);
- TEST(WaitForSingleObject(h,100) == WAIT_OBJECT_0);
- TEST(GetExitCodeThread(h,(DWORD*) &r));
+ TEST(WaitForSingleObject(h,100) ,WAIT_OBJECT_0);
+ TEST(GetExitCodeThread(h,(DWORD*) &r),TRUE);
- TEST(r == 0);
+ TEST(r,0);
CloseHandle(h);
@@ -669,7 +657,6 @@
return count;
}
-//todo - a test for each mutex individually
int test_socketmutex() {
HANDLE h;
@@ -679,55 +666,52 @@
int r;
int fd;
- TEST(bsocket_init(NULL) == 0);
+ TEST(bsocket_init(NULL), 0);
env = __GLOBAL_BSOCKET_ENV_;
fd = bsocket(AF_INET,SOCK_STREAM,0);
- TEST(fd == 0);
+ TEST(fd,0);
errno = 0;
r = atomic(fd,AS_GLOBAL);
- TEST(r == 0);
+ TEST(r,0);
h = new_thread(test_socketmutex_helper,env->b[fd]);
- TEST(h != NULL);
+ TEST(h != NULL,TRUE);
r = WaitForSingleObject(h,2000);
- TEST(r == WAIT_OBJECT_0);
+ TEST(r, WAIT_OBJECT_0);
GetExitCodeThread(h, (DWORD*) &r);
- TEST(r == 0);
+ TEST(r,0);
CloseHandle(h);
release(fd,AS_GLOBAL);
h = new_thread(test_socketmutex_helper,env->b[fd]);
- TEST(h != NULL);
+ TEST(h != NULL,TRUE);
r = WaitForSingleObject(h,2000);
- TEST(r == WAIT_OBJECT_0);
+ TEST(r, WAIT_OBJECT_0);
GetExitCodeThread(h, (DWORD*) &r);
- TEST(atomic(fd,AS_GLOBAL) == 0);
+ TEST(atomic(fd,AS_GLOBAL), 0);
release(fd,AS_GLOBAL);
- TEST(r == 2);
+ TEST(r, 2);
CloseHandle(h);
- TEST(bclose(fd) == 0);
+ TEST(bclose(fd),0);
+ TEST(bsocket_shutdown(NULL),0);
-
- TEST(bsocket_shutdown(NULL) == 0);
-
return 0;
}
-
//attempt to grab a mutex for a socket that does not exist
int test_badsocket() {
@@ -735,17 +719,17 @@
int r;
- TEST(bsocket_init(NULL) == 0);
+ TEST(bsocket_init(NULL), 0);
env = __GLOBAL_BSOCKET_ENV_;
errno = 0;
r = atomic(0,AS_READ);
- TEST(r == -1);
- TEST(errno == EBADF);
+ TEST(r, -1);
+ TEST(errno, EBADF);
- TEST(bsocket_shutdown(NULL) == 0);
+ TEST(bsocket_shutdown(NULL),0);
return 0;
@@ -762,13 +746,11 @@
errno = 0;
r = atomic(fd,AS_GLOBAL);
- SILENT_TEST(r == -1);
- SILENT_TEST(errno == ECLOSED);
+ SILENT_TEST(r, -1);
+ SILENT_TEST(errno, ECLOSED);
-
return 0;
-
}
int test_socketmutexclose() {
@@ -779,11 +761,11 @@
int fd;
int r;
- TEST(bsocket_init(NULL) == 0);
+ TEST(bsocket_init(NULL), 0);
fd = bsocket(AF_INET,SOCK_STREAM,0);
- TEST(fd == 0);
+ TEST(fd,0);
env = __GLOBAL_BSOCKET_ENV_;
@@ -793,19 +775,19 @@
Sleep(30);
- TEST(bclose(fd) == 0);
+ TEST(bclose(fd), 0);
r = WaitForSingleObject(h,10000);
- TEST(r == WAIT_OBJECT_0);
+ TEST(r, WAIT_OBJECT_0);
GetExitCodeThread(h,(DWORD*)&r);
- TEST(r == 0);
+ TEST(r,0);
CloseHandle(h);
- TEST(bsocket_shutdown(NULL) == 0);
+ TEST(bsocket_shutdown(NULL),0);
return 0;
@@ -822,12 +804,12 @@
rounds = 1000;
- TEST(bsocket_init(NULL) == 0);
+ TEST(bsocket_init(NULL), 0);
fd = bsocket(AF_INET,SOCK_STREAM,0);
env = __GLOBAL_BSOCKET_ENV_;
- TEST(fd == 0);
+ TEST(fd, 0);
while(rounds--) {
@@ -835,15 +817,15 @@
bsocket_release(fd,AS_GLOBAL,env);
- TEST(bsocket_list_get(env) != NULL);
+ TEST(bsocket_list_get(env) != NULL,TRUE);
bsocket_list_release(env);
}
- TEST(bclose(fd) == 0);
+ TEST(bclose(fd), 0);
- TEST(bsocket_shutdown(NULL) == 0);
+ TEST(bsocket_shutdown(NULL), 0);
return 0;
}
@@ -864,7 +846,7 @@
while (tests--) {
list = list_new();
- TEST(list != NULL);
+ TEST(list != NULL,TRUE);
remove_this_guy = ran(elements);
@@ -873,33 +855,29 @@
for (i=0; i<elements; i++) {
if (i == remove_this_guy) {
n = list_enqueue((void*) i,list);
- TEST(n != NULL);
+ TEST(n != NULL,TRUE);
} else {
- TEST(list_enqueue((void*) i,list) != NULL);
+ TEST(list_enqueue((void*) i,list) != NULL,TRUE);
}
}
- TEST(n != NULL);
+ TEST(n != NULL,TRUE);
list_node_detach(n);
for (i=0; i<elements; i++) {
if (i != remove_this_guy) {
-
r = list_dequeue(&num,list);
- TEST(r == 0);
-
- TEST(num == i);
-
+ TEST(r,0);
+ TEST(num,i);
}
-
}
r = list_dequeue(&num,list);
- TEST(r != 0);
+ TEST(r != 0,TRUE);
list_free(list);
@@ -930,7 +908,7 @@
wl = wl_new();
- TEST(wl != NULL);
+ TEST(wl != NULL,TRUE);
h = new_thread(test_waitclose_helper,wl);
@@ -938,11 +916,11 @@
wl_free(wl);
- TEST(WaitForSingleObject(h,INFINITE) == WAIT_OBJECT_0);
+ TEST(WaitForSingleObject(h,INFINITE), WAIT_OBJECT_0);
- TEST(GetExitCodeThread(h,(DWORD*) &r));
+ TEST(GetExitCodeThread(h,(DWORD*) &r),TRUE);
- TEST(r == ECLOSED);
+ TEST(r, ECLOSED);
return 0;
}
@@ -953,7 +931,7 @@
r = wait_one(wl);
- SILENT_TEST(r == 0);
+ SILENT_TEST(r, 0);
return 0;
}
@@ -972,24 +950,24 @@
while (tests--) {
- TEST(wl != NULL);
+ TEST(wl != NULL,TRUE);
h = new_thread(test_waitfail_helper, wl);
- TEST(h != NULL);
+ TEST(h != NULL,TRUE);
Sleep(10);
r = wait_one(wl);
- TEST(r == -1);
- TEST(errno == EAGAIN);
+ TEST(r, -1);
+ TEST(errno, EAGAIN);
wl_activate(wl,0);
- TEST(WaitForSingleObject(h,INFINITE) == WAIT_OBJECT_0);
- TEST(GetExitCodeThread(h,(DWORD*) &r));
- TEST(r == 0);
+ TEST(WaitForSingleObject(h,INFINITE), WAIT_OBJECT_0);
+ TEST(GetExitCodeThread(h,(DWORD*) &r),TRUE);
+ TEST(r, 0);
wl_deactivate(wl);
@@ -1036,7 +1014,7 @@
for (i=0; i<items; i++) {
wl[i] = wl_new();
- TEST(wl[i] != NULL);
+ TEST(wl[i] != NULL,TRUE);
}
while (tests--) {
@@ -1045,7 +1023,7 @@
while ( (m = ran(items)) == n);
- TEST(m != n);
+ TEST(m != n,TRUE);
desired[0] = wl[n];
desired[1] = wl[m];
@@ -1054,28 +1032,19 @@
h = new_thread(test_waitobject_helper,desired[wake_this_guy]);
- TEST(WaitForSingleObject(h,INFINITE) == WAIT_OBJECT_0);
+ TEST(WaitForSingleObject(h,INFINITE), WAIT_OBJECT_0);
CloseHandle(h);
r = wait_many(desired,2);
-
-
- // printf("%d %d\n",r, wake_this_guy);
-
- TEST(r == wake_this_guy);
-
-
+ TEST(r, wake_this_guy);
wl_deactivate(desired[wake_this_guy]);
-
-
}
for (i=0; i<items; i++) {
wl_free(wl[i]);
}
-
return 0;
}
@@ -1107,22 +1076,16 @@
h = new_thread(test_simplewaitobject_helper,l);
- TEST(WaitForSingleObject(h,INFINITE) == WAIT_OBJECT_0);
+ TEST(WaitForSingleObject(h,INFINITE), WAIT_OBJECT_0);
CloseHandle(h);
while(tests--) {
-
- TEST(l != NULL);
-
+ TEST(l != NULL,TRUE);
r = wait_one(l);
-
- TEST(r == 0);
-
+ TEST(r,0);
}
- /*after this, make sure it blocks*/
-
wl_free(l);
return 0;
@@ -1149,12 +1112,11 @@
h = new_thread(test_errnosafe_helper, NULL);
- TEST(h != NULL);
- TEST(WaitForSingleObject(h,INFINITE) == WAIT_OBJECT_0);
-
+ TEST(h != NULL,TRUE);
+ TEST(WaitForSingleObject(h,INFINITE), WAIT_OBJECT_0);
CloseHandle(h);
- TEST(errno == 102);
+ TEST(errno,102);
return 0;
@@ -1196,32 +1158,32 @@
s = socket(AF_INET,SOCK_STREAM,0);
- TEST(s != INVALID_SOCKET);
+ TEST(s != INVALID_SOCKET,TRUE);
in.sin_family = AF_INET;
in.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
in.sin_port = htons(0);
r = bind(s,(struct sockaddr*) &in,sizeof(struct sockaddr_in));
- TEST(r != SOCKET_ERROR);
+ TEST(r != SOCKET_ERROR,TRUE);
i = sizeof(struct sockaddr_in);
r = getsockname(s,(struct sockaddr*) &name,&i);
- TEST(r == 0);
+ TEST(r,0);
r = listen(s,10);
- TEST(r != SOCKET_ERROR);
+ TEST(r != SOCKET_ERROR,TRUE);
h = new_thread(test_maxoverlapped_server,(void*) s);
- TEST(h != NULL);
+ TEST(h != NULL,TRUE);
for (i=0; i<MAX_BSOCKETS; i++) {
c[i] = WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
- TEST(c[i] != INVALID_SOCKET);
+ TEST(c[i] != INVALID_SOCKET,TRUE);
r = connect(c[i],(struct sockaddr*) &name,sizeof(struct sockaddr_in));
- TEST(r != SOCKET_ERROR);
+ TEST(r != SOCKET_ERROR,TRUE);
flags = 0;
@@ -1232,12 +1194,12 @@
r = WSARecv(c[i],&buf[i],1,(DWORD*) &recv, (DWORD*)&flags,&wo[i],test_maxoverlapped_callback);
- TEST(r == SOCKET_ERROR);
- TEST(WSAGetLastError() == WSA_IO_PENDING);
+ TEST(r, SOCKET_ERROR);
+ TEST(WSAGetLastError(), WSA_IO_PENDING);
}
for (i=0; i<MAX_BSOCKETS; i++) {
- TEST(closesocket(c[i]) == 0);
+ TEST(closesocket(c[i]), 0);
}
closesocket(s);
@@ -1250,109 +1212,108 @@
BFD_ZERO(&fd);
- TEST(fd.count == 0);
+ TEST(fd.count, 0);
// TEST(fd.hash[0] == -1);
BFD_SET(0,&fd);
- TEST(fd.count == 1);
- TEST(fd.list[0] == 0);
+ TEST(fd.count, 1);
+ TEST(fd.list[0] , 0);
- TEST(fd.hash[0] == 0);
+ TEST(fd.hash[0] , 0);
BFD_SET(1000,&fd);
- TEST(fd.count == 2);
- TEST(fd.list[0] == 0);
- TEST(fd.list[1] == 1000);
+ TEST(fd.count , 2);
+ TEST(fd.list[0] , 0);
+ TEST(fd.list[1] , 1000);
- TEST(fd.hash[0] == 0);
- TEST(fd.hash[1000] == 1);
+ TEST(fd.hash[0] , 0);
+ TEST(fd.hash[1000] , 1);
BFD_SET(2000,&fd);
- TEST(BFD_ISSET(0,&fd) );
- TEST(BFD_ISSET(1000,&fd));
- TEST(BFD_ISSET(2000,&fd));
+ TEST(BFD_ISSET(0,&fd),TRUE);
+ TEST(BFD_ISSET(1000,&fd),TRUE);
+ TEST(BFD_ISSET(2000,&fd),TRUE);
- TEST(fd.count == 3);
- TEST(fd.list[0] == 0);
- TEST(fd.list[1] == 1000);
- TEST(fd.list[2] == 2000);
+ TEST(fd.count, 3);
+ TEST(fd.list[0], 0);
+ TEST(fd.list[1] , 1000);
+ TEST(fd.list[2] , 2000);
- TEST(fd.hash[0] == 0);
- TEST(fd.hash[1000] == 1);
- TEST(fd.hash[2000] == 2);
+ TEST(fd.hash[0] , 0);
+ TEST(fd.hash[1000] , 1);
+ TEST(fd.hash[2000] , 2);
BFD_CLR(0,&fd);
- TEST(!BFD_ISSET(0,&fd));
- TEST(BFD_ISSET(1000,&fd));
- TEST(BFD_ISSET(2000,&fd));
+ TEST(BFD_ISSET(0,&fd),FALSE);
+ TEST(BFD_ISSET(1000,&fd),TRUE);
+ TEST(BFD_ISSET(2000,&fd),TRUE);
- TEST(fd.count == 2);
- TEST(fd.list[0] == 1000);
- TEST(fd.list[1] == 2000);
+ TEST(fd.count, 2);
+ TEST(fd.list[0] , 1000);
+ TEST(fd.list[1] , 2000);
//TEST(fd.hash[0] == -1);
- TEST(fd.hash[1000] == 0);
- TEST(fd.hash[2000] == 1);
+ TEST(fd.hash[1000] , 0);
+ TEST(fd.hash[2000] , 1);
BFD_SET(0,&fd);
- TEST(fd.count == 3);
- TEST(fd.list[0] == 1000);
- TEST(fd.list[1] == 2000);
- TEST(fd.list[2] == 0);
+ TEST(fd.count , 3);
+ TEST(fd.list[0] , 1000);
+ TEST(fd.list[1] , 2000);
+ TEST(fd.list[2] , 0);
- TEST(fd.hash[0] == 2);
- TEST(fd.hash[1000] == 0);
- TEST(fd.hash[2000] == 1);
+ TEST(fd.hash[0] , 2);
+ TEST(fd.hash[1000] , 0);
+ TEST(fd.hash[2000] , 1);
BFD_CLR(2000,&fd);
- TEST(BFD_ISSET(0,&fd));
- TEST(BFD_ISSET(1000,&fd));
- TEST(!BFD_ISSET(2000,&fd));
+ TEST(BFD_ISSET(0,&fd),TRUE);
+ TEST(BFD_ISSET(1000,&fd),TRUE);
+ TEST(BFD_ISSET(2000,&fd),FALSE);
- TEST(fd.count == 2);
- TEST(fd.list[0] == 1000);
- TEST(fd.list[1] == 0);
+ TEST(fd.count , 2);
+ TEST(fd.list[0] , 1000);
+ TEST(fd.list[1] , 0);
- TEST(fd.hash[0] == 1);
- TEST(fd.hash[1000] == 0);
+ TEST(fd.hash[0] , 1);
+ TEST(fd.hash[1000] , 0);
// TEST(fd.hash[2000] == -1);
BFD_SET(2000,&fd);
- TEST(fd.count == 3);
- TEST(fd.list[0] == 1000);
- TEST(fd.list[1] == 0);
- TEST(fd.list[2] == 2000);
+ TEST(fd.count , 3);
+ TEST(fd.list[0] , 1000);
+ TEST(fd.list[1] , 0);
+ TEST(fd.list[2] , 2000);
- TEST(fd.hash[0] == 1);
- TEST(fd.hash[1000] == 0);
- TEST(fd.hash[2000] == 2);
+ TEST(fd.hash[0] , 1);
+ TEST(fd.hash[1000] , 0);
+ TEST(fd.hash[2000] , 2);
BFD_CLR(2000,&fd);
- TEST(BFD_ISSET(0,&fd));
- TEST(BFD_ISSET(1000,&fd));
- TEST(!BFD_ISSET(2000,&fd));
+ TEST(BFD_ISSET(0,&fd),TRUE);
+ TEST(BFD_ISSET(1000,&fd),TRUE);
+ TEST(BFD_ISSET(2000,&fd),FALSE);
- TEST(fd.count == 2);
- TEST(fd.list[0] == 1000);
- TEST(fd.list[1] == 0);
+ TEST(fd.count , 2);
+ TEST(fd.list[0] , 1000);
+ TEST(fd.list[1] , 0);
- TEST(fd.hash[0] == 1);
- TEST(fd.hash[1000] == 0);
+ TEST(fd.hash[0] , 1);
+ TEST(fd.hash[1000] , 0);
//TEST(fd.hash[2000] == -1);
BFD_ZERO(&fd);
- TEST(fd.count == 0);
- TEST(!BFD_ISSET(0,&fd));
- TEST(!BFD_ISSET(1000,&fd));
- TEST(!BFD_ISSET(2000,&fd));
+ TEST(fd.count, 0);
+ TEST(BFD_ISSET(0,&fd),FALSE);
+ TEST(BFD_ISSET(1000,&fd),FALSE);
+ TEST(BFD_ISSET(2000,&fd),FALSE);
-
return 0;
}
@@ -1361,23 +1322,23 @@
int fd;
int r;
- TEST(bsocket_init(NULL) == 0);
+ TEST(bsocket_init(NULL), 0);
fd = bsocket(AF_INET,SOCK_STREAM,0);
- TEST(fd == 0);
+ TEST(fd,0);
google.sin_port = htons(80);
r = bconnect(fd,(struct sockaddr*) &google,sizeof(google));
- TEST(r == 0);
+ TEST(r,0);
r = bclose(fd);
- TEST(r == 0);
+ TEST(r,0);
- TEST(bsocket_shutdown(NULL) == 0);
+ TEST(bsocket_shutdown(NULL), 0);
return 0;
@@ -1389,19 +1350,19 @@
int err;
- TEST(bsocket_init(NULL) == 0);
+ TEST(bsocket_init(NULL),0);
fd = bsocket(AF_INET,SOCK_STREAM,0);
- TEST(fd == 0);
+ TEST(fd,0);
socket_set_err(fd,666,__GLOBAL_BSOCKET_ENV_);
socket_last_err(fd,&err,__GLOBAL_BSOCKET_ENV_);
- TEST(err == 666);
+ TEST(err, 666);
- TEST(bsocket_shutdown(NULL) == 0);
+ TEST(bsocket_shutdown(NULL), 0);
return 0;
@@ -1409,7 +1370,7 @@
int test_multi_connect() {
- const int clients = 300;
+ const int clients = 600;
bfd_set fds_out, fds_in;
struct sockaddr_in in;
@@ -1428,11 +1389,10 @@
int good;
s = loopback_server(&port);
+ TEST(s != 0, TRUE);
- TEST(s != 0);
+ TEST(bsocket_init(NULL), 0);
- TEST(bsocket_init(NULL) == 0);
-
in.sin_family = AF_INET;
in.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
in.sin_port = port;
@@ -1443,19 +1403,19 @@
fd[i] = bsocket(AF_INET,SOCK_STREAM,0);
- TEST(fd[i] >= 0);
+ TEST(fd[i] >= 0,TRUE);
- TEST(bfcntl(fd[i],F_SETFL,O_NONBLOCK) == 0);
+ TEST(bfcntl(fd[i],F_SETFL,O_NONBLOCK),0);
- TEST(fd[i] != -1);
+ TEST(fd[i] != -1,TRUE);
BFD_SET(fd[i],&fds_in);
}
for (i=0; i<clients; i++) {
r = bconnect(fd[i],(struct sockaddr*) &in, sizeof(in));
- TEST(r == -1);
- TEST(errno == EINPROGRESS);
+ TEST(r, -1);
+ TEST(errno, EINPROGRESS);
}
BFD_COPY(&fds_out,&fds_in);
@@ -1470,7 +1430,7 @@
z = bgetsockopt( fds_out.list[0],SOL_SOCKET,SO_ERROR,&err,&len);
- TEST(z == 0);
+ TEST(z, 0);
if (err == 0) {
good = TRUE;
@@ -1484,30 +1444,24 @@
}
//make sure at least one connection succeeded
- TEST(good);
+ TEST(good,TRUE);
+ TEST(counter, clients);
- TEST(counter == clients);
+ TEST(r, -1);
- TEST(r == -1);
+ TEST(fds_out.count, 0);
- TEST(fds_out.count == 0);
-
for (i=0; i<clients; i++) {
- TEST(bclose(fd[i]) == 0);
+ TEST(bclose(fd[i]), 0);
}
- //todo -- why does this fail
- //TEST(closesocket(s) == 0);
- closesocket(s);
+ TEST(closesocket(s), 0);
+ TEST(bsocket_shutdown(NULL), 0);
-
- TEST(bsocket_shutdown(NULL) == 0);
-
return 0;
}
-
int test_simple_write_helper() {
SOCKET s;
@@ -1517,21 +1471,19 @@
s = socket(AF_INET,SOCK_STREAM,0);
- SILENT_TEST(s != INVALID_SOCKET);
+ SILENT_TEST(s != INVALID_SOCKET,TRUE);
+ SILENT_TEST(bind(s,(struct sockaddr*) &localhost,sizeof(localhost)), 0);
+ SILENT_TEST(listen(s,1), 0);
- SILENT_TEST(bind(s,(struct sockaddr*) &localhost,sizeof(localhost)) == 0);
-
- SILENT_TEST(listen(s,1) == 0);
-
c = accept(s,NULL,0);
- SILENT_TEST(c != INVALID_SOCKET);
+ SILENT_TEST(c != INVALID_SOCKET,TRUE);
r = -1;
- SILENT_TEST(recv(c,(char*) &r,sizeof(r),0) == sizeof(r));
+ SILENT_TEST(recv(c,(char*) &r,sizeof(r),0), sizeof(r));
- SILENT_TEST(r == 666);
+ SILENT_TEST(r, 666);
closesocket(s);
closesocket(c);
@@ -1544,38 +1496,39 @@
HANDLE h;
+
int msg;
int fd;
int r;
- TEST(bsocket_init(NULL) == 0);
+ TEST(bsocket_init(NULL), 0);
/*start server*/
-
h = new_thread(test_simple_write_helper,NULL);
Sleep(100);
fd = bsocket(AF_INET,SOCK_STREAM,0);
- TEST(fd == 0);
+ TEST(fd, 0);
r = bconnect(fd, (struct sockaddr *) &localhost,sizeof(localhost));
- TEST(r == 0);
+ TEST(r, 0);
msg = 666;
r = bsend(fd,&msg,sizeof(msg),0);
- TEST(r == sizeof(msg));
- TEST(WaitForSingleObject(h,1000) == WAIT_OBJECT_0);
+ TEST(r, sizeof(msg));
- TEST(GetExitCodeThread(h,(DWORD*) &r));
+ TEST(WaitForSingleObject(h,1000), WAIT_OBJECT_0);
- TEST(r == 0);
+ TEST(GetExitCodeThread(h,(DWORD*) &r),TRUE);
- TEST(bsocket_shutdown(NULL) == 0);
+ TEST(r, 0);
+ TEST(bsocket_shutdown(NULL), 0);
+
return 0;
}
@@ -1590,20 +1543,20 @@
s = socket(AF_INET,SOCK_STREAM,0);
msg = 666;
- SILENT_TEST(s != INVALID_SOCKET);
+ SILENT_TEST(s != INVALID_SOCKET,TRUE);
r = bind(s,(struct sockaddr*) &localhost,sizeof(localhost));
- SILENT_TEST(r == 0);
+ SILENT_TEST(r, 0);
r = listen(s,10);
- SILENT_TEST(r == 0);
+ SILENT_TEST(r, 0);
while (TRUE) {
c = accept(s,NULL,0);
- SILENT_TEST(c != INVALID_SOCKET);
+ SILENT_TEST(c != INVALID_SOCKET,TRUE);
r = send(c,(char*) &msg, sizeof(msg),0);
- SILENT_TEST(r == sizeof(msg));
+ SILENT_TEST(r, sizeof(msg));
closesocket(c);
@@ -1628,35 +1581,35 @@
while(mega_tests--) {
- TEST(bsocket_init(NULL) == 0);
+ TEST(bsocket_init(NULL), 0);
h = new_thread(test_simple_read_helper,NULL);
- TEST(h != NULL);
+ TEST(h != NULL,TRUE);
tests = 50;
while (tests--) {
fd = bsocket(AF_INET,SOCK_STREAM,0);
- TEST(fd >= 0);
+ TEST(fd >= 0,TRUE);
r = bconnect(fd,(struct sockaddr*) &localhost,sizeof(localhost));
- TEST(r == 0);
+ TEST(r, 0);
r = brecv(fd,&msg,sizeof(msg),0);
- TEST(r == sizeof(msg));
- TEST(msg == 666);
+ TEST(r, sizeof(msg));
+ TEST(msg, 666);
r = brecv(fd,&msg,sizeof(msg),0);
- TEST(r == 0);
+ TEST(r, 0);
r = brecv(fd,&msg,sizeof(msg),0);
- TEST(r == 0);
+ TEST(r, 0);
- TEST(bclose(fd) == 0);
+ TEST(bclose(fd), 0);
}
- TEST(bsocket_shutdown(NULL) == 0);
+ TEST(bsocket_shutdown(NULL), 0);
CloseHandle(h);
}
@@ -1671,19 +1624,19 @@
int msg = 666;
- TEST(bsocket_init(NULL) == 0);
+ TEST(bsocket_init(NULL), 0);
r = bsocketpair(AF_INET,SOCK_STREAM,0,s);
- TEST(r == 0);
+ TEST(r, 0);
r = bsend(s[0],&msg,sizeof(msg),0);
- TEST(r == sizeof(msg));
+ TEST(r, sizeof(msg));
r = brecv(s[1],&msg,sizeof(msg),0);
- TEST(r == sizeof(msg));
- TEST(msg == 666);
+ TEST(r, sizeof(msg));
+ TEST(msg, 666);
- TEST(bsocket_shutdown(NULL) == 0);
+ TEST(bsocket_shutdown(NULL), 0);
return 0;
}
@@ -1699,7 +1652,7 @@
int msg_count = 100;
int msg;
- TEST(bsocket_init(NULL) == 0);
+ TEST(bsocket_init(NULL), 0);
r = bsocketpair(AF_INET,SOCK_STREAM,0,s);
@@ -1707,44 +1660,44 @@
for (i=0; i<msg_count; i++) {
msg = msg_base+i;
r = bsend(s[0],&msg,sizeof(msg),0);
- TEST(r == sizeof(msg));
+ TEST(r, sizeof(msg));
}
for (i=0; i<msg_count; i++) {
msg = msg_base*2+i;
r = bsend(s[1],&msg,sizeof(msg),0);
- TEST(r == sizeof(msg));
+ TEST(r, sizeof(msg));
}
socket_exception(s[0],1, __GLOBAL_BSOCKET_ENV_);
for (i=0; i<msg_count; i++) {
r = brecv(s[1],&msg,sizeof(msg),0);
- TEST(r == sizeof(msg));
- TEST(msg == (msg_base+i));
+ TEST(r, sizeof(msg));
+ TEST(msg, (msg_base+i));
}
for (i=0; i<msg_count; i++) {
r = brecv(s[0],&msg,sizeof(msg),0);
- TEST(r == sizeof(msg));
- TEST(msg == (msg_base*2)+i);
+ TEST(r, sizeof(msg));
+ TEST(msg, (msg_base*2)+i);
}
r = brecv(s[0],&msg,sizeof(msg),0);
- TEST(r == 0);
+ TEST(r, 0);
r = brecv(s[1],&msg,sizeof(msg),0);
- TEST(r == 0);
+ TEST(r, 0);
r = bsend(s[0],&msg,sizeof(msg),0);
- TEST(r == -1);
- TEST(errno == ENOTCONN);
+ TEST(r, -1);
+ TEST(errno, ENOTCONN);
r = bsend(s[1],&msg,sizeof(msg),0);
- TEST(r == -1);
- TEST(errno == ENOTCONN);
+ TEST(r, -1);
+ TEST(errno, ENOTCONN);
- TEST(bsocket_shutdown(NULL) == 0);
+ TEST(bsocket_shutdown(NULL), 0);
return 0;
@@ -1755,10 +1708,6 @@
return -1;
}
-int test_complex_select() {
- return -1;
-}
-
int test_accept_helper(int num) {
struct sockaddr_in in;
@@ -1769,23 +1718,23 @@
memcpy(&in,&localhost,sizeof(in));
int fd = bsocket(AF_INET,SOCK_STREAM,0);
- SILENT_TEST(fd >= 0);
+ SILENT_TEST(fd >= 0,TRUE);
in.sin_port = htons(82);
r = bconnect(fd,(struct sockaddr*) &in, sizeof(in));
- SILENT_TEST(r == 0);
+ SILENT_TEST(r,0);
msg = 666;
r = bsend(fd,&msg,sizeof(msg),0);
- SILENT_TEST(r == sizeof(msg));
+ SILENT_TEST(r, sizeof(msg));
r = brecv(fd,&msg,sizeof(msg),0);
- SILENT_TEST(r == sizeof(msg));
- SILENT_TEST(msg == 667);
+ SILENT_TEST(r, sizeof(msg));
+ SILENT_TEST(msg, 667);
//todo -- SO_LINGER might raise an issue here
- SILENT_TEST(bclose(fd) == 0);
+ SILENT_TEST(bclose(fd), 0);
return 0;
@@ -1804,46 +1753,55 @@
struct sockaddr_in lh;
memcpy(&lh,&localhost,sizeof(lh));
- TEST(bsocket_init(NULL) == 0);
+ TEST(bsocket_init(NULL), 0);
fd = bsocket(AF_INET,SOCK_STREAM,0);
- TEST(fd >= 0);
+ TEST(fd >= 0,TRUE);
lh.sin_port = htons(82);
r = bbind(fd,(struct sockaddr*) &lh,sizeof(lh));
- TEST(r == 0);
+ TEST(r, 0);
r = blisten(fd,10);
- TEST(r == 0);
+ TEST(r, 0);
h = new_thread(test_accept_helper,NULL);
- TEST(h != NULL);
+ TEST(h != NULL,TRUE);
c = baccept(fd,NULL,0);
- TEST(c >= 0);
+ TEST(c >= 0,TRUE);
r = brecv(c,&msg,sizeof(msg),0);
- TEST(r == sizeof(msg));
- TEST(msg == 666);
+ TEST(r, sizeof(msg));
+ TEST(msg, 666);
msg = 667;
r = bsend(c,&msg,sizeof(msg),0);
- TEST(r == sizeof(msg));
+ TEST(r, sizeof(msg));
r = WaitForSingleObject(h, INFINITE);
- TEST(r == WAIT_OBJECT_0);
+ TEST(r, WAIT_OBJECT_0);
- TEST(GetExitCodeThread(h,(DWORD*)&r));
- TEST(r == 0);
+ TEST(GetExitCodeThread(h,(DWORD*)&r),TRUE);
+ TEST(r, 0);
CloseHandle(h);
- TEST(bsocket_shutdown(NULL) == 0);
+ TEST(bsocket_shutdown(NULL), 0);
return 0;
}
+
+int test_echo_server( ) {
+
+ TEST(TRUE,FALSE);
+
+ return 0;
+
+}
+
struct test_case tc[] =
{
@@ -1863,6 +1821,7 @@
{test_overflowsocket,NULL,"Testing if bsocket() fails after creating too many sockets."},
{test_simplewaitobject,NULL,"Testing simple usage of wait objects."},
{test_waitobject,NULL,"Test more complicated usage of wait objects."},
+ //todo -- this has blocked before
{test_waitfail,NULL,"Tests if a wait object fails when it should."},
{test_waitclose,NULL,"Test if a wait object behaves properly on closure."},
{test_maxoverlapped,NULL,"Test if we can have a sufficient number of outstanding operations."},
@@ -1883,6 +1842,7 @@
{test_socketpair_exception,NULL,"Test is socketpair exception behaves properly."},
//{test_verify_npp_usage,NULL,"Check that the NPP is not being used for large sends."},
{test_accept,NULL,"Test is baccept() behaves properly."},
+ {test_echo_server,NULL,"Test if an echo server made entirely with bsockets runs nicely."},
{NULL,NULL,NULL}
};
@@ -1891,7 +1851,6 @@
struct hostent *host;
- /*todo warn user about this putting strain on system*/
int i = 0;
int pass = 0;
@@ -1914,6 +1873,8 @@
if (argc > 1) {
i = atoi(argv[1]);
+ } else {
+ i = 0;
}
while (tc[i].fun != NULL) {
@@ -1939,7 +1900,7 @@
printf("\nTesting Report: %d passed, %d failed\n",pass,fail);
- return 0;
+ return fail;
}
Modified: bsockets/trunk/test.h
===================================================================
--- bsockets/trunk/test.h 2006-08-29 22:06:37 UTC (rev 8304)
+++ bsockets/trunk/test.h 2006-08-30 08:34:56 UTC (rev 8305)
@@ -1,9 +1,14 @@
#ifndef _TEST_H_
#define _TEST_H
-#define TEST(X) if (!((res = X))) { printf("Assertion failed: \"%s\" [errno:%d, w32err:%d line:%d]\n", #X,errno,(int) GetLastError(),__LINE__); fflush(stdout); return 1; }
-#define SILENT_TEST(X) if (!(X)) { return GetLastError(); }
+#define TEST(X,Y) res = (int) (X);\
+ result2 = (int) (Y);\
+ if (res != result2) {\
+ printf("Assertion failed: \"%s != %s [%d] \", %s = %d \n\t[errno:%d, w32err:%d line:%d]\n", #X,#Y,result2,#X,res,errno,(int) GetLastError(),__LINE__); fflush(stdout); return 1; \
+ }\
+#define SILENT_TEST(X,Y) if ( ((X) != (Y)) ) { return GetLastError(); }
+
#endif
Modified: bsockets/trunk/wait.c
===================================================================
--- bsockets/trunk/wait.c 2006-08-29 22:06:37 UTC (rev 8304)
+++ bsockets/trunk/wait.c 2006-08-30 08:34:56 UTC (rev 8305)
@@ -5,10 +5,6 @@
#include "wait.h"
#include "misc.h"
-//todo, come up with a way to recycle monitor objects so we dont have
-//keep allocating them for each wait operation
-
-//todo -- when activated with error code, each wait should return with that error code
int monitor_link(struct _wait_list *l, struct _monitor *m) {
int out;
@@ -19,25 +15,15 @@
ASSERT(m != NULL);
if (l->active) {
-
out = 1;
-
} else {
-
if (l->waiting == NULL) {
-
CHECK(list_enqueue(l, m->where) != NULL,0);
-
l->waiting = m;
-
-
} else {
-
errno = EAGAIN;
out = -1;
-
}
-
}
fail:
@@ -52,12 +38,9 @@
ASSERT(m != NULL);
while (list_dequeue(&l,m->where) == 0) {
-
ASSERT(l != NULL);
ASSERT(l->waiting == m);
-
l->waiting = NULL;
-
}
ASSERT(m->where->head == NULL);
@@ -65,7 +48,6 @@
}
-//todo -- this function should not require any time of atomicity
void monitor_wait(struct _monitor *m, int timeout) {
int r;
@@ -76,6 +58,7 @@
timeout = INFINITE;
}
+ ASSERT(ReleaseMutex(m->mutex));
r = WaitForSingleObject(m->event,timeout);
@@ -89,7 +72,6 @@
break;
-
case WAIT_TIMEOUT:
ASSERT(timeout != INFINITE);
m->who = NULL;
@@ -97,12 +79,10 @@
monitor_detach(m);
break;
-
default:
ASSERT(FALSE);
break;
-
}
ASSERT(m->where != NULL);
@@ -123,6 +103,10 @@
if (m->event != NULL)
ASSERT(CloseHandle(m->event));
+ if (m->mutex != NULL)
+ ASSERT(CloseHandle(m->mutex));
+
+
if (m->where != NULL)
list_free(m->where);
@@ -130,6 +114,33 @@
}
+//returns int so we can consider the case when event inits fail
+int monitor_init(struct _monitor *m) {
+
+ int out;
+
+ out = 0;
+
+ m->event = NULL;
+ m->mutex = NULL;
+ m->err = 0;
+
+ m->where = list_new();
+ CHECK(m->where != NULL,0);
+
+ m->event = CreateEvent(NULL,FALSE,FALSE,NULL);
+ CHECK_(m->event != NULL);
+
+ m->mutex = CreateMutex(NULL,TRUE,NULL);
+ CHECK_(m->mutex != NULL);
+
+ fail:
+
+ return out;
+
+
+}
+
struct _monitor *monitor_new() {
struct _monitor *m;
@@ -139,39 +150,31 @@
out = 0;
err = 0;
+
m = (struct _monitor*)
malloc(sizeof(struct _monitor));
CHECK(m != NULL,ENOMEM);
- m->where = list_new();
- CHECK(m->where != NULL,0);
+ CHECK(monitor_init(m) == 0,0);
- m->event = CreateEvent(NULL,FALSE,FALSE,NULL);
- CHECK_(m->event != NULL);
-
fail:
err = errno;
if (out == -1) {
-
if (m != NULL) {
- ASSERT(FALSE);
monitor_free(m);
m = NULL;
}
-
}
errno = err;
return m;
}
-//todo -- get rid of multiple release mutexes
-//this code is a nightmare, clean it up
int wait_many_timeout(struct _wait_list **d, int n, int timeout) {
- struct _monitor *m;
+ struct _monitor m;
ASSERT(d != NULL);
@@ -179,24 +182,18 @@
int out;
int r;
+ monitor_init(&m);
- m = monitor_new();
-
- CHECK(m != NULL,0);
-
-
for (i=0; i<n; i++) {
- r = monitor_link(d[i],m);
+ r = monitor_link(d[i],&m);
CHECK(r != -1,0);
if (r == 1) {
-
//we have found one which is open, no need to keep looking
- monitor_free(m);
+ monitor_detach(&m);
- //todo -- i hate this
return i;
} else {
@@ -205,22 +202,25 @@
}
- monitor_wait(m,timeout);
+ monitor_wait(&m,timeout);
+ ASSERT(m.who != NULL);
- //todo -- why was this here?
- //ASSERT(m->who != NULL);
out = -1;
- if (m->err) {
- errno = m->err;
-
+ if (m.err) {
+ errno = m.err;
CHECK(FALSE,0);
}
- //todo -- there must be a way to do this in constant time
+
+ /*while this looks ugly, it has to be done. if we are going to create a
+ lookup table, it's going to take just as much time to build as the loop
+ needs to run
+ i wish i didn't decide to implement select
+ select is the problem, not my coding skills*/
for(i=0; i<n; i++) {
- if (d[i] == m->who) {
+ if (d[i] == m.who) {
out = i;
i = n+1;
}
@@ -231,10 +231,6 @@
fail:
- if (m != NULL) {
- monitor_free(m);
- }
-
return out;
}
@@ -252,36 +248,17 @@
}
-/*
-void wl_open(struct _wait_list *wl) {
-
- ASSERT(wl != NULL);
-
- wl_activate(wl,0);
- wl->active = -1;
-
-}
-
-void wl_close(struct _wait_list *wl) {
-
- ASSERT(wl != NULL);
- //you are not allowed to call wl_close on a closed lists
- ASSERT(wl->waiting == NULL);
-
- wl->active = 0;
-
-}
-
-*/
-
void wl_activate(struct _wait_list *l, int code) {
struct _monitor *m;
+ int r;
ASSERT(l != NULL);
if ( (m = l->waiting) != NULL) {
+ r = WaitForSingleObject(m->mutex,INFINITE);
+ ASSERT(r == WAIT_OBJECT_0);
monitor_detach(m);
m->who = l;
@@ -291,10 +268,8 @@
}
-
l->active = TRUE;
-
}
void wl_deactivate(struct _wait_list *l) {
Modified: bsockets/trunk/wait.h
===================================================================
--- bsockets/trunk/wait.h 2006-08-29 22:06:37 UTC (rev 8304)
+++ bsockets/trunk/wait.h 2006-08-30 08:34:56 UTC (rev 8305)
@@ -10,9 +10,9 @@
int active;
+
};
-
struct _monitor {
/*whoever is waiting on this monitor is waiting for this event
@@ -20,6 +20,9 @@
HANDLE event;
+ HANDLE mutex;
+
+
/*nodes which are in lines in which we are currently waiting*/
struct _list *where;
@@ -32,8 +35,6 @@
};
-
-
struct _wait_list *wl_new();
void wl_free();
@@ -48,6 +49,4 @@
void wl_activate(struct _wait_list *, int);
void wl_deactivate(struct _wait_list *);
-//void wl_wakeall(struct _wait_list *, int);
-
#endif
More information about the tor-commits
mailing list