rmeddis@38: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% rmeddis@38: % This program is free software; you can redistribute it and/or modify rmeddis@38: % it under the terms of the GNU General Public License as published by rmeddis@38: % the Free Software Foundation; either version 2 of the License, or rmeddis@38: % (at your option) any later version. rmeddis@38: % rmeddis@38: % This program is distributed in the hope that it will be useful, rmeddis@38: % but WITHOUT ANY WARRANTY; without even the implied warranty of rmeddis@38: % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the rmeddis@38: % GNU General Public License for more details. rmeddis@38: % rmeddis@38: % You can obtain a copy of the GNU General Public License from rmeddis@38: % http://www.gnu.org/copyleft/gpl.html or by writing to rmeddis@38: % Free Software Foundation, Inc.,675 Mass Ave, Cambridge, MA 02139, USA. rmeddis@38: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% rmeddis@38: rmeddis@38: % This is a function the makes sure all of the jobs get completed in an rmeddis@38: % orderly fashion. It is responsible for keeping unruly nodes in line. rmeddis@38: % NC 2010/1011 rmeddis@38: rmeddis@38: function worker(workFolder) rmeddis@38: rmeddis@38: %unit testing rmeddis@38: % close all; clear all; clc rmeddis@38: % workFolder = 'D:\exps\_bar'; rmeddis@38: rmeddis@38: rmeddis@38: %main script rmeddis@38: isloaded = 0; rmeddis@38: while ~isloaded rmeddis@38: if numel(dir(fullfile(workFolder,'jobLock.txt'))) %Check to see if lock already in place rmeddis@38: pTime = randi(30); rmeddis@38: disp(['Worker function locked out -> waiting for ' num2str(pTime) ' seconds until next retry']); rmeddis@38: pause(pTime); rmeddis@38: else rmeddis@38: load(fullfile(workFolder,'jobObject.mat')) rmeddis@38: isloaded = 1; rmeddis@38: end rmeddis@38: end rmeddis@38: rmeddis@38: rmeddis@38: rmeddis@38: x=obj; rmeddis@38: clear obj; rmeddis@38: x.initMAP; %Need to alert it to the path rmeddis@38: rmeddis@38: personalWork = 0; rmeddis@38: while(any(x.todoStatus==0)) rmeddis@38: x.lockJobList; rmeddis@38: x = x.loadSelf; %Reload incase changed rmeddis@38: rJobs = 8+randi(8);%Grab 1st 9-16 open jobs rmeddis@38: todoNow = find(~x.todoStatus,rJobs,'first'); rmeddis@38: x.todoStatus(todoNow) = 1; %Flag it (them) as pending rmeddis@38: x.storeSelf; %store pending flag as quickly as possible to minimise race condition impact rmeddis@38: x.unlockJobList; rmeddis@38: disp(['Grabbed ' num2str(numel(todoNow)) ' sound files for current job.']) rmeddis@38: rmeddis@38: % --- DO WORK --- rmeddis@38: for tt=1:numel(todoNow) rmeddis@38: if ~numel(dir(fullfile(x.opFolder,strrep(x.wavList(todoNow(tt)).name, '.wav','.map')))); rmeddis@38: x.genFeat(x.wavList(todoNow(tt)).name); rmeddis@38: else rmeddis@38: disp(['File ' x.wavList(todoNow(tt)).name ' already processed']) rmeddis@38: end rmeddis@38: rmeddis@38: end rmeddis@38: % --- END OF WORK --- rmeddis@38: rmeddis@38: rmeddis@38: x.lockJobList; rmeddis@38: x = x.loadSelf; %Reload incase changed while processing (probably has) rmeddis@38: x.todoStatus(todoNow) = 2; %Flag as complete rmeddis@38: x.storeSelf; %Update as done immediately rmeddis@38: x.unlockJobList; rmeddis@38: rmeddis@38: clc rmeddis@38: personalWork = personalWork+1; rmeddis@38: disp( ['This process has completed ' num2str(personalWork) ' lists'] ) rmeddis@38: x.checkStatus rmeddis@38: end rmeddis@38: rmeddis@38: disp('-*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-') rmeddis@38: disp( ' > COMPLETED CURRENT JOB' ) rmeddis@38: disp( [' In the folder ' workFolder ' .....'] ) rmeddis@38: disp( [' This process completed ' num2str(personalWork) ' lists'] ) rmeddis@38: disp('-*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-') rmeddis@38: rmeddis@38: