2015-07-02 Fred Gleason <fredg@paravelsystems.com>

* Fixed a bug in 'LogPlay::refresh()' that caused a segfault
	in 'rdairplay/log_play.cpp'.
	* Instrumented the 'LogPlay::refresh()' method in
	'rdairplay/log_play.cpp'.
This commit is contained in:
Fred Gleason 2015-07-02 13:53:48 -04:00
parent 83de4e9fe4
commit 44ab9010a6
3 changed files with 32 additions and 6 deletions

View File

@ -14801,3 +14801,8 @@
* Incremented the package version to 2.10.3caefix00. * Incremented the package version to 2.10.3caefix00.
2015-06-22 Fred Gleason <fredg@paravelsystems.com> 2015-06-22 Fred Gleason <fredg@paravelsystems.com>
* Incremented the package version to 2.10.3caefix01. * Incremented the package version to 2.10.3caefix01.
2015-07-02 Fred Gleason <fredg@paravelsystems.com>
* Fixed a bug in 'LogPlay::refresh()' that caused a segfault
in 'rdairplay/log_play.cpp'.
* Instrumented the 'LogPlay::refresh()' method in
'rdairplay/log_play.cpp'.

View File

@ -1 +1 @@
2.10.3caefix01 2.10.3caefix01

View File

@ -607,13 +607,18 @@ bool LogPlay::refresh()
int running; int running;
int first_non_holdover = 0; int first_non_holdover = 0;
syslog(LOG_NOTICE,"LogPlay::refresh() starting...");
if(play_macro_running) { if(play_macro_running) {
play_refresh_pending=true; play_refresh_pending=true;
syslog(LOG_NOTICE,"LogPlay::refresh() aborting, macro running.");
return true; return true;
} }
syslog(LOG_NOTICE,"LogPlay::refresh() emiting refreshStatusChanged(true)...");
emit refreshStatusChanged(true); emit refreshStatusChanged(true);
if((size()==0)||(play_log==NULL)) { if((size()==0)||(play_log==NULL)) {
syslog(LOG_NOTICE,"LogPlay::refresh() emiting refreshStatusChanged(false)...");
emit refreshStatusChanged(false); emit refreshStatusChanged(false);
syslog(LOG_NOTICE,"LogPlay::refresh() aborting, no log data.");
return true; return true;
} }
@ -624,30 +629,36 @@ bool LogPlay::refresh()
e->setLogName(logName()); e->setLogName(logName());
e->load(); e->load();
play_modified_datetime=play_log->modifiedDatetime(); play_modified_datetime=play_log->modifiedDatetime();
syslog(LOG_NOTICE,"LogPlay::refresh() loaded updated log...");
// //
// Get the Next Event // Get the Next Event
// //
if(nextEvent()!=NULL) { //End of the log? if(nextEvent()!=NULL) { //End of the log?
next_id=nextEvent()->id(); next_id=nextEvent()->id();
syslog(LOG_NOTICE,"LogPlay::refresh() next event ID is %d...",next_id);
} }
// //
// Get Running Events // Get Running Events
// //
running=runningEvents(lines); running=runningEvents(lines);
syslog(LOG_NOTICE,"LogPlay::refresh() running events are %d...",running);
for(int i=0;i<running;i++) { for(int i=0;i<running;i++) {
if(lines[i]==play_next_line-1) { if(lines[i]==play_next_line-1) {
current_id=logLine(lines[i])->id(); current_id=logLine(lines[i])->id();
syslog(LOG_NOTICE,"LogPlay::refresh() current_id is %d...",current_id);
} }
} }
if(running>0 && next_id==-1) { //Last Event of Log Running? if(running>0 && next_id==-1) { //Last Event of Log Running?
current_id=logLine(lines[running-1])->id(); current_id=logLine(lines[running-1])->id();
syslog(LOG_NOTICE,"LogPlay::refresh() current_id is %d (LAST EVENT)...",current_id);
} }
// //
// Pass 1: Finished or Active Events // Pass 1: Finished or Active Events
// //
syslog(LOG_NOTICE,"LogPlay::refresh() Pass 1 starts...");
for(int i=0;i<size();i++) { for(int i=0;i<size();i++) {
d=logLine(i); d=logLine(i);
if(d->status()!=RDLogLine::Scheduled) { if(d->status()!=RDLogLine::Scheduled) {
@ -666,6 +677,7 @@ bool LogPlay::refresh()
// //
// Pass 2: Purge Deleted Events // Pass 2: Purge Deleted Events
// //
syslog(LOG_NOTICE,"LogPlay::refresh() Pass 2 starts...");
for(int i=size()-1;i>=0;i--) { for(int i=size()-1;i>=0;i--) {
if(logLine(i)->pass()==0) { if(logLine(i)->pass()==0) {
remove(i,1,false,true); remove(i,1,false,true);
@ -675,15 +687,20 @@ bool LogPlay::refresh()
// Find first non-holdover event, where start-of-log // Find first non-holdover event, where start-of-log
// new events should be added: // new events should be added:
for(int i=0;i<e->size();i++) { for(int i=0;i<e->size();i++) {
if(logLine(i)->isHoldover()) if(logLine(i)!=NULL) {
++first_non_holdover; if(logLine(i)->isHoldover()) {
else ++first_non_holdover;
break; }
else {
break;
}
}
} }
// //
// Pass 3: Add New Events // Pass 3: Add New Events
// //
syslog(LOG_NOTICE,"LogPlay::refresh() Pass 3 starts...");
for(int i=0;i<e->size();i++) { for(int i=0;i<e->size();i++) {
s=e->logLine(i); s=e->logLine(i);
if(s->pass()==0) { if(s->pass()==0) {
@ -703,6 +720,7 @@ bool LogPlay::refresh()
// //
// Pass 4: Delete Orphaned Past Playouts // Pass 4: Delete Orphaned Past Playouts
// //
syslog(LOG_NOTICE,"LogPlay::refresh() Pass 4 starts...");
for(int i=size()-1;i>=0;i--) { for(int i=size()-1;i>=0;i--) {
d=logLine(i); d=logLine(i);
if((d->status()==RDLogLine::Finished)&&(d->pass()!=2)) { if((d->status()==RDLogLine::Finished)&&(d->pass()!=2)) {
@ -713,7 +731,8 @@ bool LogPlay::refresh()
// //
// Restore Next Event // Restore Next Event
// //
if(current_id!=-1 && e->loglineById(current_id)!=NULL) { syslog(LOG_NOTICE,"LogPlay::refresh() Restore Next starts...");
if(current_id!=-1 && e->loglineById(current_id)!=NULL) {
// Make Next after currently playing cart // Make Next after currently playing cart
// The next event cannot have been a holdover, // The next event cannot have been a holdover,
// as holdovers are always either active or finished. // as holdovers are always either active or finished.
@ -730,6 +749,7 @@ bool LogPlay::refresh()
// //
// Clean Up // Clean Up
// //
syslog(LOG_NOTICE,"LogPlay::refresh() Clean up...");
delete e; delete e;
for(int i=0;i<size();i++) { for(int i=0;i<size();i++) {
logLine(i)->clearPass(); logLine(i)->clearPass();
@ -747,6 +767,7 @@ bool LogPlay::refresh()
emit refreshStatusChanged(false); emit refreshStatusChanged(false);
syslog(LOG_NOTICE,"LogPlay::refresh() completes.");
return true; return true;
} }