--------------------- PatchSet 1392 Date: 2001/01/26 15:43:41 Author: adri Branch: sfs Tag: (none) Log: Initial commit of the done queue information. * sfs_remove_request shouldn't take a list pointer because the request should only be on ONE list that we can get to via request_queue .. :-) * Add a "done queue" to the mount struct. Requests that are completed in sfs_done_request() are shifted off the request queue and onto the done queue. In sfs_remove_request() the requests are removed off the done queue. TODO: * need to implement a sync/async flag in the req struct so we know whether the request is being waited on by another thread, or the request is being completed through the squid FS callback mechanism. Members: src/fs/sfs/sfs_defines.h:1.1.2.5->1.1.2.6 src/fs/sfs/sfs_interface.c:1.1.2.6->1.1.2.7 src/fs/sfs/sfs_lib.h:1.1.2.3->1.1.2.4 src/fs/sfs/sfs_util.c:1.1.2.5->1.1.2.6 Index: squid/src/fs/sfs/sfs_defines.h =================================================================== RCS file: /cvsroot/squid-sf//squid/src/fs/sfs/Attic/sfs_defines.h,v retrieving revision 1.1.2.5 retrieving revision 1.1.2.6 diff -u -r1.1.2.5 -r1.1.2.6 --- squid/src/fs/sfs/sfs_defines.h 26 Jan 2001 13:49:13 -0000 1.1.2.5 +++ squid/src/fs/sfs/sfs_defines.h 26 Jan 2001 15:43:41 -0000 1.1.2.6 @@ -1,4 +1,4 @@ -/* $Id: sfs_defines.h,v 1.1.2.5 2001/01/26 13:49:13 adri Exp $ */ +/* $Id: sfs_defines.h,v 1.1.2.6 2001/01/26 15:43:41 adri Exp $ */ #ifndef SFS_DEFINES_H #define SFS_DEFINES_H @@ -178,6 +178,10 @@ pthread_mutex_t req_signal_lock; pthread_mutex_t openfiles_lock; /* Lock for the 'other' array */ pthread_t thread_id; + + dlink_list done_queue; + int done_requests; + pthread_mutex_t done_lock; } sfs_mountfs_t; #endif /* !SFS_DEFINES_H */ Index: squid/src/fs/sfs/sfs_interface.c =================================================================== RCS file: /cvsroot/squid-sf//squid/src/fs/sfs/Attic/sfs_interface.c,v retrieving revision 1.1.2.6 retrieving revision 1.1.2.7 diff -u -r1.1.2.6 -r1.1.2.7 --- squid/src/fs/sfs/sfs_interface.c 25 Jan 2001 16:08:11 -0000 1.1.2.6 +++ squid/src/fs/sfs/sfs_interface.c 26 Jan 2001 15:43:41 -0000 1.1.2.7 @@ -55,7 +55,7 @@ _sfs_submit_request(req); _sfs_waitfor_request(req); ret = req->ret; - _sfs_remove_request(&_sfs_mounted[sfsid].request_queue,req); + _sfs_remove_request(req); return ret; } @@ -72,7 +72,7 @@ _sfs_submit_request(req); _sfs_waitfor_request(req); ret = req->ret; - _sfs_remove_request(&_sfs_mounted[sfsfd >> 24].request_queue,req); + _sfs_remove_request(req); return ret; } @@ -107,7 +107,7 @@ } /* I think I'm munging things by adding a '\0', but you get that. */ *((char *)(buf)+ret+1) = '\0'; - _sfs_remove_request(&_sfs_mounted[sfsid].request_queue,req); + _sfs_remove_request(req); return ret; } @@ -132,7 +132,7 @@ ret = req->ret; if (req->buf) xfree(req->buf); - _sfs_remove_request(&_sfs_mounted[sfsid].request_queue,req); + _sfs_remove_request(req); return ret; } @@ -152,7 +152,7 @@ _sfs_submit_request(req); _sfs_waitfor_request(req); ret = req->ret; - _sfs_remove_request(&_sfs_mounted[sfsid].request_queue,req); + _sfs_remove_request(req); return ret; } @@ -216,7 +216,7 @@ return -1; _sfs_waitfor_request(req); ret = req->ret; - _sfs_remove_request(&_sfs_mounted[sfsid].request_queue,req); + _sfs_remove_request(req); if (ret == 0) { if (_sfs_mounted[sfsid].rootblock) { xfree(_sfs_mounted[sfsid].rootblock); @@ -321,6 +321,11 @@ pthread_mutex_init(&(_sfs_mounted[i].req_signal_lock), NULL); pthread_cond_init(&(_sfs_mounted[i].req_signal), NULL); pthread_mutex_init(&(_sfs_mounted[i].openfiles_lock), NULL); + pthread_mutex_init(&(_sfs_mounted[i].done_lock), NULL); + _sfs_mounted[i].done_queue.head = NULL; + _sfs_mounted[i].done_queue.tail = NULL; + _sfs_mounted[i].done_requests = 0; + pthread_create(&(_sfs_mounted[i].thread_id), NULL, (void *)&sfs_thread_loop, &(_sfs_mounted[i])); while (!(_sfs_mounted[i].accepting_requests)) sleep(1); Index: squid/src/fs/sfs/sfs_lib.h =================================================================== RCS file: /cvsroot/squid-sf//squid/src/fs/sfs/Attic/sfs_lib.h,v retrieving revision 1.1.2.3 retrieving revision 1.1.2.4 diff -u -r1.1.2.3 -r1.1.2.4 --- squid/src/fs/sfs/sfs_lib.h 25 Jan 2001 12:10:45 -0000 1.1.2.3 +++ squid/src/fs/sfs/sfs_lib.h 26 Jan 2001 15:43:41 -0000 1.1.2.4 @@ -21,7 +21,7 @@ /* Internal functions */ /* sfs_util.c */ extern void _sfs_waitfor_request(sfs_requestor *req); -extern int _sfs_remove_request(dlink_list *list, sfs_requestor *req); +extern int _sfs_remove_request(sfs_requestor *req); extern void _sfs_done_request(sfs_requestor *req, int retval); extern sfs_requestor * _sfs_create_requestor(int sfsid, enum sfs_request_type reqtype); Index: squid/src/fs/sfs/sfs_util.c =================================================================== RCS file: /cvsroot/squid-sf//squid/src/fs/sfs/Attic/sfs_util.c,v retrieving revision 1.1.2.5 retrieving revision 1.1.2.6 diff -u -r1.1.2.5 -r1.1.2.6 --- squid/src/fs/sfs/sfs_util.c 25 Jan 2001 16:06:34 -0000 1.1.2.5 +++ squid/src/fs/sfs/sfs_util.c 26 Jan 2001 15:43:41 -0000 1.1.2.6 @@ -21,27 +21,47 @@ } } +/* + * _sfs_remove_request + * + * Remove the request from the done request list, and deallocate it. + */ int -_sfs_remove_request(dlink_list *list, sfs_requestor *req) +_sfs_remove_request(sfs_requestor *req) /* This doesn't free the buffer - not sure whether we have any need to keep the buffer anywhere or not, but the option is there... */ { printf("DEBUG: Removing %d request from queue\n",req->request_type); - pthread_mutex_lock(&(_sfs_mounted[req->sfsid].req_lock)); - dlinkDelete(&req->node, list); - pthread_mutex_unlock(&(_sfs_mounted[req->sfsid].req_lock)); + pthread_mutex_lock(&(_sfs_mounted[req->sfsid].done_lock)); + dlinkDelete(&req->node, &(_sfs_mounted[req->sfsid].done_queue)); + _sfs_mounted[req->sfsid].done_requests--; + pthread_mutex_unlock(&(_sfs_mounted[req->sfsid].done_lock)); xfree(req); return (0); } - +/* + * _sfs_done_request + * + * Move the request from the request queue to the done queue, and then + * signal any sleeping thread(s) that this request has completed. + */ void _sfs_done_request(sfs_requestor *req, int retval) { - /* This is due to be replaced with a proper done queue */ req->ret = retval; req->request_state = _SFS_DONE; + + pthread_mutex_lock(&(_sfs_mounted[req->sfsid].req_lock)); + dlinkDelete(&req->node, &(_sfs_mounted[req->sfsid].request_queue)); + pthread_mutex_unlock(&(_sfs_mounted[req->sfsid].req_lock)); + + pthread_mutex_lock(&(_sfs_mounted[req->sfsid].done_lock)); + dlinkAddTail(req, &req->node, &(_sfs_mounted[req->sfsid].done_queue)); + _sfs_mounted[req->sfsid].done_requests++; + pthread_mutex_unlock(&(_sfs_mounted[req->sfsid].done_lock)); + pthread_cond_signal(&(req->done_signal)); }