Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 20 Dec 2008 02:23:20 +0000
From:      Ferner Cilloniz <fernercc@gmail.com>
To:        Julian Elischer <julian@elischer.org>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: adding proc to allproc
Message-ID:  <1229739800.5614.24.camel@mobiliare.Belkin>
In-Reply-To: <494C8508.2020000@elischer.org>
References:  <1229726360.5614.15.camel@mobiliare.Belkin> <494C8246.3020703@elischer.org> <1229729326.5614.16.camel@mobiliare.Belkin> <494C8508.2020000@elischer.org>

next in thread | previous in thread | raw e-mail | index | archive | help
The process comes from the allproc list.
I am simply iterating through this list and removing the first 1/2 of
allproc list and adding the removed process to my own singly linked
list.

LIST_REMOVE(current_proc, p_list);  // remove from the allproc
add_proc_entry(current_proc);

Later, i am iterating through my singly linked list and doing the below:

struct proc *p = current->p;
f( p != NULL && (p->p_state == PRS_NEW || p->p_state == PRS_NORMAL) ){
      LIST_INSERT_HEAD(&allproc, p, p_list);
}

Could this be causing a circular list?

I am adding the proc entries to my singly linked list as follows:

static void add_proc_entry(const struct proc *p)
{
    struct proc_ll *new_entry = (struct proc_ll*)malloc(sizeof(struct
proc_ll), M_TEMP, M_ZERO | M_NOWAIT);
    int done = 0;

    new_entry->p = p; // maybe doing this assignment isnt correct?

    if(proc_entries == NULL) {
        proc_entries = new_entry;
        return;
    }

    struct proc_ll *current = proc_entries;

    while(current != NULL) {
        if(current->next == NULL) {
            current->next = new_entry;
            break;
        }
        current = current->next;
    }
}


struct proc_ll {
    struct proc *p;
    struct proc_ll *next;
};


A circular list does sound like it could cause hanging to occur but the
above code, atleast from my eyes, doesn't seem to cause it.

On Fri, 2008-12-19 at 21:39 -0800, Julian Elischer wrote:
> Ferner Cilloniz wrote:
> > When i run the code from a KLD it hangs the system. No reboot occurs
> > however, it just hangs there.
> 
> well, firstly you have no locking though that would probably let you 
> get away with it most times.
> 
> Where does the process come from in the first place?
> 
> It sounds like you are making a circular list somewhere or somehow...
> 
> have you tried going into ddb?
> 
> 
> 
> 
> > 
> > 
> > On Fri, 2008-12-19 at 21:27 -0800, Julian Elischer wrote:
> >> Ferner Cilloniz wrote:
> >>> Hello everyone.
> >>>
> >>> I am playing with freebsd and just learning some things about the
> >>> FreeBSD kernel. 
> >>>
> >>> So for my first quest i am placing random processes from the allproc
> >>> list into a list of my own and trying to add them back into allproc
> >>>
> >>> I have pasted the code below.
> >>>
> >>> -----------------------------------------------------------------------
> >>> struct proc *p = a process from my own list;
> >>> if( p != NULL && (p->p_state == PRS_NEW || p->p_state == PRS_NORMAL) ){
> >>>        LIST_INSERT_HEAD(&allproc, p, p_list);
> >>> }
> >>> -----------------------------------------------------------------------
> 
> >>
> >>> _______________________________________________
> >>> freebsd-hackers@freebsd.org mailing list
> >>> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> >>> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org"
> 





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1229739800.5614.24.camel>