mirror of https://github.com/BOINC/boinc.git
Add more event handling code
git-svn-id: svn+ssh://cvs.lpds.sztaki.hu/var/lib/svn/szdg/dcapi/trunk@380 a7169a2c-3604-0410-bc95-c702d8d87f7a
This commit is contained in:
parent
4466efc025
commit
aac4e70e34
|
@ -2,50 +2,50 @@
|
|||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <cstring>
|
||||
#include <cstdlib>
|
||||
#include <cstdio>
|
||||
#include <unistd.h>
|
||||
#include <ctime>
|
||||
#include <vector>
|
||||
#include <strings.h>
|
||||
|
||||
#include "dc_boinc.h"
|
||||
|
||||
#include <boinc_db.h>
|
||||
#include <parse.h>
|
||||
#include <util.h>
|
||||
#include <sched_util.h>
|
||||
#include <sched_msgs.h>
|
||||
|
||||
int DC_processEvents(int timeout)
|
||||
{
|
||||
DC_Result *result;
|
||||
char *wu_query;
|
||||
DB_WORKUNIT wu;
|
||||
int ret = 0;
|
||||
char *query;
|
||||
|
||||
if (!_dc_resultcb || !_dc_subresultcb || !_dc_messagecb)
|
||||
{
|
||||
DC_log(LOG_ERR, "DC_processEvents: callbacks are not set up");
|
||||
return DC_ERR_CONFIG;
|
||||
}
|
||||
|
||||
/* XXX Check LIMIT value */
|
||||
wu_query = g_strdup_printf("WHERE name LIKE '%s_%%' "
|
||||
query = g_strdup_printf("WHERE name LIKE '%s_%%' "
|
||||
"AND assimilate_state = %d LIMIT 100", project_uuid_str,
|
||||
ASSIMILATE_READY);
|
||||
while (!wu.enumerate(wu_query))
|
||||
while (!wu.enumerate(query))
|
||||
{
|
||||
DB_RESULT canonical_result;
|
||||
char *result_query;
|
||||
|
||||
/* We are only interested in the canonical result */
|
||||
if (!wu.canonical_resultid)
|
||||
{
|
||||
DC_log(LOG_DEBUG, "No canonical result for work unit %d",
|
||||
wu.id);
|
||||
/* This should never happen */
|
||||
DC_log(LOG_ERR, "No canonical result for work "
|
||||
"unit %d - bug in validator?", wu.id);
|
||||
continue;
|
||||
}
|
||||
|
||||
result_query = g_strdup_printf("WHERE id = %d",
|
||||
wu.canonical_resultid);
|
||||
canonical_result.lookup(result_query);
|
||||
g_free(result_query);
|
||||
if (canonical_result.lookup_id(wu.canonical_resultid))
|
||||
{
|
||||
DC_log(LOG_ERR, "Result #%d is not in the database",
|
||||
wu.canonical_resultid);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Call the callback function */
|
||||
result = _DC_createResult(wu.name, canonical_result.xml_doc_in);
|
||||
|
@ -60,6 +60,100 @@ int DC_processEvents(int timeout)
|
|||
wu.update();
|
||||
}
|
||||
|
||||
g_free(wu_query);
|
||||
return ret;
|
||||
g_free(query);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Look for a single result that matches the filter */
|
||||
static DC_Event *look_for_results(const char *wuFilter, const char *wuName,
|
||||
int timeout)
|
||||
{
|
||||
DB_RESULT result;
|
||||
DC_Event *event;
|
||||
DB_WORKUNIT wu;
|
||||
char *query;
|
||||
|
||||
if (wuFilter)
|
||||
query = g_strdup_printf("WHERE name LIKE '%s_%%_%s' "
|
||||
"AND assimilate_state = %d LIMIT 1", project_uuid_str,
|
||||
wuFilter, ASSIMILATE_READY);
|
||||
else if (wuName)
|
||||
query = g_strdup_printf("WHERE name LIKE '%s_%s%%' "
|
||||
"AND assimilate_state = %d LIMIT 1", project_uuid_str,
|
||||
wuName, ASSIMILATE_READY);
|
||||
else
|
||||
query = g_strdup_printf("WHERE name LIKE '%s_%%' "
|
||||
"AND assimilate_state = %d LIMIT 1", project_uuid_str,
|
||||
ASSIMILATE_READY);
|
||||
|
||||
if (wu.enumerate(query))
|
||||
{
|
||||
g_free(query);
|
||||
return NULL;
|
||||
}
|
||||
g_free(query);
|
||||
|
||||
if (result.lookup_id(wu.canonical_resultid))
|
||||
{
|
||||
DC_log(LOG_ERR, "Result #%d is not in the database",
|
||||
wu.canonical_resultid);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
event = g_new(DC_Event, 1);
|
||||
event->type = DC_EVENT_RESULT;
|
||||
event->result = _DC_createResult(wu.name, result.xml_doc_in);
|
||||
if (!event->result)
|
||||
{
|
||||
g_free(event);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return event;
|
||||
}
|
||||
|
||||
DC_Event *DC_waitEvent(const char *wuFilter, int timeout)
|
||||
{
|
||||
DC_Event *event;
|
||||
|
||||
event = look_for_results(wuFilter, NULL, timeout);
|
||||
/*
|
||||
if (!event)
|
||||
event = look_for_notifications(...)
|
||||
*/
|
||||
return event;
|
||||
}
|
||||
|
||||
DC_Event *DC_waitWUEvent(DC_Workunit *wu, int timeout)
|
||||
{
|
||||
DC_Event *event;
|
||||
|
||||
event = look_for_results(NULL, wu->name, timeout);
|
||||
/*
|
||||
if (!event)
|
||||
event = look_for_notifications(...)
|
||||
*/
|
||||
return event;
|
||||
}
|
||||
|
||||
void DC_DestroyEvent(DC_Event *event)
|
||||
{
|
||||
if (!event)
|
||||
return;
|
||||
|
||||
switch (event->type)
|
||||
{
|
||||
case DC_EVENT_RESULT:
|
||||
_DC_destroyResult(event->result);
|
||||
break;
|
||||
case DC_EVENT_SUBRESULT:
|
||||
_DC_destroyPhysicalFile(event->subresult);
|
||||
break;
|
||||
case DC_EVENT_MESSAGE:
|
||||
g_free(event->message);
|
||||
break;
|
||||
default:
|
||||
DC_log(LOG_ERR, "Unknown event type %d", event->type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue