data->mcm_data)) == NULL)
continue;
+ /*
+ * Note regarding putting the method in stores:
+ *
+ * we don't need to care if it actually got in or not here.
+ * If it didn't get in, it will simply not be available when
+ * ossl_method_construct() tries to get it from the store.
+ *
+ * It is *expected* that the put function increments the refcnt
+ * of the passed method.
+ */
+
if (data->force_store || !no_store) {
/*
* If we haven't been told not to store,
* add to the global store
*/
- if (!data->mcm->put(data->libctx, NULL,
- thismap->property_definition,
- method, data->mcm_data)) {
- data->mcm->destruct(method, data->mcm_data);
- continue;
- }
+ data->mcm->put(data->libctx, NULL,
+ thismap->property_definition,
+ method, data->mcm_data);
}
- if (!data->mcm->put(data->libctx, data->store,
- thismap->property_definition,
- method, data->mcm_data)) {
- data->mcm->destruct(method, data->mcm_data);
- continue;
- }
+ data->mcm->put(data->libctx, data->store,
+ thismap->property_definition,
+ method, data->mcm_data);
+
+ /* refcnt-- because we're dropping the reference */
+ data->mcm->destruct(method, data->mcm_data);
}
return 1;
C<mcm> and the data in C<mcm_data> (which is passed by
ossl_method_construct()).
+This function assumes that the sub-system method creator implements
+reference counting and acts accordingly (i.e. it will call the
+sub-system destruct() method to decrement the reference count when
+appropriate).
+
=head2 Structures
A central part of constructing a sub-system specific method is to give
(which is the C<mcm_data> that was passed to ossl_construct_method())
and the provided property query C<propquery>.
+This function is expected to increment the method's reference count.
+
=item put()
Places the C<method> created by the construct() function (see below)
C<propdef> and any identification data given through C<data> (which is
the C<mcm_data> that was passed to ossl_construct_method()).
+This function is expected to increment the C<method>'s reference count.
+
=item construct()
Constructs a sub-system method given a dispatch table C<fns>.
If such a reference is kept, the I<provider object> reference counter
must be incremented, using ossl_provider_upref().
+This function is expected to set the method's reference count to 1.
+
=item desctruct()
-Destruct the given C<method>.
+Decrement the C<method>'s reference count, and destruct it when
+the reference count reaches zero.
=back