Software-level Fault Tolerant Framework for Task-based Applications