2002-07-30 18:06:39 +00:00
|
|
|
<title>The BOINC Application Program Interface (API)</title>
|
|
|
|
<h2>The BOINC Application Programming Interface (API)</h2>
|
|
|
|
|
2002-07-31 05:59:43 +00:00
|
|
|
The BOINC API is a set of C++ functions.
|
|
|
|
Unless otherwise specified,
|
|
|
|
the functions return an integer error code; zero indicates success.
|
|
|
|
The graphics API is described <a href=graphics.html>separately</a>.
|
2002-07-30 18:06:39 +00:00
|
|
|
|
|
|
|
<h3>Initialization and termination</h3>
|
2002-07-31 05:59:43 +00:00
|
|
|
The application must call
|
2002-07-30 18:06:39 +00:00
|
|
|
<pre>
|
2002-07-31 05:59:43 +00:00
|
|
|
int boinc_init(bool is_main_program, char** init_data_xml)
|
2002-07-30 18:06:39 +00:00
|
|
|
</pre>
|
|
|
|
before calling other BOINC functions or doing I/O.
|
|
|
|
<tt>is_main_program</tt> indicates whether the program
|
|
|
|
is the application's main program (normally true - see below).
|
2002-07-31 05:59:43 +00:00
|
|
|
Various information is returned in the malloced <tt>init_data_xml</tt>,
|
|
|
|
an XML string that may contain the following elements:
|
|
|
|
<pre>
|
|
|
|
<init_data>
|
|
|
|
<app_preferences>...</app_preferences>
|
|
|
|
<user_name>...</user_name>
|
|
|
|
<team_name>...</team_name>
|
|
|
|
<wu_cpu_time>...</wu_cpu_time>
|
|
|
|
<total_cobblestones>...</total_cobblestones>
|
|
|
|
<recent_avg_cobblestones>...</recent_avg_cobblestones>
|
|
|
|
</init_data>
|
|
|
|
</pre>
|
|
|
|
<ul>
|
|
|
|
<li><b>app_preferences</b>: arbitrary text (generally XML);
|
|
|
|
the participant's preferences for this project.
|
|
|
|
<li><b>user_name</b>: the user's account name for this project
|
|
|
|
<li><b>team_name</b>: the user's team name, if any, for this project
|
|
|
|
<li><b>wu_cpu_time</b>: the CPU time used so far for this work unit
|
|
|
|
<li><b>total_cobblestones</b>: the user's total credit
|
|
|
|
<li><b>recent_avg_cobblestones</b>: the user's recent average credit
|
|
|
|
</ul>
|
|
|
|
<p>
|
|
|
|
These items might be used by the application in its graphics.
|
|
|
|
They can be parsed using the functions in lib/parse.C.
|
|
|
|
<p>
|
2002-07-30 18:06:39 +00:00
|
|
|
When the application has completed successfully it must call
|
|
|
|
<pre>
|
|
|
|
int boinc_finish();
|
|
|
|
</pre>
|
|
|
|
before exiting.
|
|
|
|
An application that encounters a fatal error must call
|
|
|
|
<pre>
|
|
|
|
void exit(int error);
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
<h3>Resolving file names</h3>
|
|
|
|
Applications that use named input or output files must call
|
|
|
|
<pre>
|
2002-07-31 05:59:43 +00:00
|
|
|
int boinc_resolve_filename(char *logical_name, char *physical_name);</tt>
|
2002-07-30 18:06:39 +00:00
|
|
|
</pre>
|
|
|
|
to convert logical file names to physical names.
|
|
|
|
For example, instead of
|
|
|
|
<pre>
|
|
|
|
f = fopen("my_file", "r");
|
|
|
|
</pre>
|
2002-07-29 19:01:38 +00:00
|
|
|
</p>
|
2002-07-30 18:06:39 +00:00
|
|
|
the application might use
|
|
|
|
<p>
|
|
|
|
<pre>
|
|
|
|
char resolved_name[256];
|
2002-07-31 05:59:43 +00:00
|
|
|
retval = boinc_resolve_filename("my_file", resolved_name);
|
2002-07-30 18:06:39 +00:00
|
|
|
if (retval) fail("can't resolve filename");
|
|
|
|
f = fopen(resolved_name, "r");
|
|
|
|
</pre>
|
2002-07-31 05:59:43 +00:00
|
|
|
<tt>boinc_resolve_filename()</tt> doesn't need to be used for temporary files.
|
2002-07-30 18:06:39 +00:00
|
|
|
|
|
|
|
<h3>Checkpointing</h3>
|
|
|
|
|
|
|
|
Computations that use a significant amount of time
|
|
|
|
per work unit may want to periodically write the current
|
|
|
|
state of the computation to disk.
|
|
|
|
This is known as <b>checkpointing</b>.
|
|
|
|
The state file must include everything required
|
|
|
|
to start the computation again at the same place it was checkpointed.
|
|
|
|
On startup, the application
|
|
|
|
reads the state file to determine where to begin computation.
|
|
|
|
If the BOINC client quits or exits,
|
|
|
|
the computation can be restarted from the most recent checkpoint.
|
|
|
|
|
|
|
|
<p>
|
|
|
|
Do use checkpoint, an application should write to output and
|
|
|
|
state files using the <tt>MFILE</tt> class.
|
|
|
|
<pre>
|
|
|
|
class MFILE {
|
|
|
|
public:
|
|
|
|
int open(char* path, char* mode);
|
|
|
|
int _putchar(char);
|
|
|
|
int puts(char*);
|
|
|
|
int printf(char* format, ...);
|
|
|
|
size_t write(const void* buf, size_t count);
|
|
|
|
int close();
|
|
|
|
int flush();
|
|
|
|
};
|
|
|
|
</pre>
|
|
|
|
MFILE buffers data in memory
|
|
|
|
and writes to disk only on <tt>flush()</tt> or <tt>close()</tt>.
|
|
|
|
This lets you write output files and state files
|
|
|
|
more or less atomically.
|
|
|
|
Frequency of checkpointing is a user preference
|
|
|
|
(e.g. laptop users might want to checkpoint infrequently).
|
|
|
|
An application must call
|
|
|
|
<pre>
|
2002-07-31 05:59:43 +00:00
|
|
|
bool boinc_time_to_checkpoint();
|
2002-07-30 18:06:39 +00:00
|
|
|
</pre>
|
|
|
|
whenever it reaches a point where it is able to checkpoint.
|
|
|
|
If this returns true,
|
|
|
|
the application should write the state file and flush all output files,
|
|
|
|
then call
|
|
|
|
<pre>
|
2002-07-31 05:59:43 +00:00
|
|
|
void boinc_checkpoint_completed();
|
2002-07-30 18:06:39 +00:00
|
|
|
</pre>
|
|
|
|
|
|
|
|
<h3>Fraction done</h3>
|
|
|
|
The core client GUI displays the percent done of workunits in progress.
|
|
|
|
To keep this display current, an application should
|
|
|
|
periodically call
|
|
|
|
<pre>
|
|
|
|
boinc_percent_done(double fraction_done);
|
|
|
|
</pre>
|
|
|
|
The <tt>fraction_done</tt> argument is a rough estimate of the
|
2002-07-31 05:59:43 +00:00
|
|
|
workunit fraction complete (0 to 1).
|
2002-07-30 18:06:39 +00:00
|
|
|
|
|
|
|
<h3>Multi-program applications</h3>
|
|
|
|
Some applications consist of multiple programs:
|
|
|
|
a <b>main program</b> that acts as coordinator,
|
|
|
|
and one or more subsidiary programs.
|
|
|
|
Each program should use the BOINC API as described above,
|
|
|
|
using the appropriate argument to <tt>boinc_init()</tt>.
|
|
|
|
<p>
|
|
|
|
For checkpointing, each program has its own state file;
|
|
|
|
the state file of the coordinator program records
|
|
|
|
which subsidiary program was last active.
|
|
|
|
<p>
|
|
|
|
To correctly implement percent done,
|
|
|
|
the main program should pass information to subsidiary programs
|
|
|
|
(perhaps as command-line arguments) the starting and ending
|
|
|
|
fractions for that program.
|
2002-07-31 05:59:43 +00:00
|
|
|
<p>
|
|
|
|
The coordinator must call
|
|
|
|
<pre>
|
|
|
|
boinc_child_start();
|
|
|
|
</pre>
|
|
|
|
prior to forking a child process.
|
|
|
|
When the child is done, the coordinator
|
|
|
|
must get the child's CPU time, then call
|
|
|
|
<pre>
|
|
|
|
boinc_child_done(double total_CPU);
|
|
|
|
</pre>
|
|
|
|
before forking the next child process.
|
2002-07-30 18:06:39 +00:00
|
|
|
|
|
|
|
|
|
|
|
<hr>
|
|
|
|
<h3>Implementation</h3>
|
|
|
|
<p>
|
2002-07-31 05:59:43 +00:00
|
|
|
Application are executed in separate "catbox" directories,
|
|
|
|
allowing them to create and use temporary files without name conflicts.
|
|
|
|
Input and output files are kept outside the catbox.
|
|
|
|
The mappings from virtual to physical filenames use
|
|
|
|
"symbolic link" files in the catbox directory.
|
2002-07-30 18:06:39 +00:00
|
|
|
The name of such a file is the virtual name,
|
|
|
|
and it contains an XML tag with the physical name.
|
|
|
|
This scheme is necessary because of the lack of filesystem links
|
|
|
|
in Windows.
|
|
|
|
|
|
|
|
<p>
|
|
|
|
Communication between the core client and applications
|
2002-07-31 05:59:43 +00:00
|
|
|
is done through XML files in the catbox directory.
|
2002-07-30 18:06:39 +00:00
|
|
|
Several files are used.
|
|
|
|
<p>
|
|
|
|
<b>Files created by the core client, read by the app:</b>
|
2002-07-31 05:59:43 +00:00
|
|
|
(Once, at start of app)
|
2002-07-30 18:06:39 +00:00
|
|
|
<ul>
|
2002-07-31 05:59:43 +00:00
|
|
|
<li> Symbolic link files
|
|
|
|
<li> <b>fd_init.xml</b>:
|
2002-07-30 18:06:39 +00:00
|
|
|
specifies the mappings of file descriptors (stdin/stdout/stderr)
|
|
|
|
to physical files.
|
|
|
|
|
2002-07-31 05:59:43 +00:00
|
|
|
<li> <b>init_data.xml</b>: this contains the initialization data
|
|
|
|
returned by <tt>boinc_init()</tt> (see above),
|
|
|
|
as well as the minimum checkpoint period.
|
2002-07-30 18:06:39 +00:00
|
|
|
</ul>
|
|
|
|
<p>
|
2002-07-31 05:59:43 +00:00
|
|
|
<b>Files created by the API implementation, read by the core client:</b>
|
2002-07-30 18:06:39 +00:00
|
|
|
<ul>
|
|
|
|
<li>
|
2002-07-31 05:59:43 +00:00
|
|
|
<b>percent_done.xml</b>:
|
|
|
|
contains the WU percent done.
|
|
|
|
Written by the timer routine as needed.
|
2002-07-30 18:06:39 +00:00
|
|
|
|
2002-07-31 05:59:43 +00:00
|
|
|
<b>checkpoint_cpu.xml</b>
|
|
|
|
CPU time (from start of WU) at last checkpoint.
|
|
|
|
Written by checkpoint_completed.
|
2002-07-29 19:01:38 +00:00
|
|
|
|
2002-07-30 18:06:39 +00:00
|
|
|
</ul>
|
|
|
|
<p>
|
2002-07-31 05:59:43 +00:00
|
|
|
The API implementation uses a timer (60Hz);
|
|
|
|
the real-time clock is not available to applications.
|
|
|
|
This timer is used for several purposes:
|
|
|
|
<ul>
|
|
|
|
<li> To tell the app when to checkpoint;
|
|
|
|
<li> To regenerate the percent done file
|
|
|
|
<li> To refresh graphics
|
|
|
|
</ul>
|