Index: src/backend/postmaster/autovacuum.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/postmaster/autovacuum.c,v
retrieving revision 1.42
diff -c -p -r1.42 autovacuum.c
*** src/backend/postmaster/autovacuum.c	18 Apr 2007 16:44:18 -0000	1.42
--- src/backend/postmaster/autovacuum.c	2 May 2007 15:25:27 -0000
*************** AutoVacWorkerMain(int argc, char *argv[]
*** 1407,1431 ****
  	 * Get the info about the database we're going to work on.
  	 */
  	LWLockAcquire(AutovacuumLock, LW_EXCLUSIVE);
! 	MyWorkerInfo = (WorkerInfo) MAKE_PTR(AutoVacuumShmem->av_startingWorker);
! 	dbid = MyWorkerInfo->wi_dboid;
! 	MyWorkerInfo->wi_workerpid = MyProcPid;
! 
! 	/* insert into the running list */
! 	SHMQueueInsertBefore(&AutoVacuumShmem->av_runningWorkers, 
! 						 &MyWorkerInfo->wi_links);
  	/*
! 	 * remove from the "starting" pointer, so that the launcher can start a new
! 	 * worker if required
  	 */
! 	AutoVacuumShmem->av_startingWorker = INVALID_OFFSET;
! 	LWLockRelease(AutovacuumLock);
  
! 	on_shmem_exit(FreeWorkerInfo, 0);
  
! 	/* wake up the launcher */
! 	if (AutoVacuumShmem->av_launcherpid != 0)
! 		kill(AutoVacuumShmem->av_launcherpid, SIGUSR1);
  
  	if (OidIsValid(dbid))
  	{
--- 1407,1442 ----
  	 * Get the info about the database we're going to work on.
  	 */
  	LWLockAcquire(AutovacuumLock, LW_EXCLUSIVE);
! 
  	/*
! 	 * beware of startingWorker being INVALID; this could happen if the
! 	 * launcher thinks we've taking too long to start.
  	 */
! 	if (AutoVacuumShmem->av_startingWorker != INVALID_OFFSET)
! 	{
! 		MyWorkerInfo = (WorkerInfo) MAKE_PTR(AutoVacuumShmem->av_startingWorker);
! 		dbid = MyWorkerInfo->wi_dboid;
! 		MyWorkerInfo->wi_workerpid = MyProcPid;
! 
! 		/* insert into the running list */
! 		SHMQueueInsertBefore(&AutoVacuumShmem->av_runningWorkers, 
! 							 &MyWorkerInfo->wi_links);
! 		/*
! 		 * remove from the "starting" pointer, so that the launcher can start a new
! 		 * worker if required
! 		 */
! 		AutoVacuumShmem->av_startingWorker = INVALID_OFFSET;
! 		LWLockRelease(AutovacuumLock);
  
! 		on_shmem_exit(FreeWorkerInfo, 0);
  
! 		/* wake up the launcher */
! 		if (AutoVacuumShmem->av_launcherpid != 0)
! 			kill(AutoVacuumShmem->av_launcherpid, SIGUSR1);
! 	}
! 	else
! 		/* no worker entry for me, go away */
! 		LWLockRelease(AutovacuumLock);
  
  	if (OidIsValid(dbid))
  	{
*************** AutoVacWorkerMain(int argc, char *argv[]
*** 1466,1473 ****
  	}
  
  	/*
! 	 * FIXME -- we need to notify the launcher when we are gone.  But this
! 	 * should be done after our PGPROC is released, in ProcKill.
  	 */
  
  	/* All done, go away */
--- 1477,1484 ----
  	}
  
  	/*
! 	 * The launcher will be notified of my death in ProcKill, *if* we managed
! 	 * to get a worker slot at all
  	 */
  
  	/* All done, go away */
