static int Turbine_Init_Cmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { TCL_ARGS(4); int amserver, rank, size; get_tcl_version(); int rc; rc = Tcl_GetIntFromObj(interp, objv[1], &amserver); TCL_CHECK(rc); rc = Tcl_GetIntFromObj(interp, objv[2], &rank); TCL_CHECK(rc); rc = Tcl_GetIntFromObj(interp, objv[3], &size); TCL_CHECK(rc); turbine_code code = turbine_init(amserver, rank, size); if (code != TURBINE_SUCCESS) { Tcl_AddErrorInfo(interp, " Could not initialize Turbine!\n"); return TCL_ERROR; } log_setup(rank); return TCL_OK; }
static int Turbine_Cache_Retrieve_Cmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { TCL_ARGS(2); turbine_datum_id td; const char *subscript; size_t subscript_len; int error = ADLB_EXTRACT_HANDLE(objv[1], &td, &subscript, &subscript_len); TCL_CHECK(error); // TODO: handle caching subscripts TCL_CONDITION(subscript_len == 0, "Don't handle caching subscripts"); turbine_type type; void* data; size_t length; turbine_code rc = turbine_cache_retrieve(td, &type, &data, &length); TURBINE_CHECK(rc, "cache retrieve failed: %"PRId64"", td); Tcl_Obj* result = NULL; int tcl_code = adlb_datum2tclobj(interp, objv, td, type, ADLB_TYPE_EXTRA_NULL, data, length, &result); TCL_CHECK(tcl_code); Tcl_SetObjResult(interp, result); return TCL_OK; }
/* turbine::coaster_register Register coaster executor if enabled */ static int Coaster_Register_Cmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { TCL_ARGS(1); #if HAVE_COASTER == 1 turbine_code tc; tc = coaster_executor_register(); TCL_CONDITION(tc == TURBINE_SUCCESS, "Could not register Coaster executor"); coaster_log_level threshold = COASTER_LOG_WARN; // Turn on debugging based on debug tokens. if (turbine_debug_enabled) { #ifdef ENABLE_DEBUG_COASTER // Only enable detailed debugging if coaster debugging on threshold = COASTER_LOG_DEBUG; #else threshold = COASTER_LOG_INFO; #endif } coaster_rc crc = coaster_set_log_threshold(threshold); TCL_CONDITION(crc == COASTER_SUCCESS, "Could not set log threshold"); #endif return TCL_OK; }
/* usage: async_exec_names Return list of names of registered async executors */ static int Async_Exec_Names_Cmd(ClientData cdata, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { TCL_ARGS(1); turbine_code tc; const int names_size = TURBINE_ASYNC_EXEC_LIMIT; const char *names[names_size]; int n; tc = turbine_async_exec_names(names, names_size, &n); TCL_CONDITION(tc == TURBINE_SUCCESS, "Error enumerating executors"); assert(n >= 0 && n <= names_size); Tcl_Obj * name_objs[n]; for (int i = 0; i < n; i++) { const char *exec_name = names[i]; assert(exec_name != NULL); name_objs[i] = Tcl_NewStringObj(exec_name, -1); TCL_CONDITION(name_objs[i] != NULL, "Error allocating string"); } Tcl_SetObjResult(interp, Tcl_NewListObj(n, name_objs)); return TCL_OK; }
static int Turbine_Cache_Check_Cmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { TCL_ARGS(2); turbine_datum_id td; const char *subscript; size_t subscript_len; int error = ADLB_EXTRACT_HANDLE(objv[1], &td, &subscript, &subscript_len); TCL_CHECK(error); bool found; if (subscript_len == 0) { found = turbine_cache_check(td); } else { // TODO: handle caching subscripts - currently just ignore found = false; } Tcl_Obj* result = Tcl_NewBooleanObj(found); Tcl_SetObjResult(interp, result); return TCL_OK; }
static int Python_Eval_Cmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { TCL_ARGS(4); return turbine_user_errorv(interp, "Turbine not compiled with Python support"); }
static int Turbine_Normalize_Cmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { TCL_ARGS(1); log_normalize(); return TCL_OK; }
/* turbine::toint_impl <string> Convert decimal string to wide integer */ static int Turbine_ToIntImpl_Cmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { TCL_ARGS(2); return Turbine_ParseInt_Impl(cdata, interp, objv, objv[1], 10); }
static int Turbine_Debug_On_Cmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { TCL_ARGS(1); bool enabled = turbine_debug_enabled; Tcl_SetObjResult(interp, Tcl_NewIntObj(enabled)); return TCL_OK; }
int Turbine_TaskComm_Cmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { TCL_ARGS(1); Tcl_Obj* result = Tcl_NewLongObj(turbine_task_comm); Tcl_SetObjResult(interp, result); return TCL_OK; }
/* Initialises Turbine debug logging. turbine::init_debug */ static int Turbine_Init_Debug_Cmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { TCL_ARGS(1); turbine_debug_init(); return TCL_OK; }
static int Turbine_Log_Cmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { TCL_ARGS(2); log_printf("%s", Tcl_GetString(objv[1])); return TCL_OK; }
/* turbine::noop_exec_register */ static int Noop_Exec_Register_Cmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { TCL_ARGS(1); turbine_code tc; tc = noop_executor_register(); TCL_CONDITION(tc == TURBINE_SUCCESS, "Could not register noop executor"); return TCL_OK; }
/* turbine::parse_int_impl <string> <base> Convert string in any base to wide integer */ static int Turbine_ParseIntImpl_Cmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { TCL_ARGS(3); int base; int rc = Tcl_GetIntFromObj(interp, objv[2], &base); TCL_CHECK(rc); TCL_CONDITION(base >= 1, "Base must be positive: %i", base); return Turbine_ParseInt_Impl(cdata, interp, objv, objv[1], base); }
static int Turbine_Version_Cmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { TCL_ARGS(1); version v; turbine_version(&v); char vs[8]; version_to_string(vs, &v); Tcl_Obj* result = Tcl_NewStringObj(vs, -1); assert(result); Tcl_SetObjResult(interp, result); return TCL_OK; }
static int Python_Eval_Cmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { TCL_ARGS(4); int rc; int persist; rc = Tcl_GetBooleanFromObj(interp, objv[1], &persist); TCL_CHECK_MSG(rc, "first arg should be integer!"); char* code = Tcl_GetString(objv[2]); char* expression = Tcl_GetString(objv[3]); Tcl_Obj* result = NULL; rc = python_eval(persist, code, expression, &result); TCL_CHECK(rc); Tcl_SetObjResult(interp, result); return TCL_OK; }
static int Turbine_Debug_Cmd(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { TCL_ARGS(2); if (turbine_debug_enabled) { unused char* msg = Tcl_GetString(objv[1]); DEBUG_TCL_TURBINE("%s", msg); return TCL_OK; } else { return TCL_OK; } }
/* usage: async_exec_configure <executor name> <config string> Configure registered executor. */ static int Async_Exec_Configure_Cmd(ClientData cdata, Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]) { TCL_ARGS(3); turbine_code tc; const char *exec_name = Tcl_GetString(objv[1]); int config_len; const char *config = Tcl_GetStringFromObj(objv[2], &config_len); turbine_executor *exec = turbine_get_async_exec(exec_name, NULL); TCL_CONDITION(exec != NULL, "Executor %s not registered", exec_name); tc = turbine_configure_exec(interp, exec, config, (size_t)config_len); TCL_CONDITION(tc == TURBINE_SUCCESS, "Could not configure executor %s", exec_name); return TCL_OK; }