00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 #ifndef EXTENT_H
00054 #define EXTENT_H
00055 
00056 #include "w_defines.h"
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 
00066 
00067 
00068 
00069 
00070 
00071 
00072 
00073 class extlink_t {
00074     
00075     Pmap_Align4        pmap;        
00076 public:
00077 
00078     extnum_t           next;        
00079 
00080     extnum_t           prev;        
00081 
00082     snum_t             owner;       
00083 
00084     uint4_t            pbucketmap; 
00085     
00086     
00087     
00088     
00089 
00090     static int       logged_size();
00091     NORET            extlink_t();
00092     NORET            extlink_t(const extlink_t& e);
00093     extlink_t&       operator=(const extlink_t&);
00094 
00095     void             clrall();
00096     void             setall();
00097     void             setmap(const Pmap &m);
00098     void             getmap(Pmap &m) const;
00099     void             set(int i);
00100     void             clr(int i);
00101     bool             is_set(int i) const;
00102     bool             is_clr(int i) const;
00103     int              first_set(int start) const;
00104     int              first_clr(int start) const;
00105     int              last_set(int start) const;
00106     int              last_clr(int start) const;
00107     int              num_set() const;
00108     int              num_clr() const;
00109 
00110     space_bucket_t         get_page_bucket(int i)const;
00111 
00112     friend ostream& operator<<(ostream &, const extlink_t &e);
00113 };
00114 
00115 inline NORET
00116 extlink_t::extlink_t(const extlink_t& e) 
00117 : pmap(e.pmap),
00118   next(e.next),
00119   prev(e.prev),
00120   owner(e.owner),
00121   pbucketmap(e.pbucketmap)
00122 {
00123     
00124     w_assert9(w_offsetof(extlink_t, pmap) == 0);
00125 }
00126 
00127 inline extlink_t& 
00128 extlink_t::operator=(const extlink_t& e)
00129 {
00130     pmap = e.pmap;
00131     prev = e.prev;
00132     next = e.next; 
00133     owner = e.owner;
00134     pbucketmap = e.pbucketmap;
00135     return *this;
00136 }
00137 inline void 
00138 extlink_t::setmap(const Pmap &m)
00139 {
00140     pmap = m;
00141 }
00142 inline void 
00143 extlink_t::getmap(Pmap &m) const
00144 {
00145     m = pmap;
00146     DBGTHRD(<<"getmap " << m);
00147 }
00148 
00149 inline void 
00150 extlink_t::clrall()
00151 {
00152     pmap.clear_all();
00153 }
00154 
00155 inline void 
00156 extlink_t::setall()
00157 {
00158     pmap.set_all();
00159 }
00160 
00161 inline void 
00162 extlink_t::set(int i)
00163 {
00164     pmap.set(i);
00165 }
00166 
00167 inline void 
00168 extlink_t::clr(int i)
00169 {
00170     pmap.clear(i);
00171 }
00172 
00173 inline bool 
00174 extlink_t::is_set(int i) const
00175 {
00176     w_assert9(i < smlevel_0::ext_sz);
00177     return pmap.is_set(i);
00178 }
00179 
00180 inline bool 
00181 extlink_t::is_clr(int i) const
00182 {
00183     return (! is_set(i));
00184 }
00185 
00186 inline int extlink_t::first_set(int start) const
00187 {
00188     return pmap.first_set(start);
00189 }
00190 
00191 inline int 
00192 extlink_t::first_clr(int start) const
00193 {
00194     return pmap.first_clear(start);
00195 }
00196 
00197 inline int 
00198 extlink_t::last_set(int start) const
00199 {
00200     return pmap.last_set(start);
00201 }
00202 
00203 inline int 
00204 extlink_t::last_clr(int start) const
00205 {
00206     return pmap.last_clear(start);
00207 }
00208 
00209 inline int 
00210 extlink_t::num_set() const
00211 {
00212     return pmap.num_set();
00213 }
00214 
00215 inline int 
00216 extlink_t::num_clr() const
00217 {
00218     return pmap.num_clear();
00219 }
00220 
00221 
00222 
00223 
00224 
00225 
00226 
00227 
00228 
00229 class extlink_p : public page_p {
00230 public:
00231     MAKEPAGE(extlink_p, page_p, 2); 
00232     
00233 
00234     
00235     enum { max = data_sz / sizeof(extlink_t) };
00236 
00237     const extlink_t& get_const(slotid_t idx);
00238     extlink_t&       get_nonconst(slotid_t idx);
00239     void             put(slotid_t idx, const extlink_t& e);
00240     w_rc_t           set_byte(slotid_t idx, u_char bits, 
00241                           enum page_p::logical_operation);
00242     w_rc_t           set_bytes(slotid_t idx,
00243                           smsize_t    offset,
00244                           smsize_t     count,
00245                           const uint1_t* bits, 
00246                           enum page_p::logical_operation);
00247     void             clr_pmap_bit(slotid_t idx, int bit); 
00248     static bool      on_same_page(extnum_t e1, extnum_t e2);
00249 
00250 private:
00251     extlink_t&             item(int i);
00252 
00253     struct layout_t {
00254     extlink_t             item[max];
00255     };
00256 
00257     
00258     friend class page_link_log;        
00259     friend class extlink_i;        
00260 };
00261 
00262 inline bool
00263 extlink_p::on_same_page(extnum_t e1, extnum_t e2)
00264 {
00265     shpid_t p1 = e1 / (extlink_p::max);
00266     shpid_t p2 = e2 / (extlink_p::max);
00267     return (p1 == p2);
00268 }
00269 
00270 inline extlink_t&
00271 extlink_p::item(int i)
00272 {
00273     w_assert9(i < max);
00274     return ((layout_t*)tuple_addr(0))->item[i];
00275 }
00276 
00277 
00278 inline extlink_t&
00279 extlink_p::get_nonconst(slotid_t idx) 
00280 {
00281     return item(idx);
00282 }
00283 inline const extlink_t&
00284 extlink_p::get_const(slotid_t idx) 
00285 {
00286     return item(idx);
00287 }
00288 
00289 inline int
00290 extlink_t::logged_size() {
00291     
00292     
00293     
00294     
00295     
00296     return w_offsetof(extlink_t, pbucketmap);
00297 }
00298 
00299 inline void
00300 extlink_p::put(slotid_t idx, const extlink_t& e)
00301 {
00302     DBG(<<"extlink_p::put(" <<  idx << " owner=" <<
00303     e.owner << ", " << e.next << ")");
00304     const vec_t    extent_vec_tmp(&e, extlink_t::logged_size());
00305     W_COERCE(overwrite(0, idx * sizeof(extlink_t), extent_vec_tmp));
00306 }
00307 
00308 
00309 
00310 
00311 
00312 
00313 
00314 
00315 
00316 struct stnode_t {
00317 
00318     extnum_t                 head; 
00319 
00320     w_base_t::uint2_t        eff;
00321 
00322     w_base_t::uint2_t        flags;
00323 
00324     w_base_t::uint2_t        deleting; 
00325 
00326     fill2                    filler; 
00327 };
00328 
00329 
00330 
00331 
00332 
00333 
00334 
00335 class stnode_p : public page_p {
00336     public:
00337     MAKEPAGE(stnode_p, page_p, 1);
00338 
00339     
00340     enum { max = data_sz / sizeof(stnode_t) };
00341 
00342     const stnode_t&       get(slotid_t idx);
00343     rc_t                  put(slotid_t idx, const stnode_t& e);
00344 
00345     private:
00346     stnode_t&             item(snum_t i);
00347     struct layout_t {
00348         stnode_t          item[max];
00349     };
00350 
00351     friend class page_link_log;        
00352     friend class stnode_i;        
00353 };    
00354 
00355 inline stnode_t&
00356 stnode_p::item(snum_t i)
00357 {
00358     w_assert9(i < max);
00359     return ((layout_t*)tuple_addr(0))->item[i];
00360 }
00361 
00362 inline const stnode_t&
00363 stnode_p::get(slotid_t idx)
00364 {
00365     return item(idx);
00366 }
00367 
00368 inline w_rc_t 
00369 stnode_p::put(slotid_t idx, const stnode_t& e)
00370 {
00371     const vec_t stnode_vec_tmp(&e, sizeof(e));
00372     W_DO(overwrite(0, idx * sizeof(stnode_t), stnode_vec_tmp));
00373     return RCOK;
00374 }
00375 
00376 
00377 
00378 
00379 
00380 
00381 
00382 class extlink_i {
00383 public:
00384     NORET            extlink_i(const lpid_t& root)
00385                     : 
00386                     _root(root) {
00387                         
00388                         w_assert1(root.page >= 1);
00389                     }
00390             
00391     bool             on_same_root(extnum_t idx);
00392     
00393     lpid_t           get_pid(extnum_t idx) const;
00394     rc_t             get_const(extnum_t idx, const extlink_t* &);
00395     rc_t             get_nonconst(extnum_t idx, extlink_t* &);
00396     rc_t             get_copy_SH(extnum_t idx, extlink_t &);
00397     rc_t             get_copy_EX(extnum_t idx, extlink_t &);
00398     rc_t             put(extnum_t idx, const extlink_t&);
00399     bool             on_same_page(extnum_t ext1, extnum_t ext2) const ;
00400 
00401     rc_t             update_histo(extnum_t ext,     
00402                         int    offset,
00403                         space_bucket_t bucket);
00404     rc_t             fix_EX(extnum_t idx);
00405     void             unfix();
00406     rc_t             set_pmap_bits(snum_t snum, extnum_t idx, const Pmap &bits);
00407     rc_t             clr_pmap_bit(snum_t snum, extnum_t idx, int bit);
00408 
00409     rc_t             clr_pmap_bits(snum_t snum, extnum_t idx, const Pmap &bits);
00410     rc_t             set_next(extnum_t ext, extnum_t new_next, bool log_it = true);
00411     const extlink_p& page() const { return _page; } 
00412 
00413 private:
00414     extid_t             _id;
00415     lpid_t              _root;
00416     extlink_p           _page;
00417 
00418     inline w_rc_t       update_pmap(extnum_t idx,
00419                             const Pmap &pmap,
00420                             page_p::logical_operation how);
00421     inline w_rc_t       update_pbucketmap(extnum_t idx,
00422                             uint4_t map,
00423                             page_p::logical_operation how);
00424 };
00425 
00426 
00427 
00428 
00429 
00430 
00431 
00432 
00433 
00434 
00435 
00436 
00437 
00438 
00439 
00440 
00441 class stnode_i: private smlevel_0 {
00442 public:
00443     NORET               stnode_i(const lpid_t& root) : _root(root) {
00444                              
00445                              
00446                              w_assert1(root.page >= 1);
00447                         };
00448     w_rc_t              get(snum_t idx, stnode_t &stnode);
00449     w_rc_t              get(snum_t idx, const stnode_t *&stnode);
00450     w_rc_t              put(snum_t idx, const stnode_t& stnode);      
00451     w_rc_t              store_operation(const store_operation_param & op);
00452 private:
00453     lpid_t              _root;
00454     stnode_p            _page;
00455 };
00456 
00457 
00458 
00459 
00460 #endif