Merge lp:~schnetter/pocl/main into lp:~pocl/pocl/trunk

Proposed by Erik Schnetter
Status: Merged
Merge reported by: Pekka Jääskeläinen
Merged at revision: not available
Proposed branch: lp:~schnetter/pocl/main
Merge into: lp:~pocl/pocl/trunk
Diff against target: 82 lines (+37/-7)
3 files modified
lib/CL/clCreateKernel.c (+2/-1)
lib/CL/clReleaseKernel.c (+24/-6)
lib/CL/clReleaseProgram.c (+11/-0)
To merge this branch: bzr merge lp:~schnetter/pocl/main
Reviewer Review Type Date Requested Status
pocl maintaners Pending
Review via email: mp+85726@code.launchpad.net

Description of the change

I corrected the memory allocation/freeing errors for programs and kernels.

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/CL/clCreateKernel.c'
2--- lib/CL/clCreateKernel.c 2011-12-08 02:44:08 +0000
3+++ lib/CL/clCreateKernel.c 2011-12-14 19:00:42 +0000
4@@ -22,6 +22,7 @@
5 */
6
7 #include "pocl_cl.h"
8+#include <string.h>
9 #include <unistd.h>
10 #include <sys/stat.h>
11 #include <unistd.h>
12@@ -111,7 +112,7 @@
13 POCL_ERROR(CL_OUT_OF_HOST_MEMORY);
14 }
15
16- kernel->function_name = kernel_name;
17+ kernel->function_name = strdup(kernel_name);
18 kernel->num_args = *(cl_uint *) lt_dlsym(dlhandle, "_num_args");
19 kernel->reference_count = 1;
20 kernel->context = program->context;
21
22=== modified file 'lib/CL/clReleaseKernel.c'
23--- lib/CL/clReleaseKernel.c 2011-12-08 02:44:08 +0000
24+++ lib/CL/clReleaseKernel.c 2011-12-14 19:00:42 +0000
25@@ -26,11 +26,29 @@
26 CL_API_ENTRY cl_int CL_API_CALL
27 clReleaseKernel(cl_kernel kernel) CL_API_SUFFIX__VERSION_1_0
28 {
29- /* TODO: Remove kernel from the program's linked list of kernels! */
30- /* TODO: Deallocate kernel arguments! */
31- /* In the mean time, we better don't free the kernel, but just make
32- it unusable... */
33- /*free(kernel);*/
34- memset(kernel, -1, sizeof *kernel);
35+ cl_kernel *pk;
36+
37+ if (kernel->program != NULL)
38+ {
39+ /* Find the kernel in the program's linked list of kernels */
40+ for (pk=&kernel->program->kernels; *pk != NULL; pk = &(*pk)->next)
41+ {
42+ if (*pk == kernel) break;
43+ }
44+ if (*pk == NULL)
45+ {
46+ /* The kernel is not on the kernel's program's linked list
47+ of kernels -- something is wrong */
48+ return CL_INVALID_VALUE;
49+ }
50+
51+ /* Remove the kernel from the program's linked list of
52+ kernels */
53+ *pk = (*pk)->next;
54+ }
55+
56+ free((char*)kernel->function_name);
57+ free(kernel);
58+
59 return CL_SUCCESS;
60 }
61
62=== modified file 'lib/CL/clReleaseProgram.c'
63--- lib/CL/clReleaseProgram.c 2011-10-14 10:31:27 +0000
64+++ lib/CL/clReleaseProgram.c 2011-12-14 19:00:42 +0000
65@@ -26,6 +26,17 @@
66 CL_API_ENTRY cl_int CL_API_CALL
67 clReleaseProgram(cl_program program) CL_API_SUFFIX__VERSION_1_0
68 {
69+ cl_kernel k;
70+
71+ /* Mark all kernels as having no program */
72+ for (k=program->kernels; k!=NULL; k=k->next)
73+ {
74+ k->program = NULL;
75+ }
76+
77+ free(program->source);
78+ free(program->binary);
79 free(program);
80+
81 return CL_SUCCESS;
82 }