Ticket #1791: mythtv-0.20.jobhibernate.patch.txt

File mythtv-0.20.jobhibernate.patch.txt, 45.2 KB (added by mrsam@…, 19 years ago)

0.20 patch, part I

Line 
1--- ./programs/mythcommflag/main.cpp.hibernate 2006-08-17 09:53:41.000000000 -0400
2+++ ./programs/mythcommflag/main.cpp 2006-09-25 22:19:00.000000000 -0400
3@@ -52,6 +52,13 @@
4
5 int jobID = -1;
6 int lastCmd = -1;
7+JobMonitor *currentJobMonitor;
8+
9+static void rebuild_status_callback(int, void *)
10+{
11+ if (currentJobMonitor)
12+ currentJobMonitor->hibernate();
13+}
14
15 int BuildVideoMarkup(QString& filename)
16 {
17@@ -82,7 +89,7 @@
18 program_info);
19 nvp->SetRingBuffer(tmprbuf);
20
21- nvp->RebuildSeekTable(!quiet);
22+ nvp->RebuildSeekTable(!quiet, rebuild_status_callback);
23
24 cerr << "Rebuilt\n";
25
26@@ -255,7 +262,9 @@
27
28 if (jobID != -1)
29 {
30- int curCmd = JobQueue::GetJobCmd(jobID);
31+ int curCmd = currentJobMonitor ? currentJobMonitor->GetJobCmd()
32+ : JobQueue::GetJobCmd(jobID);
33+
34 if (curCmd == lastCmd)
35 return;
36
37@@ -397,6 +406,10 @@
38
39 program_info->SetCommFlagged(COMM_FLAG_PROCESSING);
40
41+ JobMonitor monitor(jobID);
42+
43+ currentJobMonitor= jobID == -1 ? NULL: &monitor;
44+
45 CustomEventRelayer cer(incomingCustomEvent);
46 SlotRelayer a(commDetectorBreathe);
47 SlotRelayer b(commDetectorStatusUpdate);
48@@ -447,7 +460,7 @@
49 }
50
51 delete commDetector;
52-
53+ currentJobMonitor=NULL;
54 return comms_found;
55 }
56
57@@ -537,7 +550,7 @@
58
59 if (rebuildSeekTable)
60 {
61- nvp->RebuildSeekTable();
62+ nvp->RebuildSeekTable(false, rebuild_status_callback);
63
64 if (!quiet)
65 cerr << "Rebuilt\n";
66--- ./programs/mythtranscode/transcode.cpp.hibernate 2006-08-23 18:20:59.000000000 -0400
67+++ ./programs/mythtranscode/transcode.cpp 2006-09-25 22:19:00.000000000 -0400
68@@ -609,6 +609,8 @@
69 QTime flagTime;
70 flagTime.start();
71
72+ JobMonitor monitor(jobID);
73+
74 while (nvp->TranscodeGetNextFrame(dm_iter, &did_ff, &is_key, honorCutList))
75 {
76 if (first_loop)
77@@ -885,7 +887,7 @@
78
79 if ((jobID >= 0) || (print_verbose_messages & VB_IMPORTANT))
80 {
81- if (JobQueue::GetJobCmd(jobID) == JOB_STOP)
82+ if (monitor.GetJobCmd() == JOB_STOP)
83 {
84 unlink(outputname);
85 delete newFrame;
86--- ./programs/mythtranscode/mpeg2fix.cpp.hibernate 2006-07-18 20:24:00.000000000 -0400
87+++ ./programs/mythtranscode/mpeg2fix.cpp 2006-09-25 22:24:29.000000000 -0400
88@@ -14,6 +14,7 @@
89 #include <netinet/in.h>
90 #include <getopt.h>
91 #include <stdint.h>
92+#include "jobqueue.h"
93
94 #ifndef O_LARGEFILE
95 #define O_LARGEFILE 0
96@@ -199,8 +200,11 @@
97 MPEG2fixup::MPEG2fixup(const char *inf, const char *outf,
98 QMap<long long, int> *deleteMap,
99 const char *fmt, int norp, int fixPTS, int maxf,
100- bool showprog, int otype)
101+ bool showprog, int otype, int jobIDarg)
102+ : rx(jobID)
103 {
104+ jobID=jobIDarg;
105+
106 displayFrame = new QPtrListIterator<MPEG2frame> (vFrame);
107
108 infile = inf;
109@@ -429,13 +433,14 @@
110 return (rx->WaitBuffers());
111 }
112
113-MPEG2replex::MPEG2replex()
114+MPEG2replex::MPEG2replex(int jobIDarg)
115 {
116 memset(&vrbuf, 0, sizeof(ringbuffer));
117 memset(&index_vrbuf, 0, sizeof(ringbuffer));
118 memset(&extrbuf, 0, sizeof(ringbuffer) * N_AUDIO);
119 memset(&index_extrbuf, 0, sizeof(ringbuffer) * N_AUDIO);
120 ext_count = 0;
121+ jobID=jobIDarg;
122 }
123
124 MPEG2replex::~MPEG2replex()
125@@ -1797,8 +1802,12 @@
126
127 InitReplex();
128
129+ JobMonitor monitor(jobID);
130+
131 while (1)
132 {
133+ monitor.hibernate();
134+
135 /* read packet */
136 if (! file_end)
137 {
138@@ -2432,6 +2441,8 @@
139 AVPacket pkt;
140 int count = 0;
141
142+ JobMonitor monitor(jobID);
143+
144 /*============ initialise AV ===============*/
145 if (!InitAV(file.ascii(), NULL, 0))
146 return TRANSCODE_EXIT_UNKNOWN_ERROR;
147@@ -2440,6 +2451,8 @@
148
149 while (av_read_frame(inputFC, &pkt) >= 0)
150 {
151+ monitor.hibernate();
152+
153 if (pkt.stream_index == vid_id)
154 {
155 if (pkt.flags & PKT_FLAG_KEY)
156--- ./programs/mythtranscode/mpeg2fix.h.hibernate 2006-02-18 13:44:52.000000000 -0500
157+++ ./programs/mythtranscode/mpeg2fix.h 2006-09-25 22:20:52.000000000 -0400
158@@ -102,7 +102,7 @@
159 class MPEG2replex
160 {
161 public:
162- MPEG2replex();
163+ MPEG2replex(int jobID);
164 ~MPEG2replex();
165 void Start();
166 int WaitBuffers();
167@@ -124,6 +124,7 @@
168
169 private:
170 multiplex_t *mplex;
171+ int jobID;
172 };
173
174 class MPEG2fixup
175@@ -131,7 +132,8 @@
176 public:
177 MPEG2fixup(const char *inf, const char *outf,
178 QMap<long long, int> *deleteMap, const char *fmt, int norp,
179- int fixPTS, int maxf, bool showprog, int otype);
180+ int fixPTS, int maxf, bool showprog, int otype,
181+ int jobID);
182 ~MPEG2fixup();
183 int Start();
184 void AddRangeList(QStringList cutlist, int type);
185@@ -224,6 +226,8 @@
186 QMap<long long, int> delMap;
187 QMap<long long, int> saveMap;
188
189+ int jobID;
190+
191 pthread_t thread;
192
193 AVFormatContext *inputFC;
194--- ./programs/mythtranscode/main.cpp.hibernate 2006-07-15 15:39:26.000000000 -0400
195+++ ./programs/mythtranscode/main.cpp 2006-09-25 22:22:04.000000000 -0400
196@@ -468,7 +468,7 @@
197
198 MPEG2fixup *m2f = new MPEG2fixup(infile.ascii(), outfile.ascii(),
199 &deleteMap, NULL, false, false, 20,
200- showprogress, otype);
201+ showprogress, otype, jobID);
202 if (build_index)
203 {
204 int err = BuildKeyframeIndex(m2f, infile, posMap, jobID);
205--- ./programs/mythfilldatabase/filldata.cpp.hibernate 2006-09-25 22:16:01.000000000 -0400
206+++ ./programs/mythfilldatabase/filldata.cpp 2006-09-25 22:55:42.000000000 -0400
207@@ -43,6 +43,7 @@
208 #include "cardutil.h"
209 #include "sourceutil.h"
210 #include "remoteutil.h"
211+#include "jobqueue.h"
212
213 using namespace std;
214
215@@ -81,6 +82,8 @@
216 QString graboptions = "";
217 QString cardtype = QString::null;
218
219+JobMonitor *myMonitor;
220+
221 class ChanInfo
222 {
223 public:
224@@ -241,6 +244,8 @@
225 int secs;
226 QDateTime newFrom, newTo;
227
228+ myMonitor->hibernate();
229+
230 MSqlQuery query(MSqlQuery::InitCon());
231
232 query.prepare("SELECT tmoffset FROM channel where chanid = :CHANID ;");
233@@ -258,6 +263,8 @@
234 newFrom = from.addSecs(secs);
235 newTo = to.addSecs(secs);
236
237+ myMonitor->hibernate();
238+
239 query.prepare("DELETE FROM program "
240 "WHERE starttime >= :FROM AND starttime < :TO "
241 "AND chanid = :CHANID ;");
242@@ -266,6 +273,8 @@
243 query.bindValue(":CHANID", chanid);
244 query.exec();
245
246+ myMonitor->hibernate();
247+
248 query.prepare("DELETE FROM programrating "
249 "WHERE starttime >= :FROM AND starttime < :TO "
250 "AND chanid = :CHANID ;");
251@@ -274,6 +283,8 @@
252 query.bindValue(":CHANID", chanid);
253 query.exec();
254
255+ myMonitor->hibernate();
256+
257 query.prepare("DELETE FROM credits "
258 "WHERE starttime >= :FROM AND starttime < :TO "
259 "AND chanid = :CHANID ;");
260@@ -282,6 +293,8 @@
261 query.bindValue(":CHANID", chanid);
262 query.exec();
263
264+ myMonitor->hibernate();
265+
266 query.prepare("DELETE FROM programgenres "
267 "WHERE starttime >= :FROM AND starttime < :TO "
268 "AND chanid = :CHANID ;");
269@@ -298,6 +311,8 @@
270 "sourceid = :SOURCE ;");
271 query.bindValue(":SOURCE", sourceid);
272
273+ myMonitor->hibernate();
274+
275 if (!query.exec())
276 MythContext::DBError("Selecting channels per source", query);
277
278@@ -366,6 +381,8 @@
279
280 QString fileprefix = SetupIconCacheDirectory();
281
282+ myMonitor->hibernate();
283+
284 MSqlQuery query(MSqlQuery::InitCon());
285 query.prepare("SELECT ch.chanid, nim.url "
286 "FROM (channel ch, callsignnetworkmap csm) "
287@@ -382,6 +399,8 @@
288 {
289 while (query.next())
290 {
291+ myMonitor->hibernate();
292+
293 QString icon_url = expandURLString(query.value(1).toString());
294 QFileInfo qfi(icon_url);
295 QFile localfile(fileprefix + "/" + qfi.fileName());
296@@ -566,6 +585,7 @@
297 QDomNode node = element.firstChild();
298 while (!node.isNull())
299 {
300+ myMonitor->hibernate();
301 try
302 {
303 QDomElement e = nodeToElement(node);
304@@ -576,6 +596,7 @@
305
306 nm_query.bindValue(":NETWORK", net.stripWhiteSpace());
307 nm_query.bindValue(":URL", u.stripWhiteSpace());
308+
309 if (!nm_query.exec())
310 MythContext::DBError(
311 "Inserting network->url mapping", nm_query);
312@@ -599,6 +620,8 @@
313 st += getNamedElementText(e, IM_BASE_STUB_TAG);
314 QString u = getNamedElementText(e, IM_NET_URL_TAG);
315
316+ myMonitor->hibernate();
317+
318 MSqlQuery qc(MSqlQuery::InitCon());
319 qc.prepare("SELECT COUNT(*) FROM settings "
320 "WHERE value = :STUBNAME");
321@@ -616,6 +639,8 @@
322 qr->bindValue(":STUBNAME", st);
323 qr->bindValue(":URL", u);
324
325+ myMonitor->hibernate();
326+
327 if (!qr->exec())
328 MythContext::DBError(
329 "Inserting callsign->network mapping", *qr);
330@@ -667,6 +692,8 @@
331 QDomDocument iconmap;
332 QDomElement roote = iconmap.createElement(IM_DOC_TAG);
333
334+ myMonitor->hibernate();
335+
336 MSqlQuery query(MSqlQuery::InitCon());
337 query.exec("SELECT * FROM callsignnetworkmap ORDER BY callsign;");
338
339@@ -674,6 +701,8 @@
340 {
341 while (query.next())
342 {
343+ myMonitor->hibernate();
344+
345 QDomElement cs2nettag = iconmap.createElement(IM_CS_TO_NET_TAG);
346 QDomElement cstag = iconmap.createElement(IM_CS_TAG);
347 QDomElement nettag = iconmap.createElement(IM_NET_TAG);
348@@ -692,11 +721,14 @@
349 }
350 }
351
352+ myMonitor->hibernate();
353 query.exec("SELECT * FROM networkiconmap ORDER BY network;");
354 if (query.isActive() && query.size() > 0)
355 {
356 while (query.next())
357 {
358+ myMonitor->hibernate();
359+
360 QDomElement net2urltag = iconmap.createElement(
361 IM_NET_TO_URL_TAG);
362 QDomElement nettag = iconmap.createElement(IM_NET_TAG);
363@@ -716,6 +748,8 @@
364 }
365 }
366
367+ myMonitor->hibernate();
368+
369 query.prepare("SELECT value,data FROM settings WHERE value "
370 "LIKE :URLMAP");
371 query.bindValue(":URLMAP", QString(BASEURLMAP_START) + "%");
372@@ -725,6 +759,8 @@
373 QRegExp baseax("\\.([^\\.]+)$");
374 while (query.next())
375 {
376+ myMonitor->hibernate();
377+
378 QString base_stub = query.value(0).toString();
379 if (baseax.search(base_stub) != -1)
380 {
381@@ -760,6 +796,8 @@
382
383 void RunSimpleQuery(const QString &query)
384 {
385+ myMonitor->hibernate();
386+
387 MSqlQuery q(MSqlQuery::InitCon());
388 if (!q.exec(query))
389 MythContext::DBError("RunSimpleQuery ", q);
390@@ -770,6 +808,7 @@
391 MSqlQuery query(MSqlQuery::InitCon());
392 query.prepare("DELETE FROM settings WHERE value LIKE :URLMAPLIKE");
393 query.bindValue(":URLMAPLIKE", QString(BASEURLMAP_START) + '%');
394+ myMonitor->hibernate();
395 if (!query.exec())
396 MythContext::DBError("ResetIconMap", query);
397
398@@ -799,6 +838,8 @@
399
400 freq = get_center_frequency("atsc", "vsb8", "us", freqid);
401
402+ myMonitor->hibernate();
403+
404 // Check if this is connected to an HDTV card.
405 MSqlQuery query(MSqlQuery::DDCon());
406 query.prepare(
407@@ -899,6 +940,8 @@
408 {
409 MSqlQuery query(MSqlQuery::DDCon());
410
411+ myMonitor->hibernate();
412+
413 //cerr << "Adding rows to main program table from view table..\n";
414 if (!query.exec("INSERT IGNORE INTO program (chanid, starttime, endtime, "
415 "title, subtitle, description, "
416@@ -922,6 +965,8 @@
417 "WHERE dd_v_program.chanid = channel.chanid;"))
418 MythContext::DBError("Inserting into program table", query);
419
420+ myMonitor->hibernate();
421+
422 //cerr << "Finished adding rows to main program table...\n";
423 //cerr << "Adding program ratings...\n";
424
425@@ -934,6 +979,8 @@
426 "channel.chanid"))
427 MythContext::DBError("Inserting into programrating table", query);
428
429+ myMonitor->hibernate();
430+
431 if (!query.exec("INSERT IGNORE INTO programrating (chanid, starttime, "
432 "system, rating) SELECT dd_v_program.chanid, "
433 "DATE_ADD(starttime, INTERVAL channel.tmoffset MINUTE), "
434@@ -945,6 +992,8 @@
435 //cerr << "Finished adding program ratings...\n";
436 //cerr << "Populating people table from production crew list...\n";
437
438+ myMonitor->hibernate();
439+
440 if (!query.exec("INSERT IGNORE INTO people (name) SELECT fullname "
441 "FROM dd_productioncrew;"))
442 MythContext::DBError("Inserting into people table", query);
443@@ -952,6 +1001,8 @@
444 //cerr << "Finished adding people...\n";
445 //cerr << "Adding credits entries from production crew list...\n";
446
447+ myMonitor->hibernate();
448+
449 if (!query.exec("INSERT IGNORE INTO credits (chanid, starttime, person, "
450 "role) SELECT dd_v_program.chanid, "
451 "DATE_ADD(starttime, INTERVAL channel.tmoffset MINUTE), "
452@@ -966,6 +1017,8 @@
453 //cerr << "Finished inserting credits...\n";
454 //cerr << "Adding genres...\n";
455
456+ myMonitor->hibernate();
457+
458 if (!query.exec("INSERT IGNORE INTO programgenres (chanid, starttime, "
459 "relevance, genre) SELECT dd_v_program.chanid, "
460 "DATE_ADD(starttime, INTERVAL channel.tmoffset MINUTE), "
461@@ -995,6 +1048,8 @@
462 MSqlQuery query(MSqlQuery::DDCon());
463 QString status = "currently running.";
464
465+ myMonitor->hibernate();
466+
467 query.exec(QString("UPDATE settings SET data ='%1' "
468 "WHERE value='mythfilldatabaseLastRunStart'")
469 .arg(qdtNow.toString("yyyy-MM-dd hh:mm")));
470@@ -1046,6 +1101,7 @@
471 .arg(ddprocessor.GetDDProgramsStartAt().toString())
472 .arg(ddprocessor.GetDDProgramsEndAt().toString()));
473
474+ myMonitor->hibernate();
475 qdtNow = QDateTime::currentDateTime();
476 query.exec(QString("UPDATE settings SET data ='%1' "
477 "WHERE value='mythfilldatabaseLastRunEnd'")
478@@ -1064,6 +1120,8 @@
479 DataDirectProcessor::UpdateProgramViewTable(source.id);
480 //cerr << "Finished creating program view table...\n";
481
482+ myMonitor->hibernate();
483+
484 query.exec("SELECT count(*) from dd_v_program;");
485 if (query.isActive() && query.size() > 0)
486 {
487@@ -1676,6 +1734,8 @@
488 }
489 else if (e.tagName() == "programme")
490 {
491+ myMonitor->hibernate();
492+
493 ProgInfo *pginfo = parseProgram(e, localTimezoneOffset);
494
495 if (pginfo->startts == pginfo->endts)
496@@ -1761,6 +1821,8 @@
497 QValueList<ProgInfo>::iterator cur;
498 while (1)
499 {
500+ myMonitor->hibernate();
501+
502 cur = i;
503 i++;
504 // fill in miss stop times
505@@ -1947,6 +2009,8 @@
506
507 if ((*i).old_xmltvid != "")
508 {
509+ myMonitor->hibernate();
510+
511 querystr.sprintf("SELECT xmltvid FROM channel WHERE xmltvid = '%s'",
512 (*i).old_xmltvid.ascii());
513 query.exec(querystr);
514@@ -1966,6 +2030,8 @@
515 }
516 }
517
518+ myMonitor->hibernate();
519+
520 querystr.sprintf("SELECT chanid,name,callsign,channum,finetune,"
521 "icon,freqid,tvformat FROM channel WHERE "
522 "xmltvid = '%s' AND sourceid = %d;",
523@@ -1974,6 +2040,8 @@
524 query.exec(querystr);
525 if (query.isActive() && query.size() > 0)
526 {
527+ myMonitor->hibernate();
528+
529 query.next();
530
531 QString chanid = query.value(0).toString();
532@@ -2041,6 +2109,8 @@
533 subquery.bindValue(":XMLTVID", (*i).xmltvid);
534 subquery.bindValue(":SOURCEID", id);
535
536+ myMonitor->hibernate();
537+
538 if (!subquery.exec())
539 {
540 cerr << "DB Error: Channel update failed, SQL query "
541@@ -2071,6 +2141,8 @@
542 subquery.bindValue(":ICON", localfile);
543 subquery.bindValue(":CHANID", chanid);
544
545+ myMonitor->hibernate();
546+
547 if (!subquery.exec())
548 MythContext::DBError("Channel icon change", subquery);
549 }
550@@ -2217,6 +2289,8 @@
551
552 for (mapiter = proglist->begin(); mapiter != proglist->end(); ++mapiter)
553 {
554+ myMonitor->hibernate();
555+
556 MSqlQuery query(MSqlQuery::InitCon()), chanQuery(MSqlQuery::InitCon());
557
558 if (mapiter.key() == "")
559@@ -2256,6 +2330,8 @@
560 QValueList<ProgInfo>::iterator i = sortlist->begin();
561 for (; i != sortlist->end(); i++)
562 {
563+ myMonitor->hibernate();
564+
565 query.prepare("SELECT * FROM program WHERE "
566 "chanid=:CHANID AND starttime=:START AND "
567 "endtime=:END AND title=:TITLE AND "
568@@ -2306,6 +2382,8 @@
569 continue;
570 }
571
572+ myMonitor->hibernate();
573+
574 query.prepare("SELECT title,starttime,endtime FROM program "
575 "WHERE chanid=:CHANID AND starttime>=:START AND "
576 "starttime<:END;");
577@@ -2334,6 +2412,8 @@
578 << (*i).end.toString() << endl << endl;
579 }
580
581+ myMonitor->hibernate();
582+
583 MSqlQuery subquery(MSqlQuery::InitCon());
584 subquery.prepare("DELETE FROM program WHERE "
585 "chanid=:CHANID AND starttime>=:START "
586@@ -2401,6 +2481,9 @@
587 query.bindValue(":COLORCODE", (*i).colorcode);
588 query.bindValue(":SYNDICATEDEPISODENUMBER", (*i).syndicatedepisodenumber);
589 query.bindValue(":PROGRAMID", (*i).programid);
590+
591+ myMonitor->hibernate();
592+
593 if (!query.exec())
594 MythContext::DBError("program insert", query);
595
596@@ -2417,6 +2500,8 @@
597 query.bindValue(":SYS", (*j).system.utf8());
598 query.bindValue(":RATING", (*j).rating.utf8());
599
600+ myMonitor->hibernate();
601+
602 if (!query.exec())
603 MythContext::DBError("programrating insert", query);
604 }
605@@ -2424,6 +2509,8 @@
606 QValueList<ProgCredit>::iterator k = (*i).credits.begin();
607 for (; k != (*i).credits.end(); k++)
608 {
609+ myMonitor->hibernate();
610+
611 query.prepare("SELECT person FROM people WHERE "
612 "name = :NAME;");
613 query.bindValue(":NAME", (*k).name.utf8());
614@@ -2439,6 +2526,7 @@
615
616 if (personid < 0)
617 {
618+ myMonitor->hibernate();
619 query.prepare("INSERT INTO people (name) VALUES "
620 "(:NAME);");
621 query.bindValue(":NAME", (*k).name.utf8());
622@@ -2464,6 +2552,8 @@
623 continue;
624 }
625
626+ myMonitor->hibernate();
627+
628 query.prepare("INSERT INTO credits (chanid,starttime,"
629 "role,person) VALUES "
630 "(:CHANID, :START, :ROLE, :PERSON);");
631@@ -2680,6 +2770,8 @@
632 MSqlQuery query(MSqlQuery::InitCon());
633 QString status = "currently running.";
634
635+ myMonitor->hibernate();
636+
637 query.exec(QString("UPDATE settings SET data ='%1' "
638 "WHERE value='mythfilldatabaseLastRunStart'")
639 .arg(qdtNow.toString("yyyy-MM-dd hh:mm")));
640@@ -2755,6 +2847,8 @@
641 VERBOSE(VB_GENERAL, "Keeping 7 days of data.");
642 }
643
644+ myMonitor->hibernate();
645+
646 query.prepare("DELETE FROM oldprogram WHERE airdate < "
647 "DATE_SUB(CURRENT_DATE, INTERVAL 320 DAY);");
648 query.exec();
649@@ -2763,44 +2857,57 @@
650 "SELECT title,starttime FROM program "
651 "WHERE starttime < NOW() AND manualid = 0 "
652 "GROUP BY title;");
653+ myMonitor->hibernate();
654+
655 query.exec();
656
657 query.prepare("DELETE FROM program WHERE starttime <= "
658 "DATE_SUB(CURRENT_DATE, INTERVAL :OFFSET DAY);");
659 query.bindValue(":OFFSET", offset);
660+ myMonitor->hibernate();
661+
662 query.exec();
663
664 query.prepare("DELETE FROM programrating WHERE starttime <= "
665 "DATE_SUB(CURRENT_DATE, INTERVAL :OFFSET DAY);");
666 query.bindValue(":OFFSET", offset);
667+ myMonitor->hibernate();
668+
669 query.exec();
670
671 query.prepare("DELETE FROM programgenres WHERE starttime <= "
672 "DATE_SUB(CURRENT_DATE, INTERVAL :OFFSET DAY);");
673 query.bindValue(":OFFSET", offset);
674+ myMonitor->hibernate();
675+
676 query.exec();
677
678 query.prepare("DELETE FROM credits WHERE starttime <= "
679 "DATE_SUB(CURRENT_DATE, INTERVAL :OFFSET DAY);");
680 query.bindValue(":OFFSET", offset);
681+ myMonitor->hibernate();
682+
683 query.exec();
684
685 query.prepare("DELETE p FROM recordedprogram p "
686 "LEFT JOIN recorded r ON "
687 " p.chanid = r.chanid AND p.starttime = r.progstart "
688 "WHERE r.chanid IS NULL;");
689+ myMonitor->hibernate();
690 query.exec();
691
692 query.prepare("DELETE p FROM recordedrating p "
693 "LEFT JOIN recorded r ON "
694 " p.chanid = r.chanid AND p.starttime = r.progstart "
695 "WHERE r.chanid IS NULL;");
696+ myMonitor->hibernate();
697 query.exec();
698
699 query.prepare("DELETE p FROM recordedcredits p "
700 "LEFT JOIN recorded r ON "
701 " p.chanid = r.chanid AND p.starttime = r.progstart "
702 "WHERE r.chanid IS NULL;");
703+ myMonitor->hibernate();
704 query.exec();
705
706 query.prepare("DELETE FROM record WHERE (type = :SINGLE "
707@@ -2809,8 +2916,11 @@
708 query.bindValue(":SINGLE", kSingleRecord);
709 query.bindValue(":OVERRIDE", kOverrideRecord);
710 query.bindValue(":DONTRECORD", kDontRecord);
711+ myMonitor->hibernate();
712 query.exec();
713
714+ myMonitor->hibernate();
715+
716 MSqlQuery findq(MSqlQuery::InitCon());
717 findq.prepare("SELECT record.recordid FROM record "
718 "LEFT JOIN oldfind ON oldfind.recordid = record.recordid "
719@@ -2822,16 +2932,23 @@
720 {
721 while (findq.next())
722 {
723+ myMonitor->hibernate();
724+
725 query.prepare("DELETE FROM record WHERE recordid = :RECORDID;");
726 query.bindValue(":RECORDID", findq.value(0).toInt());
727 query.exec();
728 }
729 }
730+
731+ myMonitor->hibernate();
732+
733 query.prepare("DELETE FROM oldfind WHERE findid < TO_DAYS(NOW()) - 14;");
734 query.exec();
735
736 int cleanOldRecorded = gContext->GetNumSetting( "CleanOldRecorded", 10);
737
738+ myMonitor->hibernate();
739+
740 query.prepare("DELETE FROM oldrecorded WHERE "
741 "recstatus <> :RECORDED AND duplicate = 0 AND "
742 "endtime < DATE_SUB(CURRENT_DATE, INTERVAL :CLEAN DAY);");
743@@ -2856,6 +2973,8 @@
744 int externally_handled = 0;
745 int total_sources = sourcelist.size();
746
747+ myMonitor->hibernate();
748+
749 query.exec(QString("SELECT MAX(endtime) FROM program WHERE manualid=0;"));
750 if (query.isActive() && query.size() > 0)
751 {
752@@ -2951,6 +3070,8 @@
753
754 for (int i = 0; i < grabdays; i++)
755 {
756+ myMonitor->hibernate();
757+
758 // We need to check and see if the current date has changed
759 // since we started in this loop. If it has, we need to adjust
760 // the value of 'i' to compensate for this.
761@@ -3011,6 +3132,8 @@
762 "WHERE c.sourceid = %3 "
763 "GROUP BY c.chanid;";
764
765+ myMonitor->hibernate();
766+
767 if (query.exec(querystr.arg(i-1).arg(i).arg((*it).id)) &&
768 query.isActive())
769 {
770@@ -3030,6 +3153,8 @@
771 .arg(query.value(1).toInt()));
772 }
773
774+ myMonitor->hibernate();
775+
776 if (query.exec(querystr.arg(i).arg(i+1).arg((*it).id))
777 && query.isActive())
778 {
779@@ -3132,6 +3257,8 @@
780 }
781 else if (xmltv_grabber == "eitonly")
782 {
783+ myMonitor->hibernate();
784+
785 VERBOSE(VB_IMPORTANT, "Source configured to use only the "
786 "broadcasted guide data. Skipping.");
787 externally_handled++;
788@@ -3144,6 +3271,8 @@
789 xmltv_grabber == "none" ||
790 xmltv_grabber == "")
791 {
792+ myMonitor->hibernate();
793+
794 VERBOSE(VB_IMPORTANT,
795 "Source configured with no grabber. Nothing to do.");
796 externally_handled++;
797@@ -3168,6 +3297,8 @@
798 if (only_update_channels && !need_post_grab_proc)
799 return true;
800
801+ myMonitor->hibernate();
802+
803 query.exec(QString("SELECT MAX(endtime) FROM program WHERE manualid=0;"));
804 if (query.isActive() && query.size() > 0)
805 {
806@@ -3180,6 +3311,8 @@
807
808 if (failures == 0)
809 {
810+ myMonitor->hibernate();
811+
812 if ((GuideDataAfter == GuideDataBefore) &&
813 (total_sources != externally_handled))
814 status = "mythfilldatabase ran, but did not insert "
815@@ -3285,6 +3418,8 @@
816 QString chanid, starttime, endtime, querystr;
817 MSqlQuery query1(MSqlQuery::InitCon()), query2(MSqlQuery::InitCon());
818
819+ myMonitor->hibernate();
820+
821 querystr = "SELECT chanid, starttime, endtime FROM program "
822 "WHERE (DATE_FORMAT(endtime,'%H%i') = '0000') "
823 "ORDER BY chanid, starttime;";
824@@ -3302,6 +3437,8 @@
825 chanid = query1.value(0).toString();
826 endtime = query1.value(2).toString();
827
828+ myMonitor->hibernate();
829+
830 querystr = QString("SELECT chanid, starttime, endtime FROM program "
831 "WHERE (DATE_FORMAT(starttime, '%%Y-%%m-%%d') = "
832 "'%1') AND chanid = '%2' "
833@@ -3327,6 +3464,8 @@
834 .arg(endtime)
835 .arg(chanid)
836 .arg(starttime);
837+ myMonitor->hibernate();
838+
839
840 if (!query2.exec(querystr))
841 {
842@@ -3811,7 +3950,11 @@
843 gContext->LogEntry("mythfilldatabase", LP_INFO,
844 "Listings Download Started", "");
845
846-
847+ JobMonitor jobMonitor(-1);
848+
849+ myMonitor= &jobMonitor;
850+ myMonitor->hibernate();
851+
852 if (!grab_data)
853 {
854 }
855@@ -3821,6 +3964,8 @@
856 }
857 else if (from_file)
858 {
859+ myMonitor->hibernate();
860+
861 QString status = "currently running.";
862 QDateTime GuideDataBefore, GuideDataAfter;
863
864@@ -3829,10 +3974,14 @@
865 "WHERE value='mythfilldatabaseLastRunStart'")
866 .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm")));
867
868+ myMonitor->hibernate();
869+
870 query.exec(QString("UPDATE settings SET data ='%1' "
871 "WHERE value='mythfilldatabaseLastRunStatus'")
872 .arg(status));
873
874+ myMonitor->hibernate();
875+
876 query.exec(QString("SELECT MAX(endtime) FROM program;"));
877 if (query.isActive() && query.size() > 0)
878 {
879@@ -3846,12 +3995,18 @@
880 if (!grabDataFromFile(fromfile_id, fromfile_name))
881 return FILLDB_EXIT_GRAB_DATA_FAILED;
882
883+ myMonitor->hibernate();
884+
885 clearOldDBEntries();
886
887+ myMonitor->hibernate();
888+
889 query.exec(QString("UPDATE settings SET data ='%1' "
890 "WHERE value='mythfilldatabaseLastRunEnd'")
891 .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm")));
892
893+ myMonitor->hibernate();
894+
895 query.exec(QString("SELECT MAX(endtime) FROM program;"));
896 if (query.isActive() && query.size() > 0)
897 {
898@@ -3869,6 +4024,8 @@
899 else
900 status = "Successful.";
901
902+ myMonitor->hibernate();
903+
904 query.exec(QString("UPDATE settings SET data ='%1' "
905 "WHERE value='mythfilldatabaseLastRunStatus'")
906 .arg(status));
907@@ -3894,6 +4051,8 @@
908 where = QString("WHERE sourceid = %1").arg(sourceid);
909 }
910
911+ myMonitor->hibernate();
912+
913 QString querystr = QString("SELECT sourceid,name,xmltvgrabber,userid,"
914 "password,lineupid "
915 "FROM videosource ") + where +
916@@ -3955,24 +4114,34 @@
917 return FILLDB_EXIT_OK;
918 }
919
920+ myMonitor->hibernate();
921+
922 if (reset_iconmap)
923 {
924 ResetIconMap(reset_iconmap_icons);
925 }
926
927+ myMonitor->hibernate();
928+
929 if (import_iconmap)
930 {
931 ImportIconMap(import_icon_map_filename);
932 }
933
934+ myMonitor->hibernate();
935+
936 if (export_iconmap)
937 {
938 ExportIconMap(export_icon_map_filename);
939 }
940
941+ myMonitor->hibernate();
942+
943 if (update_icon_map)
944 {
945 MSqlQuery query(MSqlQuery::InitCon());
946+ myMonitor->hibernate();
947+
948 query.exec("SELECT sourceid FROM videosource ORDER BY sourceid;");
949 if (query.isActive() && query.size() > 0)
950 {
951@@ -3983,6 +4152,8 @@
952 }
953 }
954
955+ myMonitor->hibernate();
956+
957 if (grab_data)
958 {
959 VERBOSE(VB_GENERAL, "Adjusting program database end times.");
960@@ -3997,6 +4168,8 @@
961 "Listings Download Finished", "");
962 }
963
964+ myMonitor->hibernate();
965+
966 if (grab_data)
967 {
968 VERBOSE(VB_GENERAL, "Marking generic episodes.");
969@@ -4011,6 +4184,8 @@
970 QString(" Found %1").arg(query.numRowsAffected()));
971 }
972
973+ myMonitor->hibernate();
974+
975 if (mark_repeats)
976 {
977 VERBOSE(VB_GENERAL, "Marking repeats.");
978@@ -4042,11 +4217,15 @@
979
980 if (grab_data)
981 {
982+ myMonitor->hibernate();
983+
984 MSqlQuery updt(MSqlQuery::InitCon());
985 updt.exec("UPDATE program SET first = 0, last = 0;");
986
987 VERBOSE(VB_GENERAL, "Marking episode first showings.");
988
989+ myMonitor->hibernate();
990+
991 MSqlQuery query(MSqlQuery::InitCon());
992 query.exec("SELECT MIN(starttime),programid FROM program "
993 "WHERE programid > '' GROUP BY programid;");
994@@ -4055,6 +4234,8 @@
995 {
996 while(query.next())
997 {
998+ myMonitor->hibernate();
999+
1000 updt.prepare("UPDATE program set first = 1 "
1001 "WHERE starttime = :STARTTIME "
1002 " AND programid = :PROGRAMID;");
1003@@ -4065,6 +4246,8 @@
1004 }
1005 int found = query.numRowsAffected();
1006
1007+ myMonitor->hibernate();
1008+
1009 query.exec("SELECT MIN(starttime),title,subtitle,description "
1010 "FROM program WHERE programid = '' "
1011 "GROUP BY title,subtitle,description;");
1012@@ -4082,7 +4265,9 @@
1013 updt.bindValue(":TITLE", query.value(1).toString());
1014 updt.bindValue(":SUBTITLE", query.value(2).toString());
1015 updt.bindValue(":DESCRIPTION", query.value(3).toString());
1016- updt.exec();
1017+ myMonitor->hibernate();
1018+
1019+ updt.exec();
1020 }
1021 }
1022 found += query.numRowsAffected();
1023@@ -4090,6 +4275,8 @@
1024
1025 VERBOSE(VB_GENERAL, "Marking episode last showings.");
1026
1027+ myMonitor->hibernate();
1028+
1029 query.exec("SELECT MAX(starttime),programid FROM program "
1030 "WHERE programid > '' GROUP BY programid;");
1031
1032@@ -4102,11 +4289,14 @@
1033 " AND programid = :PROGRAMID;");
1034 updt.bindValue(":STARTTIME", query.value(0).toDateTime());
1035 updt.bindValue(":PROGRAMID", query.value(1).toString());
1036+ myMonitor->hibernate();
1037 updt.exec();
1038 }
1039 }
1040 found = query.numRowsAffected();
1041
1042+ myMonitor->hibernate();
1043+
1044 query.exec("SELECT MAX(starttime),title,subtitle,description "
1045 "FROM program WHERE programid = '' "
1046 "GROUP BY title,subtitle,description;");
1047@@ -4124,6 +4314,8 @@
1048 updt.bindValue(":TITLE", query.value(1).toString());
1049 updt.bindValue(":SUBTITLE", query.value(2).toString());
1050 updt.bindValue(":DESCRIPTION", query.value(3).toString());
1051+
1052+ myMonitor->hibernate();
1053 updt.exec();
1054 }
1055 }
1056@@ -4131,6 +4323,8 @@
1057 VERBOSE(VB_GENERAL, QString(" Found %1").arg(found));
1058 }
1059
1060+ myMonitor->hibernate();
1061+
1062 if (1) // limit MSqlQuery's lifetime
1063 {
1064 MSqlQuery query(MSqlQuery::InitCon());
1065--- ./libs/libmythtv/jobqueue.cpp.hibernate 2006-07-30 15:53:33.000000000 -0400
1066+++ ./libs/libmythtv/jobqueue.cpp 2006-09-25 22:19:00.000000000 -0400
1067@@ -26,6 +26,10 @@
1068 #define LOC QString("JobQueue: ")
1069 #define LOC_ERR QString("JobQueue Error: ")
1070
1071+#include <stdio.h>
1072+#include <string.h>
1073+#include <stdlib.h>
1074+
1075 JobQueue::JobQueue(bool master)
1076 {
1077 isMaster = master;
1078@@ -2168,4 +2172,122 @@
1079 return JOB_NONE;
1080 }
1081
1082+long JobMonitor::bogomips=0;
1083+
1084+/*
1085+** Add up all bogomips in /proc/cpuinfo
1086+*/
1087+
1088+long JobMonitor::getEstimatedBogoMips()
1089+{
1090+ if (bogomips)
1091+ return bogomips;
1092+
1093+ FILE *fp=fopen("/proc/cpuinfo", "r");
1094+ char linebuf[256];
1095+
1096+ while (fp && fgets(linebuf, sizeof(linebuf), fp))
1097+ {
1098+ char *p=strtok(linebuf, " \t:");
1099+
1100+ if (!p)
1101+ continue;
1102+
1103+ if (strcmp(p, "bogomips") == 0)
1104+ {
1105+ p=strtok(NULL, " \t:");
1106+
1107+ if (p)
1108+ bogomips += atol(p);
1109+ }
1110+ }
1111+ if (fp) fclose(fp);
1112+
1113+ return bogomips;
1114+}
1115+
1116+
1117+
1118+JobMonitor::JobMonitor(int jobIDArg)
1119+ : jobID(jobIDArg), jobLastChk(time(NULL)), counter(1),
1120+ doMonitor(gContext->GetNumSetting("JobHibernate", -1))
1121+{
1122+ if (doMonitor < 0)
1123+ doMonitor= getEstimatedBogoMips() < 3000;
1124+}
1125+
1126+JobMonitor::~JobMonitor()
1127+{
1128+}
1129+
1130+int JobMonitor::GetJobCmd()
1131+{
1132+ int jobCmd;
1133+
1134+ while ((jobCmd=JobQueue::GetJobCmd(jobID)) == JOB_RUN)
1135+ {
1136+ if (!doHibernateCheck())
1137+ break;
1138+ }
1139+
1140+ return jobCmd;
1141+}
1142+
1143+void JobMonitor::hibernate()
1144+{
1145+ while (doHibernateCheck())
1146+ ;
1147+}
1148+
1149+bool JobMonitor::doHibernateCheck()
1150+{
1151+ if (!doMonitor)
1152+ return false;
1153+
1154+ time_t t=time(NULL);
1155+
1156+ if (t == jobLastChk)
1157+ return false;
1158+
1159+ if (t < jobLastChk)
1160+ counter=0; // Time went backwards?
1161+ else if (t - jobLastChk > counter)
1162+ counter=0;
1163+ else
1164+ counter -= t - jobLastChk;
1165+
1166+ jobLastChk=t;
1167+
1168+ if (counter)
1169+ return false;
1170+
1171+ counter=5;
1172+
1173+ bool isActive=false;
1174+
1175+ MSqlQuery query(MSqlQuery::InitCon());
1176+ query.prepare("SELECT recusage FROM inuseprograms");
1177+ if (query.exec() && query.isActive() && query.size() > 0)
1178+ while (query.next())
1179+ {
1180+ QString usage=
1181+ query.value(0).toString().lower();
1182+
1183+ if (usage == "player" ||
1184+ usage == "recorder" ||
1185+ usage.left(7) == "preview")
1186+ isActive=true;
1187+ }
1188+
1189+ if (!isActive)
1190+ return false;
1191+ counter=1;
1192+ if (jobID >= 0 &&
1193+ !JobQueue::ChangeJobComment(jobID,
1194+ "waiting for record/playback to stop"))
1195+ return false;
1196+ sleep(5);
1197+ return true;
1198+}
1199+
1200 /* vim: set expandtab tabstop=4 shiftwidth=4: */
1201--- ./libs/libmythtv/datadirect.cpp.hibernate 2006-08-08 14:14:52.000000000 -0400
1202+++ ./libs/libmythtv/datadirect.cpp 2006-09-25 22:47:21.000000000 -0400
1203@@ -44,7 +44,8 @@
1204 static void update_channel_basic(uint sourceid, bool insert,
1205 QString xmltvid, QString callsign,
1206 QString name, uint freqid,
1207- QString chan_major, QString chan_minor);
1208+ QString chan_major, QString chan_minor,
1209+ JobMonitor &monitor);
1210
1211 DataDirectStation::DataDirectStation(void) :
1212 stationid(""), callsign(""),
1213@@ -224,6 +225,7 @@
1214 query.bindValue(":AFFILIATE", curr_station.affiliate);
1215 query.bindValue(":FCCCHANNUM", curr_station.fccchannelnumber);
1216
1217+ parent.monitor.hibernate();
1218 if (!query.exec())
1219 MythContext::DBError("Inserting into dd_station", query);
1220 }
1221@@ -245,6 +247,7 @@
1222 query.bindValue(":DEVICE", curr_lineup.device);
1223 query.bindValue(":POSTAL", curr_lineup.postal);
1224
1225+ parent.monitor.hibernate();
1226 if (!query.exec())
1227 MythContext::DBError("Inserting into dd_lineup", query);
1228 }
1229@@ -262,11 +265,13 @@
1230 query.bindValue(":STATIONID", curr_lineupmap.stationid);
1231 query.bindValue(":CHANNEL", curr_lineupmap.channel);
1232 query.bindValue(":CHANNELMINOR",curr_lineupmap.channelMinor);
1233+ parent.monitor.hibernate();
1234 if (!query.exec())
1235 MythContext::DBError("Inserting into dd_lineupmap", query);
1236 }
1237 else if (pqname == "schedule")
1238 {
1239+ parent.monitor.hibernate();
1240 QDateTime endtime = curr_schedule.time.addSecs(
1241 QTime().secsTo(curr_schedule.duration));
1242
1243@@ -354,6 +359,7 @@
1244 query.bindValue(":SYNDNUM", curr_program.syndicatedEpisodeNumber);
1245 query.bindValue(":ORIGAIRDATE", curr_program.originalAirDate);
1246
1247+ parent.monitor.hibernate();
1248 if (!query.exec())
1249 MythContext::DBError("Inserting into dd_program", query);
1250 }
1251@@ -377,6 +383,7 @@
1252 query.bindValue(":SURNAME", curr_productioncrew.surname.utf8());
1253 query.bindValue(":FULLNAME", fullname.utf8());
1254
1255+ parent.monitor.hibernate();
1256 if (!query.exec())
1257 MythContext::DBError("Inserting into dd_productioncrew", query);
1258
1259@@ -394,6 +401,7 @@
1260 query.bindValue(":CLASS", curr_genre.gclass.utf8());
1261 query.bindValue(":RELEVANCE", curr_genre.relevance);
1262
1263+ parent.monitor.hibernate();
1264 if (!query.exec())
1265 MythContext::DBError("Inserting into dd_genre", query);
1266 }
1267@@ -450,6 +458,7 @@
1268
1269 query.prepare(querystr);
1270
1271+ parent.monitor.hibernate();
1272 if (!query.exec())
1273 {
1274 MythContext::DBError("Updating DataDirect Status Message",
1275@@ -535,7 +544,8 @@
1276 userid(user), password(pass),
1277 inputfilename(""), tmpPostFile(""),
1278 tmpResultFile(""), cookieFile(""),
1279- cookieFileDT()
1280+ cookieFileDT(),
1281+ monitor(-1)
1282 {
1283 DataDirectURLs urls0(
1284 "Tribune Media Zap2It",
1285@@ -560,7 +570,8 @@
1286 void DataDirectProcessor::UpdateStationViewTable(QString lineupid)
1287 {
1288 MSqlQuery query(MSqlQuery::DDCon());
1289-
1290+
1291+ monitor.hibernate();
1292 if (!query.exec("TRUNCATE TABLE dd_v_station;"))
1293 MythContext::DBError("Truncating temporary table dd_v_station", query);
1294
1295@@ -578,6 +589,7 @@
1296
1297 query.bindValue(":LINEUP", lineupid);
1298
1299+ monitor.hibernate();
1300 if (!query.exec())
1301 MythContext::DBError("Populating temporary table dd_v_station", query);
1302 }
1303@@ -586,6 +598,7 @@
1304 {
1305 MSqlQuery query(MSqlQuery::DDCon());
1306
1307+ monitor.hibernate();
1308 if (!query.exec("TRUNCATE TABLE dd_v_program;"))
1309 MythContext::DBError("Truncating temporary table dd_v_program", query);
1310
1311@@ -617,9 +630,13 @@
1312 if (!query.exec())
1313 MythContext::DBError("Populating temporary table dd_v_program", query);
1314
1315+ monitor.hibernate();
1316+
1317 if (!query.exec("ANALYZE TABLE dd_v_program;"))
1318 MythContext::DBError("Analyzing table dd_v_program", query);
1319
1320+ monitor.hibernate();
1321+
1322 if (!query.exec("ANALYZE TABLE dd_productioncrew;"))
1323 MythContext::DBError("Analyzing table dd_productioncrew", query);
1324 }
1325@@ -643,6 +660,7 @@
1326 "WHERE channel.chanid IS NULL");
1327 query.bindValue(":SOURCEID", sourceid);
1328
1329+ monitor.hibernate();
1330 if (!query.exec())
1331 {
1332 MythContext::DBError("Selecting new channels", query);
1333@@ -660,7 +678,7 @@
1334
1335 update_channel_basic(sourceid, insert_channels,
1336 xmltvid, callsign, name, freqid,
1337- chan_major, chan_minor);
1338+ chan_major, chan_minor, monitor);
1339
1340 if (!insert_channels)
1341 {
1342@@ -675,6 +693,7 @@
1343
1344 bool DataDirectProcessor::UpdateChannelsUnsafe(uint sourceid)
1345 {
1346+ monitor.hibernate();
1347 MSqlQuery dd_station_info(MSqlQuery::DDCon());
1348 dd_station_info.prepare(
1349 "SELECT callsign, stationname, stationid,"
1350@@ -713,6 +732,7 @@
1351 chan_update_q.bindValue(":MAJORCHAN", chan_major.toUInt());
1352 chan_update_q.bindValue(":MINORCHAN", chan_minor.toUInt());
1353
1354+ monitor.hibernate();
1355 if (!chan_update_q.exec())
1356 {
1357 MythContext::DBError("Updating channel table",
1358@@ -903,14 +923,17 @@
1359 QString querystr =
1360 QString("UPDATE settings SET data = '%1' WHERE value = '%2';");
1361
1362+ monitor.hibernate();
1363 query.prepare(querystr.arg(minhr).arg("MythFillMinHour"));
1364 if (!query.exec())
1365 MythContext::DBError("Updating DataDirect MythFillMinHour", query);
1366
1367+ monitor.hibernate();
1368 query.prepare(querystr.arg(maxhr).arg("MythFillMaxHour"));
1369 if (!query.exec())
1370 MythContext::DBError("Updating DataDirect MythFillMaxHour", query);
1371
1372+ monitor.hibernate();
1373 query.prepare(querystr.arg(NextSuggestedTime.toString(Qt::ISODate))
1374 .arg("MythFillSuggestedRunTime"));
1375
1376@@ -978,6 +1001,8 @@
1377 void DataDirectProcessor::CreateATempTable(const QString &ptablename,
1378 const QString &ptablestruct)
1379 {
1380+ monitor.hibernate();
1381+
1382 MSqlQuery query(MSqlQuery::DDCon());
1383 QString querystr;
1384 querystr = "CREATE TEMPORARY TABLE IF NOT EXISTS " + ptablename + " " +
1385@@ -988,6 +1013,7 @@
1386
1387 querystr = "TRUNCATE TABLE " + ptablename + ";";
1388
1389+ monitor.hibernate();
1390 if (!query.exec(querystr))
1391 MythContext::DBError("Truncating temporary table", query);
1392 }
1393@@ -1404,6 +1430,7 @@
1394 "WHERE sourceid = :SOURCEID");
1395 query.bindValue(":SOURCEID", sourceid);
1396
1397+ monitor.hibernate();
1398 if (!query.exec() || !query.isActive())
1399 {
1400 MythContext::DBError("Selecting existing channels", query);
1401@@ -1798,7 +1825,8 @@
1402 static void update_channel_basic(uint sourceid, bool insert,
1403 QString xmltvid, QString callsign,
1404 QString name, uint freqid,
1405- QString chan_major, QString chan_minor)
1406+ QString chan_major, QString chan_minor,
1407+ JobMonitor &monitor)
1408 {
1409 callsign = (callsign.isEmpty()) ? name : callsign;
1410
1411@@ -1807,6 +1835,7 @@
1412 sourceid, chan_major, chan_minor, tvformat, freqid);
1413
1414 // First check if channel already in DB, but without xmltvid
1415+ monitor.hibernate();
1416 MSqlQuery query(MSqlQuery::DDCon());
1417 query.prepare("SELECT chanid FROM channel "
1418 "WHERE sourceid = :SOURCEID AND xmltvid = 0 AND "
1419@@ -1835,6 +1864,7 @@
1420 "SET xmltvid = :XMLTVID "
1421 "WHERE chanid = :CHANID AND sourceid = :SOURCEID");
1422
1423+ monitor.hibernate();
1424 while (query.next())
1425 {
1426 uint chanid = query.value(0).toInt();
1427@@ -1860,12 +1890,15 @@
1428 get_atsc_stuff(channum, sourceid, freqid,
1429 majorC, minorC, freq);
1430
1431+ monitor.hibernate();
1432 if (minorC > 0 && freq >= 0)
1433 mplexid = ChannelUtil::CreateMultiplex(sourceid, "atsc", freq, "8vsb");
1434
1435+ monitor.hibernate();
1436 if ((mplexid > 0) || (minorC == 0))
1437 chanid = ChannelUtil::CreateChanID(sourceid, channum);
1438
1439+ monitor.hibernate();
1440 if (chanid > 0)
1441 {
1442 QString icon = "";
1443--- ./libs/libmythtv/jobqueue.h.hibernate 2006-07-15 16:13:46.000000000 -0400
1444+++ ./libs/libmythtv/jobqueue.h 2006-09-25 22:19:00.000000000 -0400
1445@@ -219,6 +219,30 @@
1446 QMutex queueThreadCondLock;
1447 };
1448
1449+#include <time.h>
1450+
1451+class JobMonitor {
1452+ int jobID;
1453+ time_t jobLastChk;
1454+ int counter;
1455+
1456+ int doMonitor;
1457+
1458+ static long bogomips;
1459+
1460+ public:
1461+ JobMonitor(int jobID);
1462+ ~JobMonitor();
1463+
1464+ int GetJobCmd();
1465+ void hibernate();
1466+
1467+ static long getEstimatedBogoMips();
1468+
1469+ private:
1470+ bool doHibernateCheck();
1471+};
1472+
1473 #endif
1474
1475 /* vim: set expandtab tabstop=4 shiftwidth=4: */
1476--- libs/libmythtv/datadirect.h.hibernate 2006-07-15 14:26:08.000000000 -0400
1477+++ libs/libmythtv/datadirect.h 2006-09-29 22:01:04.000000000 -0400
1478@@ -7,6 +7,9 @@
1479 #include <qmap.h>
1480
1481 #include <vector>
1482+
1483+#include "jobqueue.h"
1484+
1485 using namespace std;
1486
1487 enum DD_PROVIDERS
1488@@ -308,12 +311,12 @@
1489 void SetInputFile(const QString &file) { inputfilename = file; }
1490
1491 // static commands (these update temp DB tables)
1492- static void UpdateStationViewTable(QString lineupid);
1493- static void UpdateProgramViewTable(uint sourceid);
1494+ void UpdateStationViewTable(QString lineupid);
1495+ void UpdateProgramViewTable(uint sourceid);
1496
1497 // static commands (these update regular DB tables from temp DB tables)
1498- static int UpdateChannelsSafe(uint sourceid, bool insert_channels);
1499- static bool UpdateChannelsUnsafe(uint sourceid);
1500+ int UpdateChannelsSafe(uint sourceid, bool insert_channels);
1501+ bool UpdateChannelsUnsafe(uint sourceid);
1502
1503 private:
1504 void CreateTempTables(void);
1505@@ -358,6 +361,9 @@
1506 QString tmpResultFile;
1507 QString cookieFile;
1508 QDateTime cookieFileDT;
1509+
1510+ public:
1511+ JobMonitor monitor;
1512 };
1513
1514 #endif