Cleanup more resources upon exit

This commit is contained in:
Thomas Veerman 2011-09-15 15:39:13 +00:00
parent 1c928cf61a
commit 90cde23c19
6 changed files with 90 additions and 36 deletions

View File

@ -343,7 +343,7 @@ PRIVATE void *do_pending_pipe(void *arg)
fp->fp_buffer, fp->fp_nbytes);
if (r != SUSPEND) /* Do we have results to report? */
(void) reply(who_e, r);
reply(who_e, r);
unlock_filp(f);
@ -431,18 +431,7 @@ PRIVATE void *do_work(void *arg)
if (fp->fp_wtid == dl_worker.w_tid)
deadlock_resolving = 0;
}
if (reply(who_e, error) != OK) {
if ((vmp = find_vmnt(who_e)) != NULL) {
for (i = 0; i < NR_PROCS; i++) {
rfp = &fproc[i];
if (rfp->fp_task == vmp->m_fs_e) {
/* We found a process waiting for a
* reply from non-responsive FS */
worker_stop(worker_get(rfp->fp_wtid));
}
}
}
}
reply(who_e, error);
}
thread_cleanup(fp);
@ -764,7 +753,7 @@ PRIVATE void get_work()
/*===========================================================================*
* reply *
*===========================================================================*/
PUBLIC int reply(whom, result)
PUBLIC void reply(whom, result)
int whom; /* process to reply to */
int result; /* result of the call (usually OK or error #) */
{
@ -776,7 +765,6 @@ int result; /* result of the call (usually OK or error #) */
if (r != OK) {
printf("VFS: couldn't send reply %d to %d: %d\n", result, whom, r);
}
return(r);
}
/*===========================================================================*

View File

@ -457,6 +457,8 @@ PRIVATE void free_proc(struct fproc *exiter, int flags)
*/
unsuspend_by_endpt(exiter->fp_endpoint);
dmap_unmap_by_endpt(exiter->fp_endpoint);
vmnt_unmap_by_endpt(exiter->fp_endpoint);
worker_stop_by_endpt(exiter->fp_endpoint);
/* Release root and working directories. */
if (exiter->fp_rd) { put_vnode(exiter->fp_rd); exiter->fp_rd = NULL; }

View File

@ -116,7 +116,7 @@ _PROTOTYPE( void lock_revive, (void) );
/* main.c */
_PROTOTYPE( int main, (void) );
_PROTOTYPE( int reply, (int whom, int result) );
_PROTOTYPE( void reply, (int whom, int result) );
_PROTOTYPE( void lock_proc, (struct fproc *rfp, int force_lock) );
_PROTOTYPE( void unlock_proc, (struct fproc *rfp) );
_PROTOTYPE( void *do_dummy, (void *arg) );
@ -323,6 +323,7 @@ _PROTOTYPE( struct vmnt *get_locked_vmnt, (struct fproc *rfp) );
_PROTOTYPE( void init_vmnts, (void) );
_PROTOTYPE( int lock_vmnt, (struct vmnt *vp, tll_access_t locktype) );
_PROTOTYPE( void unlock_vmnt, (struct vmnt *vp) );
_PROTOTYPE( void vmnt_unmap_by_endpt, (endpoint_t proc_e) );
/* vnode.c */
_PROTOTYPE( void check_vnode_locks, (void) );

View File

@ -556,6 +556,7 @@ PUBLIC int req_mknod(
PUBLIC int req_mountpoint(endpoint_t fs_e, ino_t inode_nr)
{
message m;
int r;
/* Fill in request message */
m.m_type = REQ_MOUNTPOINT;

View File

@ -9,6 +9,7 @@
#include "fproc.h"
FORWARD _PROTOTYPE( int is_vmnt_locked, (struct vmnt *vmp) );
FORWARD _PROTOTYPE( void clear_vmnt, (struct vmnt *vmp) );
/* Is vmp pointer reasonable? */
#define SANEVMP(v) ((((v) >= &vmnt[0] && (v) < &vmnt[NR_MNTS])))
@ -58,6 +59,25 @@ PUBLIC void check_vmnt_locks()
#endif
}
/*===========================================================================*
* clear_vmnt *
*===========================================================================*/
PRIVATE void clear_vmnt(struct vmnt *vmp)
{
/* Reset vmp to initial parameters */
ASSERTVMP(vmp);
vmp->m_fs_e = NONE;
vmp->m_dev = NO_DEV;
vmp->m_flags = 0;
vmp->m_mounted_on = NULL;
vmp->m_root_node = NULL;
vmp->m_label[0] = '\0';
vmp->m_comm.c_max_reqs = 1;
vmp->m_comm.c_cur_reqs = 0;
vmp->m_comm.c_req_queue = NULL;
}
/*===========================================================================*
* get_free_vmnt *
*===========================================================================*/
@ -92,19 +112,11 @@ PUBLIC struct vmnt *find_vmnt(endpoint_t fs_e)
PUBLIC void init_vmnts(void)
{
/* Initialize vmnt table */
struct vmnt *vp;
struct vmnt *vmp;
for (vp = &vmnt[0]; vp < &vmnt[NR_MNTS]; vp++) {
vp->m_fs_e = NONE;
vp->m_dev = NO_DEV;
vp->m_flags = 0;
vp->m_mounted_on = NULL;
vp->m_root_node = NULL;
vp->m_label[0] = '\0';
vp->m_comm.c_max_reqs = 1;
vp->m_comm.c_cur_reqs = 0;
vp->m_comm.c_req_queue = NULL;
tll_init(&vp->m_lock);
for (vmp = &vmnt[0]; vmp < &vmnt[NR_MNTS]; vmp++) {
clear_vmnt(vmp);
tll_init(&vmp->m_lock);
}
}
@ -168,3 +180,15 @@ PUBLIC void unlock_vmnt(struct vmnt *vmp)
#endif
}
/*===========================================================================*
* vmnt_unmap_by_endpoint *
*===========================================================================*/
PUBLIC void vmnt_unmap_by_endpt(endpoint_t proc_e)
{
struct vmnt *vmp;
if ((vmp = find_vmnt(proc_e)) != NULL)
clear_vmnt(vmp);
}

View File

@ -11,6 +11,8 @@ FORWARD _PROTOTYPE( void get_work, (struct worker_thread *worker) );
FORWARD _PROTOTYPE( void *worker_main, (void *arg) );
FORWARD _PROTOTYPE( void worker_sleep, (struct worker_thread *worker) );
FORWARD _PROTOTYPE( void worker_wake, (struct worker_thread *worker) );
FORWARD _PROTOTYPE( int worker_waiting_for, (struct worker_thread *worker,
endpoint_t proc_e) );
PRIVATE int init = 0;
PRIVATE mthread_attr_t tattr;
@ -26,7 +28,7 @@ PRIVATE mthread_attr_t tattr;
/*===========================================================================*
* worker_init *
*===========================================================================*/
PUBLIC void worker_init(struct worker_thread *worker)
PUBLIC void worker_init(struct worker_thread *wp)
{
/* Initialize worker thread */
if (!init) {
@ -40,13 +42,13 @@ PUBLIC void worker_init(struct worker_thread *worker)
init = 1;
}
ASSERTW(worker);
ASSERTW(wp);
worker->w_job.j_func = NULL; /* Mark not in use */
worker->w_next = NULL;
assert(mutex_init(&worker->w_event_mutex, NULL) == 0);
assert(cond_init(&worker->w_event, NULL) == 0);
assert(mthread_create(&worker->w_tid, &tattr, worker_main, (void *) worker) == 0);
wp->w_job.j_func = NULL; /* Mark not in use */
wp->w_next = NULL;
assert(mutex_init(&wp->w_event_mutex, NULL) == 0);
assert(cond_init(&wp->w_event, NULL) == 0);
assert(mthread_create(&wp->w_tid, &tattr, worker_main, (void *) wp) == 0);
yield();
}
@ -292,10 +294,30 @@ PUBLIC void worker_signal(struct worker_thread *worker)
PUBLIC void worker_stop(struct worker_thread *worker)
{
ASSERTW(worker); /* Make sure we have a valid thread */
worker->w_job.j_m_in.m_type = -EIO;
worker->w_job.j_m_in.m_type = EIO;
worker_wake(worker);
}
/*===========================================================================*
* worker_stop_by_endpt *
*===========================================================================*/
PUBLIC void worker_stop_by_endpt(endpoint_t proc_e)
{
struct worker_thread *worker;
int i;
if (proc_e == NONE) return;
if (worker_waiting_for(&sys_worker, proc_e)) worker_stop(&sys_worker);
if (worker_waiting_for(&dl_worker, proc_e)) worker_stop(&dl_worker);
for (i = 0; i < NR_WTHREADS; i++) {
worker = &workers[i];
if (worker_waiting_for(worker, proc_e))
worker_stop(worker);
}
}
/*===========================================================================*
* worker_self *
*===========================================================================*/
@ -344,3 +366,19 @@ PUBLIC struct job *worker_getjob(thread_t worker_tid)
return(NULL);
}
/*===========================================================================*
* worker_waiting_for *
*===========================================================================*/
PRIVATE int worker_waiting_for(struct worker_thread *worker, endpoint_t proc_e)
{
ASSERTW(worker); /* Make sure we have a valid thread */
if (worker->w_job.j_func != NULL) {
if (worker->w_job.j_fp != NULL) {
return(worker->w_job.j_fp->fp_task == proc_e);
}
}
return(0);
}