[Mono-list] [PATCH] robust mono-handle-d?

Dick Porter dick@ximian.com
Fri, 7 Jun 2002 11:06:00 +0100


On Thu, Jun 06, 2002 at 10:42:38PM +0200, Dennis Haney wrote:
> 
> This is primarily a documentation patch, but it also adds a single
> error check (assert if unref is called with refcnt==0) and many
> g_warning with a exit(-1) right after was changed to g_critical. The
> states a daemon was running in was replaced by an enum to make it more
> clean what is what.

Mostly OK.  I've commented on some details below.

- Dick


> +
> +The mono_handle_d is a process which takes care of the (de)allocation
> +of scratch shared memory and filehandles and refcounts of the
> +filehandles. It is designed to be run by a user and to be fast, thus

Not just file handles, there are many sorts.  Please change this wording
throughout the doc and the comments.

> +
> +=head2 How to start the deamon

Please make sure you've spelled "daemon" correctly throughout (including in
typedefs :) )

> +
> +Deallocate a shared memory area, this must have been allocated before
> +deallocating. A L<WapiHandleResponse> with
> +.type=WapiHandleResponseType_Scratch Freewill be sent back (works just

Some typos here

> Index: daemon-messages.c
> @@ -71,7 +71,11 @@
>  	int ret;
>  	
>  	ret=recv (fd, req, sizeof(WapiHandleRequest), MSG_NOSIGNAL);
> +	//we cant check ret != sizeof(WapiHandleRequest) because its a
> +	//union

Please replace the // comments with /* */

>  	
>  	ret=send (fd, resp, sizeof(WapiHandleResponse), MSG_NOSIGNAL);
> -	if(ret==-1) {
>  #ifdef DEBUG
> +	if(ret==-1 || ret != sizeof(WapiHandleResponse)) {

I don't understand this bit.  Earlier you said you can't use sizeof on a 
union, but here you are doing it.

> Index: daemon-messages.h
> @@ -18,6 +18,7 @@
>  	WapiHandleRequestType_Close,
>  	WapiHandleRequestType_Scratch,
>  	WapiHandleRequestType_ScratchFree,
> +	WapiHandleRequestType_Error,
>  } WapiHandleRequestType;

Please move the Error enum to the top of the list, to be symmetrical with
the responses.

> Index: daemon.c
> ===================================================================
>  
> +// Array to hold the filehandles we are currently polling
>  static struct pollfd *pollfds=NULL;

Comments again...

> -static gpointer *handle_refs=NULL;
> +static guint32 **handle_refs=NULL;

Good catch.

>  static gboolean unref_handle (guint32 idx, guint32 handle)
>  {
>  	guint32 *open_handles=handle_refs[idx];
> @@ -104,6 +137,8 @@
>  		return(FALSE);
>  	}
>  	
> +	g_assert(open_handles[handle] != 0);
> +

Shouldn't use assert in the daemon.  Just g_warning and ignore the request if
the handle isn't open.

> @@ -325,9 +433,19 @@
>  	case WapiHandleRequestType_ScratchFree:
>  		process_scratch_free (idx, req.u.scratch_free.idx);
>  		break;
> +	case WapiHandleRequestType_Error: /* Falltrough */
> +	default:
> +		/*FIXME: call rem_fd?*/
> +		break;
>  	}

I prefer to not use default in switch statements like this, so the compiler
will remind me when I've forgotten to add a case.


The rest is fine though.