Hi people: We are developing SqueakDBX, an openDBX ( http://www.linuxnetworks.de/doc/index.php/OpenDBX) wrapper, that let us communicate with major relational databases through a common API. OpenDBX is a C library. SqueakDBX uses FFI to call those functions. Now, I am getting an error with a select() invocation in that code.
This is a piece of the openDBX function with the problem:
static int pgsql_odbx_result( odbx_t* handle, odbx_result_t** result, struct timeval* timeout, unsigned long chunk ) {
struct pgconn* conn = (struct pgconn* ) handle->aux;
if( timeout != NULL ) { fprintf( stdout, "timeval tv_sec value: %d\n", timeout->tv_sec ); fprintf( stdout, "timeval tv_usec value: %d\n", timeout->tv_usec ); } else { puts("El timeval is null"); }
......
#ifdef HAVE_SELECT if( timeout != NULL && PQisBusy( (PGconn*) handle->generic ) == 1 ) { int fd; fd_set fds;
if( ( fd = PQsocket( (PGconn*) handle->generic ) ) == -1 ) { conn->errtype = -1; return -ODBX_ERR_BACKEND; }
FD_ZERO( &fds ); FD_SET( fd, &fds );
switch( select( fd + 1, &fds, NULL, NULL, timeout ) ) { case -1: printf( "Error with select function: %s\n", strerror( errno ) ); return -ODBX_ERR_RESULT; case 0: return ODBX_RES_TIMEOUT; /* timeout while waiting for a result */ } } #endif
Now, I have a problem with select() invocation. This function returns -1. And the printf of the errno (where select() stores the errors), says: "Error with select function: Interrupted system call" which means I am getting a EINTR error. If you see console, you can see something like this:
timeval tv_usec value: 0 timeval tv_sec value: 3 timeval tv_usec value: 0 timeval tv_sec value: 2 timeval tv_usec value: 996000 timeval tv_sec value: 3 timeval tv_usec value: 0 Error with select function: Interrupted system call
I asked Norbert (openDBX author) and he tell me exactly this:
"An interrupted system call is something very normal because signals can be sent at every time to the application, either by the system or by the user. I guess, in the Squeak code there is some signal handler installed, which does something if one of the defined signals arrive.
What I will do is to hide the consequences (returning an error) by looking at the error value and reenter the select call if the system call is interrupted."
All I know is squeakVM is written it SLANG and then that's transformed to C. So, squeakVM runs in C. So, there is where it can be a signal handler ? Is there some way to change that from squeak (image) ?
I am still newbie so I really need help with this.
Thanks for the help in advance.
Mariano