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 separately.
int boinc_init();before calling other BOINC functions or doing I/O. It may call
struct APP_INIT_DATA { char project_preferences[4096]; char user_name[256]; char team_name[256]; double wu_cpu_time; // cpu time from previous sessions double total_cobblestones; double recent_avg_cobblestones; }; int boinc_get_init_data(APP_INIT_DATA&);to get the following information:
These items might be used by the application in its graphics. At any time it may call
double boinc_cpu_time();to get its current CPU time.
When the application has completed it must call
int boinc_finish(int status);status is nonzero if an error was encountered.
int boinc_resolve_filename(char *logical_name, char *physical_name);to convert logical file names to physical names. For example, instead of
f = fopen("my_file", "r");the application might use
char resolved_name[256]; retval = boinc_resolve_filename("my_file", resolved_name); if (retval) fail("can't resolve filename"); f = fopen(resolved_name, "r");boinc_resolve_filename() doesn't need to be used for temporary files.
Do use checkpoint, an application should write to output and state files using the MFILE class.
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 size, size_t nitems); int close(); int flush(); };MFILE buffers data in memory and writes to disk only on flush() or close(). 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
bool boinc_time_to_checkpoint();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
void boinc_checkpoint_completed();A call to boinc_time_to_checkpoint() is extremely fast, so there is little penalty in calling it frequently.
boinc_fraction_done(double fraction_done);The fraction_done argument is a rough estimate of the workunit fraction complete (0 to 1). This function is extremely fast and can be called often.
Each program should have its own state file; the state file of the coordinator program records which subsidiary program was last active.
To correctly implement fraction done, the main program should pass information to subsidiary programs (perhaps as command-line arguments) indicating the starting and ending fractions for that program.
The coordinator must call
void boinc_child_start();prior to forking a child process. When the child is done, the coordinator must get the child's CPU time, then call
void boinc_child_done(double total_cpu);before forking the next child process.