|
|
|
@ -681,7 +681,8 @@ int hc_mtlCreateCommandQueue (void *hashcat_ctx, mtl_device_id metal_device, mtl
|
|
|
|
|
|
|
|
|
|
int hc_mtlCreateKernel (void *hashcat_ctx, mtl_device_id metal_device, mtl_library metal_library, const char *func_name, mtl_function *metal_function, mtl_pipeline *metal_pipeline)
|
|
|
|
|
{
|
|
|
|
|
backend_ctx_t *backend_ctx = ((hashcat_ctx_t *) hashcat_ctx)->backend_ctx;
|
|
|
|
|
backend_ctx_t *backend_ctx = ((hashcat_ctx_t *) hashcat_ctx)->backend_ctx;
|
|
|
|
|
user_options_t *user_options = ((hashcat_ctx_t *) hashcat_ctx)->user_options;
|
|
|
|
|
|
|
|
|
|
MTL_PTR *mtl = (MTL_PTR *) backend_ctx->mtl;
|
|
|
|
|
|
|
|
|
@ -708,7 +709,7 @@ int hc_mtlCreateKernel (void *hashcat_ctx, mtl_device_id metal_device, mtl_libra
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NSError *error = nil;
|
|
|
|
|
__block NSError *error = nil;
|
|
|
|
|
|
|
|
|
|
NSString *f_name = [NSString stringWithCString: func_name encoding: NSUTF8StringEncoding];
|
|
|
|
|
|
|
|
|
@ -721,6 +722,9 @@ int hc_mtlCreateKernel (void *hashcat_ctx, mtl_device_id metal_device, mtl_libra
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// workaround for MTLCompilerService 'Infinite Loop' bug
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
mtl_pipeline mtl_pipe = [metal_device newComputePipelineStateWithFunction: mtl_func error: &error];
|
|
|
|
|
|
|
|
|
|
if (error != nil)
|
|
|
|
@ -729,6 +733,46 @@ int hc_mtlCreateKernel (void *hashcat_ctx, mtl_device_id metal_device, mtl_libra
|
|
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
error = nil;
|
|
|
|
|
|
|
|
|
|
__block mtl_pipeline mtl_pipe;
|
|
|
|
|
|
|
|
|
|
dispatch_group_t group = dispatch_group_create ();
|
|
|
|
|
dispatch_queue_t queue = dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
|
|
|
|
|
|
|
|
|
|
// wait for 60 secs by default or using user-defined runtime if is set
|
|
|
|
|
long timeout = (user_options->runtime > 0) ? user_options->runtime : 60;
|
|
|
|
|
|
|
|
|
|
dispatch_time_t when = dispatch_time (DISPATCH_TIME_NOW,NSEC_PER_SEC * timeout);
|
|
|
|
|
|
|
|
|
|
__block int rc_async_err = 0;
|
|
|
|
|
|
|
|
|
|
dispatch_group_async (group, queue, ^(void)
|
|
|
|
|
{
|
|
|
|
|
mtl_pipe = [metal_device newComputePipelineStateWithFunction: mtl_func error: &error];
|
|
|
|
|
|
|
|
|
|
if (error != nil)
|
|
|
|
|
{
|
|
|
|
|
event_log_error (hashcat_ctx, "%s(): failed to create '%s' pipeline, %s", __func__, func_name, [[error localizedDescription] UTF8String]);
|
|
|
|
|
|
|
|
|
|
rc_async_err = -1;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
long rc_queue = dispatch_group_wait (group, when);
|
|
|
|
|
|
|
|
|
|
dispatch_release (group);
|
|
|
|
|
|
|
|
|
|
if (rc_async_err != 0) return -1;
|
|
|
|
|
|
|
|
|
|
if (rc_queue != 0)
|
|
|
|
|
{
|
|
|
|
|
event_log_error (hashcat_ctx, "%s(): failed to create '%s' pipeline, timeout reached (status %ld)", __func__, func_name, rc_queue);
|
|
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mtl_pipe == nil)
|
|
|
|
|
{
|
|
|
|
|