samer@4: % disposables - Manage resources that need to be disposed of cleanly samer@4: % samer@4: % This is implemented as a message handler to be used as follows: samer@4: % samer@4: % >> ref=disposables('reg',x) % register x as a disposable returning reference ref samer@4: % >> disposables('dereg',ref) % deregister (but do not dispose) of registered object samer@4: % >> dx=disposables('get') % get cell array of all registered objects samer@4: % >> disposables('dispose') % dispose of and deregister all disposables samer@4: % samer@4: % In most cases, you will not need to use this function as resources should samer@4: % be disposed of correctly by the functions that acquire them. However, if samer@4: % things go wrong or the user presses Ctrl-C, some objects might not be samer@4: % disposed of properly and cause problems later. In this case, a call to samer@4: % disposables('dispose') should take care of it. samer@4: samer@4: function varargout=disposables(msg,varargin) samer@4: persistent registry samer@4: samer@4: switch(msg) samer@4: case 'reg', samer@4: obj=varargin{1}; samer@4: registry = [registry, obj]; samer@4: varargout{1}=obj; samer@4: case 'dereg', samer@4: obj=varargin{1}; samer@42: if ~isempty(registry) samer@42: idx=find(registry==obj); samer@42: registry=registry([1:idx-1,idx+1:length(registry)]); samer@42: end samer@4: case 'get' samer@4: varargout{1}=registry; samer@4: case 'dispose' samer@4: for i=1:length(registry) samer@4: registry(i).dispose(); samer@4: end samer@4: registry=[]; samer@4: end samer@4: end samer@4: