VKERNEL Pidfile patch

Matthew Dillon dillon at apollo.backplane.com
Mon Jun 18 11:51:58 PDT 2007


:  - globalized the pidfile char*
:  - reworked writepid() to check for NULL
:    (consistant with other arg-checking within the file)
:  - added cleanpid() and added to halt hooks.

    Looks good. Here's a critique.  No need to initialize a
    global to NULL, it will already be NULL.

:+char *pid_file = NULL;

    No need to initialize self and file to 0/NULL.

:+writepid( void )
:+{
:+	pid_t self = 0;
:+	FILE *file = NULL;

    Unless it creates a serious indenting issue (which sometimes happens,
    but not in this case), don't short-cut the conditional with a return.
    The standard variable name for a stdio file in simple circumstances
    is 'fp' rather then 'file'.  Do this instead:

    pid_t self;
    FILE *fp;

    if (pid_file) {
	    self = getpid();
	    fp = fopen(pid_file, "w");

	    if (fp != NULL) {
		    fprintf(fp, "%ld\n", (long)self);
		    fclose(fp);
	    } else {
		    perror("Warning: couldn't open pidfile");
	    }
    }

:+
:+	if (pid_file == NULL)
:+		return;
:+
:+	self = getpid();
:+	file = fopen(pid_file, "w");
:+
:+	if (file != NULL) {
:+		fprintf(file, "%ld\n", (long)self);
:+		fclose(file);
:+	}
:+	else {
:+		perror("Warning: couldn't open pidfile");
:+	}
:+}

    Same thing below.  Change the coding to:

    if (pid_file != NULL) {
	    /* ignore any error */
	    unlink(pid_file);
	    pid_file = NULL;
    }

:+static
:+void
:+cleanpid( void ) 
:+{
:+	if (pid_file == NULL)
:+		return;
:+	if ( unlink(pid_file) != 0 )
:+		perror("Warning: couldn't remove pidfile");
:+}

    One last note on conditionals like if (pid_file != NULL) { }...
    comparing explicitly against NULL verses just using if (pid_file) { }.

    For simple conditionals such as the above it isn't a big deal.  In more
    complex code it does make the code more readable.  For example, take
    these four ways of doing the same thing:

    if (fp = fopen(pid_file, "w")) {
	    do stuff
	    do stuff
    } else {
	    perror(...)
    }

	This method was commonly used a decade ago, but led to major
	programming mistakes when people would accidently use '=' instead
	of '==' in things like if (a = b) { ... } when they really meant
	if (a == b) { ... }.  Because of that, GCC now reports a warning
	for this case and nobody uses it any more.



    if ((fp = fopen(pid_file, "w")) != NULL) {
	    do stuff
	    do stuff
    } else {
	    perror(...)
    }

	I still do this.  Some people really hate it and for a complex
	operation it probably does end up being less readable.  If it 
	doesn't break the line, though, I consider it ok to still use this
	construct at least for simple code paths.



    fp = fopen(pid_file, "w");
    if (fp) {					<<< TOSS UP, THIS LOOKS BETTER
	    do stuff
	    do stuff
    } else {
	    perror(...)
    }

    fp = fopen(pid_file, "w");
    if (fp != NULL) {				<<< TOSS UP
	    do stuff
	    do stuff
    } else {
	    perror(...)
    }

	For simple code paths it is pretty clear that you do not need 
	the '!= NULL' part.  For more complex code paths, for example where
	the assignment is way far away from the conditional, then the code
	is often more readable if the != NULL is included because it makes
	it obvious that a pointer is being tested.

    if (more->complex->expression) {
	...
    }

    if (more->complex->expression != NULL) {		<<< BETTER
	...
    }

					-Matt
					Matthew Dillon 
					<dillon at backplane.com>





More information about the Submit mailing list